129

感谢您对此提供的任何帮助,因为该网站应该在今晚上线!

我有一个带有 Delete 方法的 web api 控制器。该方法在我运行 IIS Express(Windows 8)的本地机器上执行良好,但一旦我将它部署到实时 IIS 服务器(Windows Server 2008 R2),它就停止工作并抛出以下错误消息:

HTTP 错误 405.0 - Method Not Allowed 无法显示您正在查找的页面,因为使用了无效的方法(HTTP 动词)

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

<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 创作规则似乎已被禁用。

任何想法将不胜感激谢谢。

4

14 回答 14

213

我最终找到了解决方案!如果您遇到同样的问题,请将以下内容添加到您的 web.config

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here

我希望这有帮助

于 2013-03-25T16:05:03.323 回答
71

在某些情况下,仅从模块中删除它会产生下一个错误:

500.21处理程序“WebDAV”在其模块列表中有一个错误模块“WebDAVModule”

模块:IIS Web 核心通知:ExecuteRequestHandler”

这里提出了解决方案。还需要从处理程序中删除它。

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
于 2014-09-22T12:58:57.227 回答
32

就我而言,上述解决方案均无效。这是因为我更改Delete方法中的参数名称。

我有

public void Delete(string Questionid)

代替

public void Delete(string id)

我需要使用该id名称,因为这是在我的WebApiConfig文件中声明的名称。请注意id第三行和第四行中的名称:

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

我从这里得到了这个解决方案。

于 2015-03-13T10:12:13.210 回答
15

HTTPDELETE动词的 Javascript 必须是这样的:

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

不要使用这样的东西

...
data: {id:id}
...

就像您使用该POST方法时一样。

于 2015-04-16T07:54:47.783 回答
7

如果您使用的是 IIS 7.0 或更高版本。此问题主要与 IIS 服务器上的 WebDAV 扩展模块有关。这发生在使用发布或删除操作时。

请在网络配置中尝试以下设置

<system.webServer>
   <modules>
       <remove name="WebDAVModule" />
   </modules>
   <handlers>
     <remove name="WebDAV" />
   </handlers>
</system.webServer>
于 2020-03-20T10:10:53.233 回答
6

在这里尝试了几乎所有解决方案后,这对我有用。将此添加到您的 API 配置文件中

<system.webServer>
    <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>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
</system.webServer>
于 2017-12-20T13:51:53.180 回答
3

我也遇到了同样的问题,我正在调用 WebAPi 并收到此错误。在 web.config 中为服务添加以下配置解决了我的问题

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

在 web.config 文件中解决了我的问题。这就是我从客户端调用的方式

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(environment.ServiceUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
    if (response.IsSuccessStatusCode)
    {
        string strResult = response.Content.ReadAsAsync<string>().Result;
    }
}
于 2015-05-20T02:01:01.087 回答
2

转到 applicationHost.config(通常在 C:\Windows\System32\inetsrv\config 下)文件并注释掉 applicationHost.config 中的以下行

1)在 <handlers> 下:

<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

2)还注释掉上述处理程序在 <modules> 下引用的以下模块

<add name="WebDAVModule" />
于 2016-01-08T11:59:16.257 回答
2

就我而言,我错过了添加{id}[Route("")]我得到了同样的错误。添加它为我解决了这个问题:[Route("{id}")]

于 2019-04-05T06:10:29.820 回答
1

只是补充。如果这是你的配置

config.Routes.MapHttpRoute(
            名称:“默认API”,
            routeTemplate: "api/{controller}/{id}",
            默认值:新 { id = RouteParameter.Optional }

请按照 Hugo 所说的继续做,不要将 Route 属性设置为控制器的 get 方法,这在我的情况下是个问题。

于 2016-04-24T09:42:27.687 回答
1

我有 405 错误 Method Not Allowed 因为我忽略了将 WebApi 控制器上的 Delete 方法公开。

我花了很长时间才找到这个(太长了!),因为在这种情况下我会预料到 Not Found 错误,所以我错误地假设我的 Delete 方法被拒绝了。

Not Allowed 而不是 Not Found 的原因是我也有一个 Get 方法用于相同的路由(这将是实现 REST 时的正常情况)。public Get 函数被路由匹配,然后因为 http 方法错误而被拒绝。

我知道一个简单的错误,但它可能会为其他人节省一些时间。

于 2016-03-24T12:19:18.917 回答
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>
于 2017-03-31T20:47:40.960 回答
0

我有类似的问题,但对于 PUT - 没有其他建议对我有用。

但是我使用的是idint而不是默认值。string添加{id:int}到路线解决了我的问题。

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }
于 2016-06-20T12:24:35.043 回答
-2

Delete 方法顶部的 [HttpPost] 属性为我解决了这个问题:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}
于 2015-01-26T07:54:57.327 回答