IIS 8.5不支持Web API [EnableCors]属性.未设置Access-Control-Allow-Origin标头

K. *_*tes 7 iis cors asp.net-web-api iis-8.5

撞倒

所以我继续修补这个.这是一个带有IIS 8.5的新Windows Server.我从来没有遇到任何问题让CORS在IIS中"正常工作",所以我从来没有真正需要关心服务器配置中的繁琐位.立即解决的问题是猎枪方法; 我通过对applicationhost.config进行以下修改来启用服务器范围内的CORS

   <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
   </customHeaders>
Run Code Online (Sandbox Code Playgroud)

但删除此customHeader并[EnableCors(origins: "*",headers: "*", methods: "*")]在我的控制器内设置不会导致服务器发回Access-Control-Allow-Origin响应标头(是的,我确保调用config.EnableCors()我的HttpConfiguration.

另一个复杂因素是使用这种方法,我必须允许所有来源,因为我需要几个来源才能访问此服务器.浏览器实现不允许在此标头中从服务器发回多个源.我总是可以EnableCors在我的应用程序中编写自己的逻辑,但宁愿理解并修复服务器配置以保留在res上.


原始问题

所以我试图在我们的服务器配置团队直接在新的Windows Server 2012 R2上部署到IIS 8.5的Web应用程序上遇到了一些问题.我的应用程序是一个启用了Cors的Web API(目前允许所有来源),但服务器没有向调用客户端返回Access-Control-Allow-Origin标头.我从未遇到过Web API Cors"只是工作"的问题.

我找到了这个资源,但确认OPTIONSVerbHandler已经在我的应用程序的web.config中删除了.

我尝试将一个customHeader添加到IIS,但每当我这样做时,服务器开始返回500秒.

有什么办法可以强制 IIS 8.5从ASP.NET发送Access-Control-Allow-Origin标头吗?


EDIT1

所以我显然在我的解决方案中安装了ASP.NET Cross Origin Resource Sharing NuGet包,而不是ASP.NET Web API 2.2跨源资源共享NuGet包.我把这些换掉了,我的CORS功能有限(但仍然是意外的).我将描述我现在遇到的奇怪现象.

所以在我意识到我有错误的NuGet包之前,我已经进入了applicationHost.config并添加了

<customHeaders>
   <add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
Run Code Online (Sandbox Code Playgroud)

试图让服务器手动推回头.如果没有的NuGet更新,这并没有设置页眉上预检反应,但在这一点上我不太知道这是因为我忘了一个IISRESET;我试图快速移动.

无论如何,当我添加Web API 2.2 CorsNuGet包时,我的服务器响应开始发出Access-Control-Allow-Origin带有通配符源的头,而不是我在Web API路由中的EnableCors属性中设置的头.因此,使用该值,我知道它是配置的customHeader,而不是EnableCorsAttribute现在控制值.

(这里是奇怪的地方)所以我真的更喜欢能够直接在服务器级别直接控制CORS白名单,所以我继续将customHeader设置为

<customHeaders>
   <add name="Access-Control-Allow-Origin" value="http://segment.mydomain.com" />
</customHeaders>
Run Code Online (Sandbox Code Playgroud)

其中http://segment.mydomain.com也匹配我的API路径中允许的一个来源.

我现在Access-Control-Allow-Origin从PreFlight请求中的IIS发回正确的,但后续POST返回500.如果我EnableCors从Api Route中删除该属性,则POST成功(通过直接查询保留发布数据的数据库确认)

...重量*?


EDIT2

因此,这种有希望的方法(在IIS中的customHeader中静态定义的起源而不是允许开发人员直接在控制器中列出其起源)实际上不起作用.我需要将多个来源列入白名单,Chrome的实现只允许在ACAO标题中设置一个来源.它也不允许在原点中使用通配符段,所以......太糟糕了.