Asp.NET Web API – 405 – 用于访问此页面的HTTP动词不被允许 – 如何设置处理程序映射

我使用ASP.NET Web API编写了REST服务。 我试图发送HttpDelete请求,但是我得到以下错误:

405 – 用于访问此页面的HTTP动词不被允许

我认为我接近解决scheme,我发现我应该启用IIS远程pipe理,去处理器映射部分,并添加DELETE动词到适当的位置…但问题是,有很多不同的立场名单…(像这里: http : //www.somacon.com/p126.php )。

我应该编辑哪一个? 他们几乎没有扩展名,例如“ExtensionUrlHandler-Integrated-4.0”,我添加了DELETE动词,但它仍然不工作…

修改那个只是一个黑暗的镜头,我应该修改不同的位置吗? 如果是这样,哪一个? 或者也许还有什么我应该做的?

相同的Web服务工作完全正常我的本地服务,所以我想问题是与远程IIS …

问候

这个错误的常见原因是WebDAV 。 确保你卸载它。

您不需要卸载WebDAV,只需将这些行添加到web.config:

<system.webServer> <modules> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer> 

如下所示更改您的Web.Config文件。 它会像魅力一样。

在节点<system.webServer>添加下面的代码部分

 <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule"/> </modules> 

添加后,你的Web.Config将如下所示

 <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-Headers" value="Content-Type" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> </customHeaders> </httpProtocol> <handlers> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer> 

如下所示更改您的Web.Config文件

  <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV"/> <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> 

不常见,但可能会有所帮助。

确保你使用System.Web.Http的 [HttpPut]

我们正在使用HttpPut装饰方法得到'方法不允许'405。

我们的问题似乎是不常见的,因为我们意外地使用了System.Web.Mvc的[HttpPut]属性而不是System.Web.Http

原因是,resharperbuild议使用.Mvc版本,因为通常在您从ApiController直接派生System.Web.Http时已经引用了我们使用扩展ApiController的类。

如果上述解决scheme都不能解决你的问题(仍然坚持我的RestClient模块面临405)尝试使用像Fiddler这样的工具来请求你的Api。 我的意思是这个问题可能是其他地方像一个不好格式化的请求。

我发现我的RestClient模块要求使用ID格式不正确的“Put”

 http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78 

代替

 http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78 

晦涩地,格式不正确的请求返回405 – 方法不允许(IIS 7.5)

我曾经发生过这种情况(405方法不允许),当我调用的web api post方法有参数的原始types,而不是从正文访问的复杂types。 像这样:

这工作:

  [Route("update"), Authorize, HttpPost] public int Update([FromBody] updateObject update) 

这并没有:

  [Route("update"), Authorize, HttpPost] public int Update(string whatever, int whatever, string whatever) 

在我们的情况下,问题是在.Net站点和ADFS之间进行联合login。 redirect到ADFS端点时, wctx参数需要WSFederationAuthenticationModule.CreateSignInRequest方法的所有三个参数: rmidru

感谢Guillaume Raymond提示检查URL参数!

除了以上所有的解决scheme之外,请检查您是否有“ id ”或DELETE方法中的任何自定义参数匹配路由configuration。

 public void Delete(int id) { //some code here } 

如果重复405次错误,可以按照上面的方法将方法签名重置为默认值并尝试。

路由configuration默认会在URL中查找id 。 所以参数名称id在这里很重要,除非你改变App_Start文件夹下的路由configuration。

你可以改变id的数据types。

例如下面的方法应该工作得很好:

 public void Delete(string id) { //some code here } 

注意:另外,请确保您通过url传递数据,而不是将数据方法作为主体内容传输。

 DELETE http://{url}/{action}/{id} 

例:

 DELETE http://localhost/item/1 

希望它有帮助。

这个错误来自于静态文件处理程序 – 默认情况下,它不会过滤任何动词,但可能只能处理HEAD和GET。

这是因为没有其他处理程序加强对板,并说他们可以处理DELETE。

由于您使用的WEBAPI,由于路由没有文件,因此没有扩展名,以下添加需要添加到您的web.config文件:

 <system.webserver> <httpProtocol> <handlers> ... <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

显然,所需要的取决于classicmode vs integratedmode,classicmode取决于bitness。 另外,OPTIONS标题已经被添加用于CORS处理,但是如果你不做CORS,你不需要它。

仅供参考,您的web.config是应用程序(或应用程序目录)版本的本地,其顶层是applicationHost.config。

如果是IIS 8.0,请检查是否启用HTTP激活。 服务器pipe理器 – > IIS – >pipe理(请参阅右上angular) – >添加angular色和function – > … – >进入WCFconfiguration,然后selectHTTP激活。