iT邦幫忙

1

web api問題請教

HI 各位大大好

想問問,我有一個controller同時支援[HttpPost]和[HttpGet]
但我使用FromBody的時候,GET的方法就進不來這個controller了ˊˋ
想問問有什麼解法QQ

程式大概是長這樣

        [HttpPost]
        [HttpGet]
        public IActionResult doProcessing([FromBody] object request)
        {
        ...
        }

如果不放[FromBody] object request的話
變成我要額外處理request的body
會導致效能變很慢ˊˋ

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

4
打狗松鼠
iT邦新手 4 級 ‧ 2020-04-30 10:10:14

但我使用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)
{
}
看更多先前的回應...收起先前的回應...
ice bear iT邦新手 4 級 ‧ 2020-04-30 10:24:18 檢舉

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,處理的時間過久...

有時,該思考的不是從程式處理。而是從流程處理。
我只給這句話。

ckp6250 iT邦好手 1 級 ‧ 2020-04-30 11:42:51 檢舉

  這是經驗之談,推!

  有些時候,我的客戶來電要我幫她弄一段程式時,我經常會問:『如果沒有電腦的時候,您會怎麼做?』

  很常發生的是,經過流程檢討之後,發現根本不應該這麼做,也就沒有所謂程式怎麼寫的問題。

 【知其然,更應知其所以然】

ice bear您好
其實在HTTP Method裡面,本就不該讓GET去處理「會改動資料的程式邏輯」,定義上來說GET是安全方法,以小的經驗來說,會更動資料的部份至少都該定義為POST,POST既不是安全方法,也不是等冪方法,會迫使RD必須謹慎處理經POST與後端溝通的資料
另外,GET方法也有被Ajax Attack的風險(當然不是說POST沒有風險,但至少不會有像GET一樣改個Uri就直接放行的低級錯誤),所以業界習慣都是開POST Method

0
allenlwh
iT邦高手 1 級 ‧ 2020-04-30 10:17:27

1.改用[FromBody]時,呼叫遠端API的方式也要跟著改變。
2.使用[FromBody]時,所有傳遞的資料是要放在 Request body內的,不能放在url上。

https://ithelp.ithome.com.tw/upload/images/20200430/2003349377lqTzAMpS.jpg

我要發表回答

立即登入回答