HI 各位大大好
想問問,我有一個controller同時支援[HttpPost]和[HttpGet]
但我使用FromBody的時候,GET的方法就進不來這個controller了ˊˋ
想問問有什麼解法QQ
程式大概是長這樣
[HttpPost]
[HttpGet]
public IActionResult doProcessing([FromBody] object request)
{
...
}
如果不放[FromBody] object request
的話
變成我要額外處理request的body
會導致效能變很慢ˊˋ
但我使用FromBody的時候,GET的方法就進不來這個controller了ˊˋ
請參考:[ASP.NET] WebAPI Get 使用複雜型別
FromBody指的是「從HTTP Request Body取得資料」
一般的GET方法,你可以發現參數會被加在網址後面,以此形式取得資料被稱為FromUri,瀏覽器&伺服器處理上是將其定位為「網站位址+參數,取得唯一資源」
而POST、PUT等方法,因為並不是安全方法,所以需要從Request定義資料並進行處理,這時取得資料的形式就被稱為FromBody(關於安全方法、等冪方法等介紹,請參考:重新認識HTTP請求方法 by 良葛格)
如果不放[FromBody] object request的話
變成我要額外處理request的body
會導致效能變很慢ˊˋ
效能變慢有很多原因,在我看來將參數定義為object也會是原因之一(編譯器無法明確定義此物件),如果要解決這個問題,你有幾種解法:
1.不掛Attributes,改在Action中抓取Method資料並處理
public IActionResult doProcessing([FromBody] object request)
{
string method = HttpContext.Request.HttpMethod;
return View();
}
2.若你的GET及POST用途不同,可使用多載的形式:
[HttpGet]
public IActionResult doProcessing()
{
}
[HttpPost]
public IActionResult doProcessing([FromBody] object request)
{
}
HI 打狗松鼠 你好
效能變慢有很多原因,在我看來將參數定義為object也會是原因之一
會定義成object是因為我也沒有辦法明確定義物件,因為這是一個middleware,取得一串json string之後就會再往後端拋,並沒有固定的物件格式ˊˋ
GET及POST用途不同
基本上處理的內容是相同的,都是把資料往後丟,所以才想說要寫在一起,本來是沒有傳參數,而是掛attribute處理body的部分,attribute處理body大致程式碼如下
request.EnableRewind();
using (StreamReader reader = new StreamReader(request.Body))
{
string text = reader.ReadToEnd();
return text;
}
但壓力測試失敗了,資料流太大的時候會timeout,處理的時間過久...
有時,該思考的不是從程式處理。而是從流程處理。
我只給這句話。
這是經驗之談,推!
有些時候,我的客戶來電要我幫她弄一段程式時,我經常會問:『如果沒有電腦的時候,您會怎麼做?』
很常發生的是,經過流程檢討之後,發現根本不應該這麼做,也就沒有所謂程式怎麼寫的問題。
【知其然,更應知其所以然】
ice bear您好
其實在HTTP Method裡面,本就不該讓GET去處理「會改動資料的程式邏輯」,定義上來說GET是安全方法,以小的經驗來說,會更動資料的部份至少都該定義為POST,POST既不是安全方法,也不是等冪方法,會迫使RD必須謹慎處理經POST與後端溝通的資料
另外,GET方法也有被Ajax Attack的風險(當然不是說POST沒有風險,但至少不會有像GET一樣改個Uri就直接放行的低級錯誤),所以業界習慣都是開POST Method
1.改用[FromBody]時,呼叫遠端API的方式也要跟著改變。
2.使用[FromBody]時,所有傳遞的資料是要放在 Request body內的,不能放在url上。