129

サイトは今夜公開される予定なので、これについての助けに感謝します!

Deleteメソッドを備えたWebAPIコントローラーがあります。このメソッドは、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オーサリングルールが無効になっているように見えることに注意してください。

どんなアイデアでも大歓迎ですありがとう。

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ます。id3行目と4行目の名前に注意してください。

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

私はここからこの解決策を得ました。

于 2015-03-13T10:12:13.210 に答える
15

HTTP動詞のJavascriptは次のDELETEようにする必要があります。

$.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

IIS7.0以降のバージョンを使用している場合。この問題は、主にIISサーバー上のWebDAV拡張モジュールに関連しています。これは、投稿または削除アクションの使用中に発生しました。

以下のWeb設定の設定をお試しください

<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)<ハンドラー>の下:

<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

WebApiコントローラーのDeleteメソッドをパブリックにすることを省略したため、405エラーのMethodNotAllowedが発生しました。

この場合はNotFoundエラーが予想されたため、これを見つけるのに長い時間がかかりました(長すぎます!)。そのため、Deleteメソッドが拒否されていると誤って想定していました。

NotFoundではなくNotAllowedの理由は、同じルートに対してGetメソッドも持っていたためです(これは、RESTを実装する場合の通常のケースです)。パブリックGet関数はルーティングによって照合され、httpメソッドが間違っているために拒否されます。

私が知っている単純なエラーですが、他の誰かの時間を節約できるかもしれません。

于 2016-03-24T12:19:18.917 に答える
1

追加するだけです。これがあなたの設定である場合

config.Routes.MapHttpRoute(
            名前: "DefaultApi"、
            routeTemplate: "api / {controller} / {id}"、
            デフォルト:new {id = RouteParameter.Optional}

Hugoが言ったように続けてください、そしてルート属性をコントローラーのgetメソッドに設定しないでください、これは私の場合問題を引き起こしました。

于 2016-04-24T09:42:27.687 に答える
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 に答える
0

リクエストにはAPI応答を混乱させる複数のヘッダーが含まれていたため、web.configにカスタムヘッダーを追加する必要がありました。

<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 に答える
-2

Deleteメソッドの上部にある[HttpPost]属性は、この問題を解決しました。

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