我知道这个问题已经被问了很多遍了,每次都有类似的答案,但是经过几个小时的研究,我还没有解决它,所以我希望可以提供更多的建议。
我得到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,即从app.UseCors(CorsOptions.AllowAll);
的启动类中调用public void Configuration(IAppBuilder app)
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
。这是为什么?我应该在哪里更改所有动词?
最后,我在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
无论如何,我很高兴我能正常运行,我希望没有其他人会做像这样愚蠢的事情,但是如果您愿意,这会有所帮助!
答案 0 :(得分:0)
不要在IIS Express上执行此操作,这毫无意义。让它在正确的IIS中工作。
要检查的一件事,错误方法告诉您正在访问的特定方法不支持PUT。这并不意味着未在config中启用PUT动词。这意味着您正在访问的特定方法不支持它。
您需要检查并查看哪个端点被命中,因为它似乎并不是您认为的那个端点。基本上检查您的规则。请记住,它们是按顺序应用的,因此您确实希望首先加载最具体的,最后加载最通用的。
一种快速的检查方法是注释掉UpdateCompany(Guid id)
端点,看看在邮递员中重复呼叫时是否仍然得到相同的响应。如果您这样做了,那么很明显,您的请求是由另一个端点处理的,而不是您认为的那个端点。