我遇到了無法使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();
}
不應該添加[FromBody](https://stackoverflow.com/questions/24625303/why-do-we-have-to-specify-frombody-and-fromuri-in-asp-net-web -api)屬性? –
您提到過*表單*然後討論了* Json *。你想做什麼?同時告訴我們你是如何試圖從瀏覽器發佈這個模型的。 –
另外,**從不**在相同的應用程序中爲[此原因]啓用CORS兩次(https://stackoverflow.com/a/36968863/3670737)。在Web Api **或OR **中啓用它,而不是兩者。 –