2016-08-19 226 views
2

我收到了這樣的請求。WebAPI [FromBody] always null

POST /API/Event?EventID=15&UserID=1&Severity=5&DeptID=1&FlowTag=CE HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
Host: localhost:8088 
Content-Length: 9 
Expect: 100-continue 
Connection: Keep-Alive 


HTTP/1.1 100 Continue 


Desc=test 

而我的WebAPI界面是這樣的:

[Route("API/Event"), HttpPost] 
public IHttpActionResult StationCreateWorkItem(long EventID, long UserID, int Severity, 
    long DeptID, string FlowTag, [FromBody] string Desc) 

然而,我的DESC參數始終是NULL。如果我無法使用WebAPI(OWIN)中的[FromBody],我可以知道如何檢索主體內容。我很抱歉,由於它是由其他公司開發的,我無法更改傳入消息。

+0

我已經發現一個替代的解決方案。我沒有使用「[FromBody]字符串描述」,而是改爲「[FromBody] FormDataCollection Datas」。並從表單體中檢索所有參數。希望稍後有人能推薦更好的解決方案。 –

回答

5

默認的Web API使用下列規則綁定參數:

  • 如果參數是一個「簡單」的類型,網絡API嘗試從URI中獲得的價值 。
  • 簡單類型包括.NET基元類型(int,bool,double和 等等),加上TimeSpan,DateTime,Guid,十進制和字符串,以及任何帶有可以從字符串轉換的類型轉換器的類型。
  • 對於複雜類型,Web API嘗試使用媒體類型格式化程序從消息 正文中讀取值。
  • 如果您在URI中有一個基本類型,或者如果您在主體中有一個複雜的 類型,那麼您不必添加任何屬性(不是 [FromBody]和[FromUri])。
  • 最多允許一個參數從消息體中讀取。所以 這是行不通的:

公共HttpResponseMessage郵報([FromBody] INT ID,[FromBody] 字符串名稱){...}

http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

https://blogs.msdn.microsoft.com/jmstall/2012/04/16/how-webapi-does-parameter-binding/

現在解決方案

POST /API/Event?EventID=15&UserID=1&Severity=5&DeptID=1&FlowTag=CE HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
Host: localhost:8088 
Content-Length: 9 
Expect: 100-continue 
Connection: Keep-Alive 


HTTP/1.1 100 Continue 

=test 

除去說明

+0

我在這裏找到http://aspnetwebstack.codeplex.com/discussions/359687 –

+0

感謝您的信息,但不幸的是我無法更改傳入的消息。因爲它是由另一方完成的。 –