JQuery在CORS飞行前和IIS重影响应时卡住
我卡住了。说真的…-已解决。继续阅读:) 场景:我正在尝试做正确的事情。我在REST服务(ASP.NET Web API)中添加了CORS功能,这依赖于ThinkStructure Identitymodel CORS DelegatingHandler。到目前为止还不错 为了实际测试它是否工作,我做了以下操作:JQuery在CORS飞行前和IIS重影响应时卡住,jquery,http,asp.net-web-api,cors,Jquery,Http,Asp.net Web Api,Cors,我卡住了。说真的…-已解决。继续阅读:) 场景:我正在尝试做正确的事情。我在REST服务(ASP.NET Web API)中添加了CORS功能,这依赖于ThinkStructure Identitymodel CORS DelegatingHandler。到目前为止还不错 为了实际测试它是否工作,我做了以下操作: 我设置了一个简单的HTML页面,并将其发布在与rest服务不同的主机上(xttp://otherhost/simplewebpage). 页面使用JQuery发出示例请求。代码见下文
您的答案如下:
基本上,IE对cors有一些非常具体的警告和陷阱。有一次我自己开始写,但后来我找到了mathieucarbou的解决方案,认为他的更好
这个解决方案可能比您想要的要重一些,但对于跨浏览器支持,我发现用“自定义解决方案”尽可能地攻击IE是可以接受的。检查这个。这可能会对您有所帮助
创建PreflightRequestsHandler类,在该类中允许请求头(1),并在类(2)之前启用cors
1。公共类预处理请求处理程序:DelegatingHandler
{
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
if(request.Headers.Contains(“Origin”)&&request.Method.Method.Equals(“OPTIONS”))
{
var response=newhttpresponsemessage{StatusCode=HttpStatusCode.OK};
//定义并向变量添加值:源、头、方法(可以是全局的)
添加(“访问控制允许源代码”、“*”);
添加(“访问控制允许标题”、“内容类型”);
添加(“访问控制允许方法”,“*”);
var tsc=new TaskCompletionSource();
tsc.设置结果(响应);
返回tsc任务;
}
返回base.sendaync(请求、取消令牌);
}
}
2.[EnableCors(来源:“*”,标题:“*”,方法:“*”,公开标题:“X-Custom-Header”)]
尝试将crossDomain字段设置为true。它对我有效。您说“问题已解决?”它是否真的为您解决了?我也有同样的问题,并且尝试了所有这些解决方案,但仍然没有运气。。。。我的问题@lapsus,我面临着类似的问题,请让我知道你是否可以帮助我,我从未收到过使用IIS的预飞请求,最终使用了框架,而brrrrI正在应用这些修复,但根本没有帮助。任何HTTP选项请求都无法通过,IIS日志文件中甚至没有选项请求的日志。经过两个小时的挫折,当我完全绝望时,我决定在IIS中重新启动wcf服务web应用程序,它突然工作了!!据我所知,每当配置文件更改时,IIS都会重新启动应用程序池,但这次没有重新启动。没关系,我只是想让它工作,然后就完成了+1美元。希望这对某人有所帮助..问题是IIS正在拦截OPTIONS方法事务。该应用程序从未看到这种流量,因此对该应用程序进行任何更改都不会有帮助。要明确的是,这只是关于IE9支持的一个答案,只是在会议上提到的
HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/7.5
Public: OPTIONS, TRACE, GET, HEAD, POST
Date: Fri, 15 Feb 2013 14:09:27 GMT
Content-Length: 0
function Run()
{
$.ajax({
type: 'GET',
url: url,
dataType: "json",
beforeSend: function(jqXhr) {
jqXhr.setRequestHeader("Authorization", "Basic " + getBasicHttpEncodedString(userName, password));
jqXhr.setRequestHeader("Api-Key", "123");
},
success: successCallback,
error: errorCallback,
timeout: 180*1000
});
}
OPTIONS http://services.dev13/Rest/Hello HTTP/1.1
Host: developmenthost
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://otherhost/simplewebpage
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
Access-Control-Request-Headers: accept, origin, api-key, authorization
Accept: */*
DNT: 1
Referer: http://otherhost/simplewebpage
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: http://otherhost/simplewebpage
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: accept,origin,api-key,authorization
X-AspNet-Version: 4.0.30319
Date: Fri, 15 Feb 2013 15:09:25 GMT
Content-Length: 0
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
1. public class PreflightRequestsHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.Headers.Contains("Origin") && request.Method.Method.Equals("OPTIONS"))
{
var response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
// Define and add values to variables: origins, headers, methods (can be global)
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Headers", "content-type");
response.Headers.Add("Access-Control-Allow-Methods", "*");
var tsc = new TaskCompletionSource<HttpResponseMessage>();
tsc.SetResult(response);
return tsc.Task;
}
return base.SendAsync(request, cancellationToken);
}
}
2. [EnableCors(origins: "*", headers: "*", methods: "*", exposedHeaders: "X-Custom-Header")]