错误 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-Origin
和Access-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
,希望它会有所启发。
不,<add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS,PUT,DELETE" />
部分不负责导致 405 的处理。<add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS,PUT,DELETE" />
部分的唯一影响是导致服务器发回 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 的方法的主要内容,如果未能解决你的问题,请参考以下文章
405 - 用于访问此页面的 http 动词在 reactjs 应用程序中不允许 iis
405 - 不允许用于访问此页面的 HTTP 动词。 [IIS 8.5] [Windows Server 2012 R2]