WebAPI CORS - 为什么OPTIONS请求会进入我的控制器?

7

我已经成功实现了以下的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请求会带着一个空的练习到内部。为什么会这样呢?我原本以为Flush()可以防止这种情况发生。
目前来看,我需要在所有受CORS保护的端点(PUT、DELETE)上添加对空值的检查。这似乎不太优雅...我是否能够防止OPTIONS请求触及控制器逻辑,而是直接使用所需的标头进行响应?

@CarlHancke - 成功了。看起来我已经实现了另一个方法的一半...请随意发布答案,非常感谢 :) - SB2055
1个回答

8

根据问题中的评论,我来回答。

此问题是由于在操作方法上接受了 OPTIONS 动词造成的。MVC运行时会尝试执行操作方法,然后出现 null 问题。

移除动词,这样MVC就不会尝试执行该方法,Application_BeginRequest 事件将为您解决预检问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接