我正在进行CORS POST请求并将Content-Type标头设置为json。这会触发预检OPTIONS请求(这是好的和预期的)
此OPTIONS请求以200 OK响应,但这不是来自我的WebAPI应用程序。
我有一个自定义的消息处理程序,它永远不会受到影响,因此在看到ASP.NET之前,IIS会响应请求。
我找到了几个关于这个主题的帖子,他们说了以下
确保卸载/删除/禁用WebDav - 完成
确保删除/更改OPTIONSVerbHandler以使用aspnet_isapi.dll - TRIED BOTH
确保extensionlessURLHandler包含OPTIONS动词 - DONE
但是,我的选项请求仍然被劫持。我的意思是,IIS以200 OK响应,但不包括响应中的Access-Control-Allow-Origin标头。它不包含此标头,因为它永远不会到达我设置此标头的WebAPI CORS代码。
我能找到的两个最好的帖子听起来像我的问题
此处:JQuery stuck at CORS preflight and IIS ghost response
在这里: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,你是我唯一的希望。
答案 0 :(得分:26)
您可以在这里尝试几件事,所有与web.config相关的事情,首先修改您的模块元素以包含属性runAllManagedModulesForAllRequests="true"
,如下所示:
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDavModule" />
</modules>
然后将处理程序设置为以下内容:
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="WebDav" />
<remove name="OPTIONSVerbHandler" />
<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>
这应该可以解决问题,但如果没有,作为最后的手段,您可以强制IIS输出正确的标题,如下所示:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
</system.webServer>
要注意通配符值,您应该将其设置为您的网站将托管在的域名。
答案 1 :(得分:10)
在经过4个小时的搜索/实验后,这对我有用:
<handlers>
<remove name="OPTIONSVerbHandler" />
<add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="None" />
</handlers>
答案 2 :(得分:6)
我遇到了同样的问题,以下web.config设置为我修复了它。
<modules runAllManagedModulesForAllRequests="false">
<remove name="FormsAuthenticationModule" />
</modules>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
然后我能够在Application_BeginRequest中手动处理CORS OPTIONS请求。
我最初使用此blog post中详述的库来处理CORS请求。我正在处理的产品要求runAllManagedModulesForAllRequests设置为false。这就是我必须设置自定义实现的原因,但如果您没有这个要求,那么您应该尝试使用该库。当我能够将runAllManagedModulesForAllRequests设置为true时,它工作得很好。
答案 3 :(得分:4)
我尝试了上述所有建议以及我在SO上找到的其他建议,在我的情况下,我们在IIS上启用了请求过滤,OPTIONS HTTP Verb不在允许的动词列表中。一旦我添加它,我就可以理清其余部分。
答案 4 :(得分:4)
在我们的案例中,它是IIS中的请求筛选,在根Web应用程序级别禁用OPTIONS谓词。打开IIS管理器,单击根应用程序,单击“请求筛选”,如果列表中的“选项”显示为“删除”或“允许动词”。希望我先把这个检查过,因为浪费了很多时间。
答案 5 :(得分:1)
就我而言,我错过了Microsoft.WebApi.Cors软件包。 安装了此程序包,并在WebApiConfig类中对其进行了配置:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.EnableCors(new EnableCorsAttribute("*","*","*"));
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
请在将其用于生产之前对其进行微调,因为您可能不想为所有内容都使用通配符
答案 6 :(得分:1)
检查URLScan工具是否已安装在IIS上。 在这种情况下,请检查以下部分:
;
; The verbs (aka HTTP methods) listed here are those commonly
; processed by a typical IIS server.
;
; Note that these entries are effective if "UseAllowVerbs=1"
; is set in the [Options] section above.
;
GET
HEAD
POST
OPTIONS
答案 7 :(得分:0)
我知道这是一个老帖子,但我刚刚遇到了同样的问题。
在我的情况下,我为OWIN和WebAPI安装了CORS。 OWIN CORS中间件在它进入WebAPI之前很久就拦截了OPTIONS调用。也许这对未来的其他人有帮助。
答案 8 :(得分:0)
我安装了Microsoft.Owin.Cors
&amp; app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
用于基于oWin的WebAPI,并在配置中添加public class Startup : IStartup, IAppStartup
{
public void Configuration(IAppBuilder app)
{
var config = this.GetInjectionConfiguration();
BootstrapperWebApi bootstrapperWebApi = (BootstrapperWebApi)this.GetBootstrapperWebApi(config);
bootstrapperWebApi.Initialize(true)
.EnableLogging()
.DisableWebApiDefaultExceptionHandler();
WebApiConfig.Register(config);
app.UseOwinExceptionHandler();
app.Use<LoggerMiddleware>();
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
//others stuff
}
,如下所示:
{{1}}
答案 9 :(得分:0)
我尝试了所有提到的帖子,但没有对我有用,然后我将ASP.Net Web API 2服务转移到Windows Server 2012(IIS 8.5),并且相同的服务无需任何更改即可运行。所以问题特定于Windows 7机器上的IIS 7.5。
答案 10 :(得分:0)
这对我有用:
<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>
答案 11 :(得分:0)
就我而言,我是这样做的:
<verbs allowUnlisted="true" applyToWebDAV="true">
<remove verb="OPTIONS"/>
<add verb="OPTIONS" allowed="true"/>
</verbs>
</requestFiltering>
</security>
当我将<add verb="OPTIONS" allowed="true"/>
添加到web.config时,应用程序无法启动并显示此错误
HTTP Error 500.19 - Internal Server Error
The requested page cannot be accessed because the related configuration data for the page is invalid.
Cannot add duplicate collection entry of type 'add' with unique key attribute 'verb' set to 'OPTIONS'
所以我必须先将其删除。
答案 12 :(得分:0)
我也有同样的问题。 OPTIONS 请求返回 200 OK 状态,但它不包含 Access-Control-Allow-Origin 标头。问题是我们的客户网络策略阻止了 OPTIONS 动词请求并以 200 OK 状态响应警告消息。我知道这是旧帖子,但我想与任何需要的人分享我的案例。