最近在作一個工具,裏面有一個發起http請求的操做,雖然工具不是用.NET寫的,可是測試用服務器軟件是.NET寫的。在這裏選擇了ASP.NET MVC和Web API 2。
首先預約義Student與Human類,ASP.NET MVC定義了一個限定HttpPost的方法,要求傳遞一個Student對象。ASP.NET Web API 2 定義了一個限定HttpPost的方法,要求也是傳遞一個Student對象。json
public class Human { public string Name { get; set; } public Int32 Age { get; set; } } public class Student : Human { public String[] School { get; set; } }
[System.Web.Mvc.HttpPost] public dynamic Req(Student student) { if (student != null) { return student; } return new Student { Name = "Joe", Age = 23, School = new string[] { "Oracle" } }; } [HttpPost] public Student Req(Student student) { if (student != null) { return student; } return new Student { Name = "Joe", Age = 23, School = new string[] { "Oracle" } }; }
在工具裏向這兩個地址發起Post請求,頭部設置Content-Type爲application/json,正文爲Student對象的JSON序列化。服務器
而後在跟蹤的時候發現,Web API 2的Student對象一直爲Null,也就是Web API 2沒有拿到請求正文的對象。然而MVC是拿到了的。這個時候陷入了江局,MVC能拿到表明正文內容是發出去了的,序列化內容也是沒有問題的,可是Web API 2拿不到就說明請求還存在問題。app
在StackOverflow和一些亂七八糟的網站上看了半天,彷佛老是在圍繞[FromBody]
,事實上不論加不加我這都是Null。一直檢索彷佛也不是個事,索性直接對比ASP.NET MVC與ASP.NET Web API 2的請求信息,結果發現一個問題:工具
發送給Web API 2的請求的Content-Length是0,可是MVC的則是實際長度。聯想到在請求發起時的確沒有設定Content-Length,估計是MVC自動標準化了請求的信息,而Web API 2嚴格遵循http標準,當Content-Length爲0時便再也不處理正文內容。測試
因此若是須要寫代碼對Web API 2發起請求,請不要忘記設置Content-Length,不然會忽略掉正文內容。網站