WebAPI 删除不起作用 - 405 方法不允许

136

今晚网站即将上线,希望能得到任何帮助!

我有一个Web API控制器,其中包含一个Delete方法。该方法在我的本地机器上运行IIS Express(Windows 8)时正常执行,但是一旦我将其部署到实际IIS服务器(Windows Server 2008 R2),它就停止工作并抛出以下错误消息:

HTTP错误405.0-方法不允许使用 您要查找的页面无法显示,因为正在使用无效的方法(HTTP动词)

我已经在网络上寻找了解决方案,并实施了大多数合理的解决方案。我的Web配置具有以下设置:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
<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>

我也尝试过在IIS中更改处理程序映射和请求过滤,但都没有成功。请注意,IIS中的WebDAV创作规则似乎被禁用了。

非常感谢任何想法。

15个回答

1

我正在开发 .Net 5 Api 项目,并添加:

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

to the <system.webServer> part of web.config and

  <handlers>
        <remove name="WebDAV" />
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,PUT,DELETE,DEBUG" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
        
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
  </handlers>

他帮我解决了问题。

然而,棘手的部分是如何在 Azure DevOps CI-CD 管道中使其工作。
我设法做到了,并在这里讲述了我是如何做到的: Azure DevOps Release Pipeline Web.Config Edit


1
我正在使用.NET 6 API和MVC,将此代码放入了两个web.config文件中,现在它可以正常工作。谢谢! - Victor_Tlepshev

1
我因未将WebApi控制器上的Delete方法公开而遇到了405错误Method Not Allowed。
我找了很长时间才发现这个错误(太久了!),因为在这种情况下,我原本以为会出现Not Found错误,所以我错误地认为我的Delete方法被拒绝了。
之所以出现Not Allowed而不是Not Found的原因是,我为同一路由设置了Get方法(在实现REST时通常会这样做)。路由匹配了公共的Get函数,但由于http方法错误而被拒绝。
一个简单的错误,但它可能会节省其他人的时间。

1

补充一下,如果这是您的配置

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }

请按照Hugo所说的继续操作,并不要为控制器的获取方法设置路由属性,这在我的情况下会导致问题。


0
我们不得不在我们的web.config中添加自定义头,因为我们的请求有多个标题,导致API响应混乱。
<httpProtocol>
    <customHeaders>
        <remove name="Access-Control-Allow-Methods" />
        <remove name="Access-Control-Allow-Origin" />
        <remove name="Access-Control-Allow-Headers" />
    </customHeaders>
</httpProtocol>

-4
在我的情况下,在Delete方法的顶部添加[HttpPost]属性解决了这个问题。
[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}

这可能是它能为你工作的原因。我使用的是早期版本,大约是2013年初的版本,所以很多问题已经得到解决。不过很高兴知道它能为你工作。 - Chris
4
说实话,这不是一个好的答案。那些通过此方法解决问题的人正在使用POST而不是DELETE,因此它不能也不应该起作用。 - Alexander Derck
我认为这是因为你在客户端使用 data(即请求的正文)而不是 params(即请求的 url)。 - Thomas Sauvajon
我同意Alexander Derck的观点,这只是一个临时解决方案而不是真正的解决方案。 - Basem Sayej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接