ASP .NET MVC5中的CORS

use*_*587 48 asp.net-mvc cors

我有一个MVC项目,其中有几个我想要公开跨域的JSON控制器方法.不是整个网站,只是这两种方法.

我基本上想要在这篇文章中为cors所说的确切内容:

http://enable-cors.org/server_aspnet.html

但是,问题是我有一个常规的MVC项目,而不是一个WEB API,这意味着,我不能按照注册寄存器的步骤

public static void Register(HttpConfiguration config)
{
    // New code
    config.EnableCors();
}
Run Code Online (Sandbox Code Playgroud)

因为它在我的MVC项目中不存在.

有没有办法使用这个库,虽然它是一个MVC项目?

我知道我可以通过web.config使用以下命令配置:

<httpProtocol>
      <customHeaders>
        <clear />
        <add name="Access-Control-Allow-Origin" value="http://www.domain.com" />
      </customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)

但我不想暴露所有方法,我想指定多个域(2个域)来访问我的方法......

Vse*_*nin 64

如下所述:在ASP.Net MVC中设置Access-Control-Allow-Origin - 最简单的方法

您应该只创建一个动作过滤器并在那里设置标题.您可以在任何需要的操作方法上使用此操作过滤器.

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        base.OnActionExecuting(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要添加多个域,则不能多次设置标头.在您的操作过滤器中,您需要检查请求域是否来自您的域列表,然后设置标头.

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var domains = new List<string> {"domain2.com", "domain1.com"};

        if (domains.Contains(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Host))
        {
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        }

        base.OnActionExecuting(filterContext);
    }
Run Code Online (Sandbox Code Playgroud)