Microsoft.AspNet.WebApi.Cors:请求的资源不支持http方法' OPTIONS'

时间:2018-02-16 19:29:26

标签: asp.net asp.net-web-api cors

我意识到这个问题似乎非常非常频繁地出现。我已经完成了每一个并尝试了许多建议的解决方案。一个解决方案似乎让我进入了一个“工作”#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'."}

以下是我尝试解决的一些问题:

  1. 我尝试从web.config中删除OPTIONSVerbHandler,这似乎没有任何改变。
  2. 我尝试将EnableCorsAttribute明确地放在单独的操作方法和控制器上,这似乎没有任何改变。
  3. 我明确地将HttpOptionsAttribute放在一个动作方法上,这似乎解决了这个问题。这似乎是不正确的方法,因为该属性用于说动作方法是用于处理OPTIONS请求,这根本不是我想要的。我以为Microsoft.AspNet.WebApi.Cors包带来了自己的OPTIONS处理程序。
  4. 我尝试切换到基于属性的路由,而不是原始的基于约定的路由。似乎没有任何改变。
  5. 所以,我没有一点帮助就无法解决这个问题 - 我被卡住了。

    有人知道可能导致此问题的原因吗?看起来我的Microsoft.AspNet.WebApi.Cors包没有正确连接或做任何事情。响应中没有CORS头。看起来AspNet并不认为它有任何OPTIONS处理程序,尽管我在我的配置中启用它。

2 个答案:

答案 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请求。我知道这不是一个答案,但它应该可以帮助你走上缩小范围的道路。