Web API 2 對於 Content-Length 要求嚴格

最近在作一個工具,裏面有一個發起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,不然會忽略掉正文內容。網站

相關文章
相關標籤/搜索