我在这里阅读了很多关于这个问题的问题,很多文章和我代码中的所有内容似乎都是正确的,但仍然没有在请求中发送Access-Control-Allow-Origin,我无法通过ajax连接到我的api。 / p>
我很难弄清楚Cors发生了什么,只是拒绝工作。
我正在使用VS的调试来测试,而不是IIS。
我的代码的某些部分是下面的
的global.asax.cs:
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
Startup.cs:
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
ConfigureOAuth(app);
}
WebApiConfig.cs:
public static void Register(HttpConfiguration config)
{
config.EnableCors(new EnableCorsAttribute("*", "*", "*")); // To enable it globally
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
在Web.config中的我有这个包括:
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
ajax在本地html文件中调用make:
<!DOCTYPE html>
<html lang=pt>
<head>
<meta charset='utf-8'>
<title>Custom Elements</title>
<script type='text/javascript'>
function wslogin() {
var xhr = new XMLHttpRequest;
xhr.open('POST', 'http://192.168.1.160:52487/token', true);
xhr.onload = function() {
var obj = JSON.parse(this.response);
}
xhr.send('username=MyUser&password=MyPassword&grant_type=password');
}
</script>
</head>
<body>
<button onclick="wslogin()">WSLOGIN</button>
</body>
</html>
我收到错误:“NetworkError:400 Bad Request”以及来自firebug的警告,指出Access-Control-Allow-Origin标头不存在。
我安装了Microsoft.AspNet.Cors,Microsoft.AspNet.WebApi.Cors和Microsoft.Owin.Cors包
有人知道我在这里缺少什么吗?
非常感谢。
更新:
OAuthProvider类中的TokenEndpoint方法如下所示:
public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
{
context.AdditionalResponseParameters.Add(property.Key, property.Value);
}
string corsKey = "Access-Control-Allow-Origin";
// sets additional headers
context.Response.Headers.Remove(corsKey);
context.Response.Headers.Add(corsKey, new string[] { "*" });
return Task.FromResult<object>(null);
}
答案 0 :(得分:0)
/token
正在进行自定义响应,因此您需要更改OAuthProvider类(在配置Cookie和令牌提供程序时,您在Startup.Auth.cs
中使用此类。)
在方法TokenEndpoint(OAuthTokenEndpointContext context)
中,将以下代码添加到响应消息中。
// defines the key for CORS
string corsKey = "Access-Control-Allow-Origin";
// sets additional headers
context.Response.Headers.Remove(corsKey);
context.Response.Headers.Add(corsKey, new string[]{ "*" });
这将首先删除现有的CORS标头(如果存在),并将其替换为新的标头,其中*
用于请求域。
/token
请求现在应该包含CORS标头,浏览器不应该再抱怨了。
答案 1 :(得分:0)
在 Web.Config 文件的<system.webServer></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,Authorization" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
执行此操作后,请勿忘记从 WebApiConfig.cs 文件中的 Register()方法中删除以下代码:
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
从Startup类中的 Configuration()方法中删除app.UseCors(CorsOptions.AllowAll);
行。
重写 OAuthProvider 类中的 TokenEndpoint()方法,如下所示:
public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
{
context.AdditionalResponseParameters.Add(property.Key, property.Value);
}
return Task.FromResult<object>(null);
}
希望错误将消失!! 如果没有,那么还要在 Application_Start()方法
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}