ASP.NET Web API无法从POST正文

时间:2017-05-22 14:33:53

标签: c# asp.net asp.net-web-api visual-studio-2013

我遇到了一个问题,我无法让POST内容在Web API中按预期工作。

在教程之后,我应该能够在控制器中拥有如下所示的路径(表单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的请求,一切都按预期工作。如果我尝试通过浏览器发出表单1的请求并且我没有设置Content-Type标头我在POST请求中得到了不支持的媒体类型错误(这是我期望发生的),但如果我将Content-Type标头设置为&#34; application / json&#34;然后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();
}

1 个答案:

答案 0 :(得分:0)

看起来您需要使用[EnableCors]属性修饰您的方法,如此处所述

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

邮递员的请求不需要像客户端浏览器请求那样的CORS。