错误405-带有CORS for Web API的IIS Express 10不允许使用该方法

时间:2019-07-15 22:45:17

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

我知道这个问题已经被问了很多遍了,每次都有类似的答案,但是经过几个小时的研究,我还没有解决它,所以我希望可以提供更多的建议。

我得到Error 405 - Method not allowed

  1. 我已按照建议从模块和处理程序部分中删除了WebDAV条目。

  2. 我还更改了ExtensionlessUrlHandler-Integrated-4.0。按照建议先将其删除,但无法正常工作,因此重新添加了它,但定义稍有不同<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,OPTIONS,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 而不是使用*

  3. 定义每个动词的位置
  4. 我确保已启用CORS,即从app.UseCors(CorsOptions.AllowAll);的启动类中调用public void Configuration(IAppBuilder app)

  5. Access-Control-Allow-Methods已在我的web.config中设置

奇怪的是,它对DELETE来说很好用,但对PUT却不起作用。

这是我的web.config中的System.WebServer部分:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
        <modules runAllManagedModulesForAllRequests="true">
            <remove name="WebDAVModule"/>
        </modules>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Methods" 
                       value="GET,POST,OPTIONS,PUT,DELETE" />
        </customHeaders>
    </httpProtocol>
    <handlers>
        <clear/>
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <remove name="OPTIONSVerbHandler" />
        <remove name="TRACEVerbHandler" />
        <remove name="WebDAV" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." 
             verb="GET,POST,OPTIONS,PUT,DELETE"
             type="System.Web.Handlers.TransferRequestHandler" 
             preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

运行Fiddler时,我得到以下信息:

HTTP/1.1 405 Method Not Allowed
Allow: GET,POST
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/10.0
X-SourceFiles: =?UTF-8?B?RDpcU3BpbmRldlxXb3JrXEpvaWZmTGlzdGluZ05lnM=?=
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,OPTIONS,PUT,DELETE
Date: Mon, 15 Jul 2019 23:41:32 GMT
Content-Length: 79
{
  "message": "The requested resource does not support http method 'PUT'."
}

如您所见,Access-Control-Allow-OriginAccess-Control-Allow-Methods似乎设置正确,但Allow:仍设置为GET,POST。这是为什么?我应该在哪里更改所有动词?

最后,我在Web控制器中的操作定义如下:

[HttpPut]
[Route("id:{Guid}")]
public async Task<IHttpActionResult> UpdateCompany(Guid id)
{
}

相当标准的东西!

有什么想法和/或建议吗?请记住,我专注于使它在IIS Express上起作用。解决该问题后,我将在IIS中对其进行检查,但我真的很想先深入浅谈。

非常感谢任何帮助。

谢谢。

UPDATE-1

我刚刚找到了Microsoft的一篇有关CORS的文章,甚至认为我正在如上所述启用它,我注意到我对Microsoft.AspNet.WebApi.Cors的引用列表中没有任何引用这很奇怪,当我尝试添加[EnableCors...]属性时,没有显示引用,这将更清楚地表明它可能没有正确安装或根本没有安装。

明天我会检查并更新。

我也忘了提到OWIN的安装和设置。万一这可能会提供更多线索,说明为什么我仍然无法解决此问题。

UPDATE-2

我的添加公司(POST)的定义如下:

[HttpPost]
public async Task<IHttpActionResult> AddCompany (
    CompanyRequestDto companyRequestDto)
{
}

我的更新公司(PUT)的定义如下:

[HttpPut]
public async Task<IHttpActionResult> UpdateCompany (
    Guid Id,
    CompanyRequestDto companyRequestDto)
{
}

并且我的WebApiConfig.cs中定义了以下路由:

// Web API routes
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

我已经删除了[Route("id:{Guid}")],因为我认为可能是这样,但事实并非如此。同样的问题。

正如Andrei Dragotoniu所建议的那样,注释掉我的UpdateCompany函数会产生同样的错误,这意味着另一个函数被命中,但是我不知道哪个函数被命中,因为我放置的任何一个断点都没有被命中,也没有一个被定义为PUT,所以很混乱。我相信我们会深入浅出。

UPDATE-3

我现在真的很傻!!在花了很多时间研究这个问题之后,它实际上并不存在!与仅发布对象的POST请求不同,PUT请求期望CompanyId作为查询字符串的一部分,而我已将其省略并导致问题!

http://localhost:12345/Companies

代替

http://localhost:12345/Companies/61770BAA-78A6-E911-AEB1-001A7DDA7111

无论如何,我很高兴我能正常运行,我希望没有其他人会做像这样愚蠢的事情,但是如果您愿意,这会有所帮助!

1 个答案:

答案 0 :(得分:0)

不要在IIS Express上执行此操作,这毫无意义。让它在正确的IIS中工作。

要检查的一件事,错误方法告诉您正在访问的特定方法不支持PUT。这并不意味着未在config中启用PUT动词。这意味着您正在访问的特定方法不支持它。

您需要检查并查看哪个端点被命中,因为它似乎并不是您认为的那个端点。基本上检查您的规则。请记住,它们是按顺序应用的,因此您确实希望首先加载最具体的,最后加载最通用的。

一种快速的检查方法是注释掉UpdateCompany(Guid id)端点,看看在邮递员中重复呼叫时是否仍然得到相同的响应。如果您这样做了,那么很明显,您的请求是由另一个端点处理的,而不是您认为的那个端点。