我意识到这个问题似乎非常非常频繁地出现。我已经完成了每一个并尝试了许多建议的解决方案。一个解决方案似乎让我进入了一个“工作”#34;状态,但它似乎并没有解决实际的潜在问题,而是以某种方式解决它。所以,让我来解释一下我的情景以及我尝试过的事情,也许我们可以解决这个问题,并提出解决方案来解决这里真正存在的问题。
我正在编写一个由IIS提供的AspNet WebApi应用程序。我的应用程序当前正在使用基于约定的路由,而不是属性路由。我的应用程序需要处理CORS飞行前请求(OPTIONS)。我已经从Nuget安装了所需的Microsoft.AspNet.WebApi.Cors包。以下是我正在使用的AspNet软件包的版本:
<package id="Microsoft.AspNet.Cors" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Cors" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net461" />
根据我的阅读,Microsoft.AspNet.WebApi.Cors包应该添加对处理CORS飞行前请求的支持。这意味着我不必添加手动OPTIONS操作方法等 - nuget包为我带来了这个。因此,我已根据常用的博客文章配置了软件包,以便为所有可用控制器启用CORS。根据我的理解,这应该是我的应用程序开始响应OPTIONS请求所需的全部内容。以下是我的完整性配置 - 它表明我还配置了一些其他的东西:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var jsonMapping = new RequestHeaderMapping("Accept", "text/html", System.StringComparison.OrdinalIgnoreCase, true, "application/json");
var corsAttribute = new EnableCorsAttribute("*", "*", "*");
config.Formatters.JsonFormatter.MediaTypeMappings.Add(jsonMapping);
config.Services.Replace(typeof(IFilterProvider), new UnityFilterProvider(UnityConfig.Container));
config.EnableCors(corsAttribute);
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
最后,我在web.config中看到了一些关于OPTIONSVerbHandler的引用。无论默认值是什么,我都会留下,如下所示......
<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>
最后,在所有这些项目到位后,我的应用程序似乎仍然无法处理OPTIONS请求。使用邮递员,我只是向我的任何端点发送OPTIONS请求,无论端点如何,我都会收到以下405响应...
Allow →POST
Cache-Control →no-cache
Content-Length →76
Content-Type →application/json; charset=utf-8
Date →Wed, 14 Feb 2018 20:50:14 GMT
Expires →-1
Pragma →no-cache
Server →Microsoft-IIS/10.0
X-AspNet-Version →4.0.30319
X-Powered-By →ASP.NET
X-SourceFiles →=?UTF-8?B?QzpcVXNlcnNccmNvbGVcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxN1xQcm9qZWN0c1xQb3J0YWwuUkVTVFxQb3J0YWwuUkVTVFxhY2NvdW50XGF1dGhlbnRpY2F0ZQ==?=
{"Message":"The requested resource does not support http method 'OPTIONS'."}
以下是我尝试解决的一些问题:
所以,我没有一点帮助就无法解决这个问题 - 我被卡住了。
有人知道可能导致此问题的原因吗?看起来我的Microsoft.AspNet.WebApi.Cors包没有正确连接或做任何事情。响应中没有CORS头。看起来AspNet并不认为它有任何OPTIONS处理程序,尽管我在我的配置中启用它。
答案 0 :(得分:0)
我在其他几个地方看到过这个问题。大多数答案都集中在web.config hacks,自定义过滤器属性,其他自定义代码等作为解决方案。我想在我的场景中标记最终成为解决方案的东西,我相信其他很多人都会这样做。场景......
Microsoft.AspNet.WebApi.Cors
包确实可以正常运行并处理OPTIONS
航班前请求。但是,只有在存在适当的CORS头时才会采取行动。
所以,在我的场景中,我使用Postman等工具测试了这个。我通过发送明确的OPTIONS
请求进行测试。好吧,其中许多工具都没有发送CORS飞行前请求,即便如此,在发送手动OPTIONS
请求时,它们也不包含触发Microsoft.AspNet.WebApi.Cors
功能所需的CORS标头。 / p>
所以,最后,对我来说,没有技术问题或错误,缺乏关于nuget包如何工作的知识。当我切换回我的JavaScript项目,并使用fetch
跨原点发出请求时,请求有效。 Chrome会使用适当的CORS标头发送行前OPTIONS
。
因此,如果您使用像Postman这样的工具,请确保使用适当的CORS标头进行测试!
答案 1 :(得分:-1)
这本身并不是一个CORS问题。它是您的Web服务器不允许OPTIONS请求。我知道这不是一个答案,但它应该可以帮助你走上缩小范围的道路。