我有一个简单的actionmethod,它返回一些json。它在ajax.example.com上运行。我需要从另一个网站someothersite.com访问这个。
如果我尝试调用它,我会得到预期的…:
Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.
我知道有两种方法可以解决这个问题:JSONP和创建一个自定义HttpHandler
设置标题。
有没有更简单的办法?
对于一个简单的操作来说,是否不可能定义一个允许起源的列表-或者简单地允许所有人?也许是一个动作过滤器?
最理想的是……
return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
有不同的方式可以通过
Access-Control-Expose-Headers。
正如jgauffin所解释的,我们可以创建一个新属性。
正如LaundroMatt解释的那样,我们可以在网上添加。配置文件。
另一种方法是我们可以在webApiconfig.cs文件中添加如下代码。
配置。EnableCors(new EnableCorsAttribute("", headers: "", methods: "*",exposedHeaders: "TestHeaderToExpose") {SupportsCredentials = true});
或者我们可以在全局中添加以下代码。Asax文件。
protected void Application_BeginRequest()
{
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
//These headers are handling the "pre-flight" OPTIONS call sent by the browser
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose");
HttpContext.Current.Response.End();
}
}
我写的是期权。请根据您的需要修改。
快乐编码!!
有不同的方式可以通过
Access-Control-Expose-Headers。
正如jgauffin所解释的,我们可以创建一个新属性。
正如LaundroMatt解释的那样,我们可以在网上添加。配置文件。
另一种方法是我们可以在webApiconfig.cs文件中添加如下代码。
配置。EnableCors(new EnableCorsAttribute("", headers: "", methods: "*",exposedHeaders: "TestHeaderToExpose") {SupportsCredentials = true});
或者我们可以在全局中添加以下代码。Asax文件。
protected void Application_BeginRequest()
{
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
//These headers are handling the "pre-flight" OPTIONS call sent by the browser
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose");
HttpContext.Current.Response.End();
}
}
我写的是期权。请根据您的需要修改。
快乐编码!!
对于普通ASP。NET MVC控制器
创建一个新属性
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
base.OnActionExecuting(filterContext);
}
}
标记你的行动:
[AllowCrossSiteJson]
public ActionResult YourMethod()
{
return Json("Works better?");
}
ASP。NET Web API
using System;
using System.Web.Http.Filters;
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response != null)
actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
base.OnActionExecuted(actionExecutedContext);
}
}
标记整个API控制器:
[AllowCrossSiteJson]
public class ValuesController : ApiController
{
或者单独的API调用:
[AllowCrossSiteJson]
public IEnumerable<PartViewModel> Get()
{
...
}
对于Internet Explorer <= v9
IE <= 9不支持CORS。我已经写了一个javascript,将自动路由这些请求通过代理。这一切都是100%透明的(你只需要包括我的代理和脚本)。
使用nuget corsproxy下载它,并遵循附带的说明。
博客文章|源代码
我遇到了一个问题,当请求传入cookie时,浏览器拒绝提供它已经检索到的内容(例如,xhr有它的withCredentials=true),并且站点有Access-Control-Allow-Origin设置为*。(Chrome中的错误是,“当凭据标志为真时,不能在Access-Control-Allow-Origin中使用通配符。”)
基于@jgauffin的回答,我创建了这个,这基本上是一种绕过特定浏览器安全检查的方法,所以买者自负。
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// We'd normally just use "*" for the allow-origin header,
// but Chrome (and perhaps others) won't allow you to use authentication if
// the header is set to "*".
// TODO: Check elsewhere to see if the origin is actually on the list of trusted domains.
var ctx = filterContext.RequestContext.HttpContext;
var origin = ctx.Request.Headers["Origin"];
var allowOrigin = !string.IsNullOrWhiteSpace(origin) ? origin : "*";
ctx.Response.AddHeader("Access-Control-Allow-Origin", allowOrigin);
ctx.Response.AddHeader("Access-Control-Allow-Headers", "*");
ctx.Response.AddHeader("Access-Control-Allow-Credentials", "true");
base.OnActionExecuting(filterContext);
}
}
有时OPTIONS动词也会引起问题
简单:
更新你的网页。配置如下
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
</customHeaders>
</httpProtocol>
</system.webServer>
用httpGet和httpOptions更新webservice/controller头
// GET api/Master/Sync/?version=12121
[HttpGet][HttpOptions]
public dynamic Sync(string version)
{