2017-05-22 27 views
0

我遇到了無法使POST內容在Web API中按預期工作的問題。ASP.NET Web API無法從POST主體讀取

繼教程我應該能夠在控制器的路線,看起來像以下(表格1):

[Route("my-post-method")] 
public HttpResponseMessage MyPostMethod(MyModel model) 
{ 
    Request.CreateResponse(HttpStatus.OK, model.SomeNumber * 5); 
} 

但是,這是行不通的。相反,我必須做到以下幾點(表格2):

[Route("my-post-method")] 
public HttpResponseMessage MyPostMethod() 
{ 
    var text = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd(); 
    var model = JsonConvert.DeserializeObject<MyModel>(text); 
    Request.CreateResponse(HttpStatusCode.OK, model.SomeNumber * 5); 
} 

現在,我覺得有事情做與該項目的CORS設置,但我不知道。如果我試圖通過Postman提出請求,那麼一切都按照預期工作。如果我嘗試通過瀏覽器使請求成爲1,並且我沒有設置Content-Type頭部,我在POST請求中獲得了不受支持的媒體類型錯誤(這是我期望發生的),但是如果我設置了Content-Type頭到「application/json」,那麼Web API將在OPTIONS預檢請求上返回一個404響應。此外,向方法參數添加[FromBody]屬性不會執行任何操作。

在Web.config包含:

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 

和啓動配置類有:

public static void Register(HttpConfiguration config) 
{ 
    config.EnableCors(); 
    config.MapHttpAttributeRoutes(); 

    var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First(); 
    jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
    jsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; 
    jsonFormatter.SerializerSettings.Formatting = Formatting.Indented; 
    jsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); 

    config.EnsureInitialized(); 
} 
+0

不應該添加[FromBody](https://stackoverflow.com/questions/24625303/why-do-we-have-to-specify-frombody-and-fromuri-in-asp-net-web -api)屬性? –

+0

您提到過*表單*然後討論了* Json *。你想做什麼?同時告訴我們你是如何試圖從瀏覽器發佈這個模型的。 –

+0

另外,**從不**在相同的應用程序中爲[此原因]啓用CORS兩次(https://stackoverflow.com/a/36968863/3670737)。在Web Api **或OR **中啓用它,而不是兩者。 –

回答

0

看起來你需要裝飾用[EnableCors]屬性的方法,這裏記錄

https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api

來自郵遞員的請求do不需要像客戶端瀏覽器請求一樣的CORS。

+0

我使用了 var corsConfig = new EnableCorsAttribute(「*」,「Content-Type」,「GET,POST,PUT,PATCH,DELETE,OPTIONS」 ); config.EnableCors(corsConfig); 在啓動配置類,並從web.config中刪除CORS的東西。它似乎是導致問題的web.config的東西。 – user1806676