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
方法的所有三个参数: rm
, id
和ru
感谢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激活。
- 如何获取当前用户在C#中的时区
- 比较两个对象,找出差异
- 避免在ASP.NET MVC中使用会话状态是一个好习惯吗? 如果是,为什么和如何?
- 我怎样才能安全地在自定义的WebAPI HttpMessageHandler中设置用户主体?
- 错误:allowDefinition ='MachineToApplication'超出应用程序级别
- 自MS14-059以来,System.Web.MVC不会复制到bin文件夹中。 如何防止由于Windows更新而创build缺lessDLL的生成?
- 使用Web.Config转换的高级任务
- 生成PDF时无法获得捷克字符
- 请求与Request.Params 对比Request.QueryString