WebAPI削除が機能しない-405メソッドは許可されていません


120

サイトは今夜ライブになることになっているので、これについて何か助けてくれてありがとう!

Deleteメソッドを備えたWeb APIコントローラーがあります。このメソッドは、IIS Express(Windows 8)を実行しているローカルマシンで正常に実行されますが、ライブIISサーバー(Windows Server 2008 R2)にデプロイするとすぐに機能しなくなり、次のエラーメッセージがスローされます。

HTTPエラー405.0-メソッドは許可されていません無効なメソッド(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オーサリングルールが無効になっているようです。

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

回答:


199

私は最終的に解決策を見つけました!同じ問題が発生した場合は、以下をweb.configに追加してください

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

これが役に立てば幸い


2
a

3
ここでも働いた。しかし、誰かが私にWebDAVModuleとの関係を説明できますか?
Boas Enkler 2013

11
コピーして貼り付けるだけの場合:runAllManagedModulesForAllRequests = "true"は実際には必要なく、実際には他のものを壊す可能性があります。
Zar Shardan、2014年

他のいくつかのWeb投稿では、IISモジュールセクションを使用してモジュールを削除することを提案していますが、これによりモジュールが無効になりますが、これでも同様の問題が発生します。これは最も信頼できる方法です
Anthony Main

4
@ZarShardan(およびその他)参考:runAllManagedModulesForAllRequests = "true"属性を削除する場合は、<handlers>ノードの下にも<remove name = "WebDAV" />も追加する必要があります。
アーロン

65

モジュールから削除すると、次のエラーが発生する場合があります。

500.21ハンドラ「WebDAV」のモジュールリストに不正なモジュール「WebDAVModule」があります

モジュール:IIS Webコア通知:ExecuteRequestHandler」

解決策はここに提案されました。ハンドラからも削除する必要があります。

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

1
これは私にとってはうまくいきますが、誰かが実際にWebDAVが何であるかについて少し光を当てることができますか?
Nazrul Muhaimin、

31

私の場合、上記のソリューションはどれも機能していませんでした。これは、メソッドでパラメーターの名前を変更したため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 }
        );

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


15

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メソッドを使用するときのように。


1
こんにちは@Pavel、本当に完全にRESTfulな実装を使用している場合、これは正しいです。残念ながら、誰もがこれを行うわけではなく、開発者がDELETEなどの代わりにPOSTを使用することはよくあります。これを明確にしていただきありがとうございます。
クリス

5

ここでほとんどすべての解決策を試した後、これは私にとってはうまくいきました。これを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>

多くのことを試しましたが、これはうまくいきました。.NETバージョン4.6.1-ありがとう。
ケタン

4

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

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

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

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;
    }
}

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" />

または 、マシン全体の構成ファイルを変更したくない(または変更できない)場合は、他の回答stackoverflow.com/a/47907578/1754743を使用して、独自のweb.configでこれらのハンドラーを削除してください
Ekus

2

私の場合、に追加{id}するのに失敗し[Route("")]、同じエラーが発生しました。これを追加することで問題が解決しました:[Route("{id}")]


何時間もの無駄な時間、そしてそれがあなたのためでなかったら、私はまだこれを解決できませんでした...なぜそれが404を返さないのか不思議に思っています:@
deadManN

1

WebApiコントローラーでDeleteメソッドをパブリックにすることを省略したため、405エラーのメソッドは許可されませんでした。

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

「見つかりません」ではなく「許可しない」の理由は、同じルートにGetメソッドもあったためです(これはRESTを実装する場合の通常のケースです)。public Get関数はルーティングによって照合され、間違ったhttpメソッドのために拒否されます。

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


1

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

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

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


0

私は同様の問題を抱えていましたが、PUTの場合-他の提案はどれもうまくいきませんでした。

ただし、IDのintデフォルトstringではなく使用していた。{id:int}ルートに追加すると問題が解決しました。

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

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>

-1

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

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

それはあなたのために働いている理由かもしれません。2013年の初め頃の以前のバージョンを使用していたため、かなりの数の修正が行われています。それがあなたのために働いていることを知ってうれしいです。
Chris

4
これは正直に言って良い答えではありません。これを使用して問題が解決された人々は、DELETEではなくPOSTを使用しているため、機能せず、機能しません
Alexander Derck

これは、クライアント側dataparams(つまり、リクエストのURL )ではなく(つまり、リクエストの本文)を使用しているためだと思います。
Thomas Sauvajon

私はアレクサンダー・デルクに同意します。これは解決策というよりは粗末です。
Basem Sayej 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.