我正在进行CORS POST请求并将Content-Type标头设置为json.这会触发Preflight OPTIONS请求触发(这很好并且预期)
此OPTIONS请求以200 OK响应,但这不是来自我的WebAPI应用程序.
我有一个自定义的消息处理程序,它永远不会受到影响,因此在看到ASP.NET之前,IIS会响应请求.
我找到了几个关于这个主题的帖子,他们说了以下内容
确保卸载/删除/禁用WebDav - 完成
确保删除/更改OPTIONSVerbHandler以使用aspnet_isapi.dll - 同时尝试
确保extensionlessURLHandler包含OPTIONS动词 - DONE
但是,我的选项请求仍然被劫持.我的意思是,IIS以200 OK响应,但在响应中不包括Access-Control-Allow-Origin标头.它不包括此标头,因为它永远不会到我设置此标头的WebAPI CORS代码.
我能找到的两个最好的帖子听起来像是我的问题
在这里:http://brockallen.com/2012/10/18/cors-iis-and-webdav/
我尝试在IIS中打开失败请求跟踪(FERB)并将其设置为跟踪所有200个状态代码.我没有看到选项请求被记录...不确定这是否意味着FERB不跟踪OPTIONS请求或者我是否需要更改FERB设置中的某些内容以使其跟踪OPTIONS请求,或者如果这是一条线索我的问题是什么?
这是在IIS 7.5上运行的ASP.NET WebAPI 2.0(也在IIS 8和IISExpress上测试,结果相同)无论什么浏览器(Chrome,FF和IE都以相同的方式失败)
我已经尝试了我能找到的关于这个主题的所有内容,仍然无法解决我的问题.
帮帮我StackOverflow,你是我唯一的希望.
这是场景:
我创建了一个web api项目和一个mvc项目,如下所示:
http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
我通过nuget安装了CORS支持并添加了EnableCorsAttribute
我运行了这个项目,一切都按照预期(GET,PUT和POST)在Chrome,IE和FireFox上运行.
然后我在web api项目中启用了Windows身份验证(是的,我真的需要在api项目中使用win auth).为了使这个工作,我将xhrFields arg添加到我的jquery.ajax调用:
$.ajax({
type: method,
url: serviceUrl,
data: JSON.stringify(foo),
contentType: 'application/json; charset=UTF-8',
xhrFields: {
withCredentials: true
}
}).done(function (data) {
$('#value1').text(data);
}).error(function (jqXHR, textStatus, errorThrown) {
$('#value1').text(jqXHR.responseText || textStatus);
});
Run Code Online (Sandbox Code Playgroud)
另外,我设置了EnableCorsAttribute.SupportsCredentials属性= true
我测试了一切.Chrome和IE工作,FireFox没有.Firefox收到401响应它的预检(OPTIONS)请求.
似乎FireFox没有尝试使用该服务进行身份验证.
有没有人找到解决这个问题的方法?
我想从位于domainB.contoso.com上的Web应用程序访问位于domainA.contoso.com上的listdata.svc(一个sharepoint服务) - 身份验证似乎是个问题.
当尝试通过JQuery Ajax调用访问ListData.svc时,启用CORS,服务器返回401.如果我从SharePoint内部执行的.htm页面运行相同的查询,则调用正常,因为域名是相同.
SharePoint正在使用NTLM关闭匿名身份验证 - 我认为401是Windows凭据未传递到SharePoint服务器的结果 - 但我不知道如何正确地将这些凭据添加到标头. 我已经设置了xhrFields:{withCredentials:true},但这似乎无法解决身份验证问题.
为了启用CORS,我在IIS中的SharePoint上设置了以下HTTP响应标头:
在我的Web应用程序的IIS中启用了Windows身份验证,我没有在IIS中设置"OPTIONSVerbHandler"HTTP处理程序.把它翻到阅读似乎没有什么区别.
JQuery Ajax调用(来自subdomainB.contoso.com上的应用程序):
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: listUrl,
xhrFields: { withCredentials: true },
crossDomain:true,
processData: false,
async: true,
dataType: "json",
converters: {
// WCF Data Service .NET 3.5 incorrectly escapes singles quotes, which is clearly
// not required (and incorrect) in JSON specs.
// http://bugs.jquery.com/ticket/8320?cversion=0&cnum_hist=1
"text json": function (textValue) {
return jQuery.parseJSON(textValue.replace(/(^|[^\\])\\'/g, "$1'"));
}
},
success: function (data, status, xhr) { …Run Code Online (Sandbox Code Playgroud) 我在后端使用 Angular 4 和 ASP.NET Web api 2,并启用了 Windows 身份验证。我有一篇文章和一篇 get api。GET 工作正常。但对于 POST 我收到此错误
预检响应具有无效的 HTTP 状态代码 401
这意味着我收到 OPTIONS 方法的未经授权的错误,但我知道不应该出现这种情况,因为永远不会使用用户凭据调用 OPTIONS 方法。
在角度中我调用 api 如下
let requestOptions = new RequestOptions({
withCredentials: true,
headers: new Headers({
'content-type': 'application/json'
})
})
this.http.post("someapiendpoint", JSON.stringify(data), requestOptions).subscribe(data => {
debugger;
});
Run Code Online (Sandbox Code Playgroud)
我已在 Web 配置中设置所有 CORS 标头,如下所示
<add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/>
<add name="Access-Control-Allow-Origin" value="http://localhost:4200" />
<add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
Run Code Online (Sandbox Code Playgroud)
我的 …
cors ×4
ajax ×1
angular ×1
asp.net ×1
asp.net-mvc ×1
firefox ×1
http ×1
iis ×1
javascript ×1
preflight ×1
sharepoint ×1