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

时间:2013-03-25 15:47:44

标签: asp.net-mvc asp.net-mvc-4 http-status-code-405

我感谢任何帮助,因为该网站应该今晚上线!

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

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

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

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

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

14 个答案:

答案 0 :(得分:177)

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

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

我希望这会有所帮助

答案 1 :(得分:54)

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

  

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

     

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

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

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

答案 2 :(得分:30)

就我而言,上述解决方案均无效。这是因为我在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 }
        );

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

答案 3 :(得分:13)

HTTP DELETE动词的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方法时一样。

答案 4 :(得分:5)

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

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

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

答案 5 :(得分:3)

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

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId "com.example.zephyr.myapplication"
        minSdkVersion 15
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
        full {
            minSdkVersion 14
            applicationId 'full'
            targetSdkVersion 17
        }
        home {
            minSdkVersion 14
            applicationId 'home'
            targetSdkVersion 17
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
web.config文件中的

解决了我的问题。 这就是我如何从客户端打电话

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

答案 6 :(得分:3)

在尝试了几乎所有解决方案后,这对我有用。 在您的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>

答案 7 :(得分:2)

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

1)在&lt; handlers&gt;下:

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

2)同时注释掉上述处理程序在&lt; modules&gt;

下引用的以下模块
<add name="WebDAVModule" />

答案 8 :(得分:1)

我有405错误方法不允许,因为我省略了将WebApi控制器上的Delete方法公开。

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

不允许而不是未找到的原因是我也有一个相同路由的Get方法(这是实现REST时的正常情况)。公共Get函数与路由匹配,然后由于错误的http方法而被拒绝。

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

答案 9 :(得分:1)

只是添加。如果这是你的配置

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

请像Hugo说的那样继续做,并且不要将Route属性设置为控制器get方法,这在我的情况下会出现问题。

答案 10 :(得分:1)

在我的情况下,我错过了将[Route("")]添加到[Route("{id}")]的操作,但遇到了同样的错误。 补充说,这为我解决了这个问题:{{1}}

答案 11 :(得分:0)

Delete方法顶部的

[HttpPost]属性为我解决了这个问题:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}

答案 12 :(得分:0)

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

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

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }

答案 13 :(得分: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>