Cors 请求和 MVC5

Cors requests and MVC5

所以我在控制器上有一个视图...

[AllowAnonymous]
[Route("MyView")]
public ActionResult MyView()
{
    // first attempt at solving problem
    Response.AddHeader("Access-Control-Allow-Origin", "*");
    Response.AddHeader("Access-Control-Allow-Headers", "*");
    Response.AddHeader("Access-Control-Allow-Methods", "*");

    return PartialView();
}

我尝试添加此属性(第二次尝试)...

public class AllowCors : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "*");
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Methods", "*");
        base.OnActionExecuting(filterContext);
    }
}

当我使用 owin 初始化我的应用程序时,我认为这可能有效(第三次尝试)...

app.Use((context, next) =>
{
    if (context.Request.Method == "OPTIONS")
    {
        context.Response.StatusCode = 200;
        context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
        context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "*" });
        context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "*" });
        return context.Response.WriteAsync("handled");
    }

    return next.Invoke();
}).UseStageMarker(PipelineStage.PreHandlerExecute);

问题是,如果我直接通过在浏览器中输入 url 来请求它,我会得到正确的 headers ...

Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:*
Access-Control-Allow-Origin:*

...移交给邮递员进行测试,当我向同一个 URL 发出 OPTIONS 调用时,我在 headers ...

中得到了这个
Allow: OPTIONS, TRACE, GET, HEAD, POST

...那么如何让 MVC 正确响应 OPTIONS http 动词,以便我可以在网站域之外使用此视图?

编辑

值得注意的是,我已经环顾四周,发现了所有这些以及更多...

jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox

AJAX in Chrome sending OPTIONS instead of GET/POST/PUT/DELETE?

Why does this jQuery AJAX PUT work in Chrome but not FF

...我也非常熟悉使用 CORS 和向 WebAPI 发出 CORS 请求,但出于某种原因,我似乎无法在没有得到这个的情况下向 MVC 发出 CORS 请求 "dummy"回复。

我认为我需要一种方法来覆盖/替换此基于 HttpVerb 的请求的 MVC 默认行为,以允许我在远程站点中嵌入视图。

安装这两个 nuget 包:

Microsoft.AspNet.Cors
Microsoft.Owin.Cors

然后在您的 Startup.cs 中的 Configuration 函数中添加这一行:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);

        app.UseCors(CorsOptions.AllowAll);
    }
}

在我的演示设置中,我从域 http://example.local (Apache) to the domain http://localhost:6569/ (IIS Express) 发送 post 请求。

没有 app.UseCors(CorsOptions.AllowAll);(注意控制台中的警告并且没有 CORS headers):

并且在添加包并将行添加到 Configuration 方法之后:

如您在屏幕截图中所见,access-control-allow-origin 已按预期添加到响应 headers 中/