WebAPI CORS - 为啥 OPTIONS 请求进入我的控制器?

Posted

技术标签:

【中文标题】WebAPI CORS - 为啥 OPTIONS 请求进入我的控制器?【英文标题】:WebAPI CORS - why is the OPTIONS request making its way into my Controller?WebAPI CORS - 为什么 OPTIONS 请求进入我的控制器? 【发布时间】:2014-08-06 20:59:58 【问题描述】:

我有 CORS 使用以下内容:

[System.Web.Http.HttpPut]
[System.Web.Http.AcceptVerbs("OPTIONS")]
[System.Web.Http.Route("api/exercise")]
public HttpResponseMessage UpdateExercise(Exercise exercise) 
    try 
        _adminService.UpdateExercise(exercise);
        return Request.CreateResponse(HttpStatusCode.OK, "Success");
     catch (Exception e) 
        return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
    

在我的global.asax

protected void Application_BeginRequest() 
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") 
        Response.Flush();
    

但是发生了一些奇怪的事情 - 如果我在控制器中设置断点,则 OPTIONS 请求会通过 null 练习进入内部。为什么会这样?我希望Flush() 可以防止这种情况发生。

就目前而言,我需要为所有对 CORS 敏感的端点(PUT、DELETE)添加对 null 的检查。这似乎不优雅...我是否应该能够阻止 OPTIONS 请求访问控制器逻辑,而不是直接使用所需的标头进行响应?

【问题讨论】:

@CarlHancke - 成功了。看起来我已经实现了另一种方法的一半......随时发布作为答案,非常感谢:) 【参考方案1】:

根据问题中的 cmets 将其添加为答案。

问题是由在操作方法上接受OPTIONS 动词引起的。然后 MVC 运行时尝试执行操作方法并出现null 问题。

删除动词,以便 MVC 不会尝试执行该方法,Application_BeginRequest 事件将为您解决飞行前问题。

【讨论】:

以上是关于WebAPI CORS - 为啥 OPTIONS 请求进入我的控制器?的主要内容,如果未能解决你的问题,请参考以下文章

为啥经过身份验证的 CORS 请求的预检 OPTIONS 请求在 Chrome 中有效,但在 Firefox 中无效?

当 OPTIONS 请求的 statusCode 为 200 时,为啥我会在 API Gateway GET 请求中收到 CORS 错误?

用于 XmlHttpRequest 的带有 WebAPI 的 CORS

CORS 在 web api 中的 POST 失败

IIS 中托管的 WebAPI 中的 CORS 问题

为啥调用虚拟 API 时允许使用 CORS?