我有一个MVC项目,其中我有几个JSON控制器方法,我想要公开跨域。不是整个网站,只是这两种方法。
我基本上想要在这篇文章中为cors所说的确切内容:
http://enable-cors.org/server_aspnet.html
然而,问题是我有一个常规的MVC项目而不是WEB API,这意味着我不能按照注册寄存器的步骤进行操作
public static void Register(HttpConfiguration config)
{
// New code
config.EnableCors();
}
方法,因为它在我的MVC项目中不存在。
有没有办法使用这个库,虽然它是一个MVC项目?
我知道我可以使用:
通过web.config配置它<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="http://www.domain.com" />
</customHeaders>
</httpProtocol>
但我不想暴露所有方法,我想指定多个域(2个域)来访问我的方法......
答案 0 :(得分:61)
如下所述:Setting Access-Control-Allow-Origin in ASP.Net MVC - simplest possible method
您应该只创建一个动作过滤器并在那里设置标题。您可以在任何需要的操作方法上使用此操作过滤器。
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
base.OnActionExecuting(filterContext);
}
}
如果要添加多个域,则不能多次设置标头。在您的操作过滤器中,您需要检查请求域是否来自您的域列表,然后设置标题。
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);
}