使用WebApi v1启用CORS

时间:2015-07-17 20:23:19

标签: asp.net-web-api cors

过去,我能够使用控制器中的以下代码在WebApi v1中超越CORS限制。我没有选择升级到WebApi 2,如果可能的话,我更喜欢不使用其他库。

注释控制器的类:

  public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
  {
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Response != null)
            actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

        base.OnActionExecuted(actionExecutedContext);
    }
  }

  //annotated controller
  [AllowCrossSiteJson]
  public class UserController : ApiController
  {

现在这不起作用所以我按照其他stackoverflow帖子

的建议将以下内容添加到web.config中
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>

我在通话过程中仍然收到OPTIONS 405错误。我可以看到预期的响应标题......:

  Access-Control-Allow-Origin:*

我不确定还有什么可以尝试。

[UPDATE] 感谢@ Samuels的建议,我能够解决我的问题。我现在采取了天真的路线。这是一个“天真”的解决方案,因为它盲目地为所有请求(OPTIONS类型)发送200状态。更好的解决方案是创建一个消息处理程序。这是对那些感兴趣的人的快速解决方案。

  [AcceptVerbs("OPTIONS")]
  public HttpResponseMessage OPTIONS()
  {
         var response = new HttpResponseMessage();
         response.StatusCode = HttpStatusCode.OK;
         response.Headers.Add("Access-Control-Allow-Methods", "GET,POST,DELETE");
         response.Headers.Add("Access-Control-Allow-Headers", "Content-Type");
         return response;
     }

1 个答案:

答案 0 :(得分:1)

您正在进行的更改正在设置Access-Control-Allow-Origin标头。这是CORS的一部分,但它与OPTIONS请求无关。所有标题都指示浏览器任何来源可以向您的服务器发出请求并读取请求。您的应用程序必须明确处理OPTIONS请求。 HTTP 405表示您的应用程序不是处理该请求。处理OPTIONS请求的简单方法是返回HTTP 200响应。

[AcceptVerbs("OPTIONS")]
public HttpResponseMessage Options()
{
    var resp = new HttpResponseMessage(HttpStatusCode.OK);
    resp.Headers.Add("Access-Control-Allow-Origin", "*");
    resp.Headers.Add("Access-Control-Allow-Methods", "GET,DELETE");

    return resp;
}

请参阅this guide,了解控制器中的OPTIONS请求。