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

Posted

技术标签:

【中文标题】错误 405 - IIS Express 10 不允许使用 CORS for Web API 的方法【英文标题】:Error 405 - Method not allowed with IIS Express 10 with CORS for Web API 【发布时间】:2019-11-24 15:28:09 【问题描述】:

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

我收到Error 405 - Method not allowed

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

    我还更改了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" /> 其中每个动词都被定义而不是使用*

    我已确保 CORS 已启用,即从 public void Configuration(IAppBuilder app) 中的 Startup 类调用 app.UseCors(CorsOptions.AllowAll);

    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。这是为什么?我应该在哪里更改它以包含所有动词?

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

[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

无论如何,我很高兴我已经启动并运行,我希望没有其他人会做像这样愚蠢的事情,但如果你这样做,希望这会有所帮助!

【问题讨论】:

405响应的请求方法是OPTIONS方法。您的浏览器正在发出 CORS 预检 OPTIONS 请求。预检失败,所以浏览器停在那里,因此甚至永远不会继续尝试 PUT 或 POST 或您的前端 javascript 代码尝试发送的任何方法。 @sideshowbarker 不是 ` ` 处理这个吗? @sideshowbarker 我目前正在阅读此https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api,希望它会有所启发。 不,&lt;add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS,PUT,DELETE" /&gt; 部分不负责导致 405 的处理。&lt;add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS,PUT,DELETE" /&gt; 部分的唯一影响是导致服务器发回 Access-Control-Allow-Methods: GET,POST,OPTIONS,PUT,DELETE 响应标题。 好的,感谢您澄清这一点。我正在使用 OWIN.Cors 顺便说一句,我可能应该提到过,虽然我刚刚尝试了一个自定义解决方案来启用每个人 Methods,但我注意到我的配置中已经有一个带有 app.UseCors(CorsOptions.AllowAll); // enable CORS origin requests 的条目,它是设置为全部允许。也许这不包括 PUT。我会在一秒钟内进一步研究它。 【参考方案1】:

不要在 IIS Express 上这样做,那毫无意义。让它在适当的 IIS 中工作。

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

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

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

【讨论】:

@我使用 IIS Express 的原因是直接在 IIS 中运行时无法调试,这很痛苦。我按照你的建议做了,即注释掉 UpdateCompany(Guid id),令人惊讶的是,正如你所建议的,我得到了同样的错误。我不确定正在处理哪种其他方法,因为这是我的控制器中唯一的 PUT。我已经在所有其他操作上设置了一个断点,并且没有一个被触发。我定义 url 的方式如下: url/api/companies 和 CreateCompany (POST) 和 UpdateCompany (PUT) 都使用相同的 url,我认为这是这样做的方法,不? 我好#$!#$ 绑定!!一直以来,它都盯着我的脸。 PUT 请求引发了这个错误,因为......你已经准备好了......我没有将 CompanyId 作为我的 URL 的一部分传递!我现在觉得自己很愚蠢,浪费了很多时间,我一直专注于 Web API 中的问题,而 URL 一直都格式不正确......对不起!

以上是关于错误 405 - IIS Express 10 不允许使用 CORS for Web API 的方法的主要内容,如果未能解决你的问题,请参考以下文章

IIS 7.5 错误 405 不支持 PUT 方法

IIS 7.5、Web 服务和 HTTP 405 错误

405 - 用于访问此页面的 http 动词在 reactjs 应用程序中不允许 iis

405 - 不允许用于访问此页面的 HTTP 动词。 [IIS 8.5] [Windows Server 2012 R2]

Restful WCF IIS 7.5 405 方法不允许间歇

IIS Express 10 上的 ASP.NET Core 应用程序给出 HTTP 500 错误