我使用ASP.NET Web API编写了REST服务。我正在尝试发送HttpDelete请求,但是我收到以下错误:
405 - 不允许用于访问此页面的HTTP动词
我认为我接近解决方案,我发现我应该启用IIS远程管理,转到Handler Mappings部分并将DELETE动词添加到适当的位置......但问题是有很多不同的位置列表......(就像这里:http://www.somacon.com/p126.php)。
我应该编辑哪一个?他们中很少有人没有延期,例如“ExtensionUrlHandler-Integrated-4.0”我添加了DELETE动词,但它仍然不起作用......
修改那个只是在黑暗中拍摄,所以我应该修改不同的位置吗?如果是这样,哪一个?或者还有什么我应该做的?
相同的Web服务在我的本地服务上工作得很好,所以我猜问题是远程IIS ...
问候
这个错误的常见原因是WebDAV。确保卸载它。
如果是IIS 8.0,请检查是否启用了HTTP激活。服务器管理器 - > IIS - >管理(参见右上) - >添加角色和功能 - > ... - >进入WCF配置,然后选择HTTP激活。
在我们的例子中,问题在于.Net站点和ADFS之间的联合登录。当重定向到ADFS端点时,wctx
参数需要WSFederationAuthenticationModule.CreateSignInRequest
方法的所有三个参数:rm
,id
和ru
感谢Guillaume Raymond提示检查URL参数!
除了以上所有解决方案,请检查您是否有“id
”或DELETE
方法中的任何自定义参数与路由配置匹配。
public void Delete(int id)
{
//some code here
}
如果你遇到重复的405错误,最好将方法签名重置为默认值,然后尝试。
默认情况下,路由配置将在URL中查找id
。所以参数名称id
在这里很重要,除非你在App_Start
文件夹下更改路由配置。
您可以更改id
的数据类型。
例如,下面的方法应该可以正常工作:
public void Delete(string id)
{
//some code here
}
注意:还要确保通过url传递数据,而不是将有效负载作为正文内容传递的数据方法。
DELETE http://{url}/{action}/{id}
例:
DELETE http://localhost/item/1
希望能帮助到你。
我将添加那些卡住试图运行PHP
(可能情况下的Laravel
)或其他独特的IIS
托管情况与405 error
,你需要更改处理程序中的verbs
为那个特定的情况......所以,因为我使用PHP
我去了PHP
处理程序和Request Restrictions
,然后Verbs
选项卡,添加你需要的verbs
。这就是我需要添加到web.config
以在CORS
中启用Laravel
。
<handlers>
<remove name="php-5.6.40" />
<add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
您不需要卸载WebDAV,只需将这些行添加到web.config:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</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>
更改您的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>
如果以上解决方案都没有像我的情况那样解决你的问题(仍然坚持我的RestClient模块面向405)尝试使用像Postman或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)
不常见但可能有所帮助。
确保您使用System.Web.Http中的[HttpPut]
我们在HttpPut装饰方法上获得了“不允许的方法”405。
我们的问题似乎并不常见,因为我们不小心使用了System.Web.Mvc中的[HttpPut]属性而不是System.Web.Http
原因是,resharper建议使用.Mvc版本,因为当你直接从ApiController派生时我们使用了一个扩展ApiController的类,因此通常会引用System.Web.Http。
当我调用的web api post方法有参数的原始类型而不是从正文访问的复杂类型时,我已经发生了这种情况(405方法不允许)。像这样:
这有效:
[Route("update"), Authorize, HttpPost]
public int Update([FromBody] updateObject update)
这没有:
[Route("update"), Authorize, HttpPost]
public int Update(string whatever, int whatever, string whatever)
此错误来自静态文件处理程序 - 默认情况下不会过滤任何动词,但可能只处理HEAD和GET。
而这是因为没有其他处理程序加入到盘子中并表示他们可以处理DELETE。
由于您使用的是WEB API,由于路由没有文件,因此没有扩展名,因此需要在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和integratedmode,而classicmode取决于bitness。此外,OPTIONS标头已添加用于CORS处理,但如果您不执行CORS,则不需要它。
仅供参考,您的web.config是应用程序(或应用程序目录)版本的本地版本,其顶级是applicationHost.config。