web-dev-qa-db-ja.com

WebAPI Deleteが機能しない-405 Method Not Allowed

このサイトは今夜ライブを開始する予定なので、これについてお問い合わせいただきありがとうございます!

Deleteメソッドを持つWeb APIコントローラーがあります。メソッドは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オーサリングルールは無効になっているようです。

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

112
Chris

私は最終的に解決策を見つけました!同じ問題に遭遇した場合は、web.configに次を追加します

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

これが役立つことを願っています

186
Chris

場合によっては、モジュールからだけ削除すると、次のエラーが発生する可能性があります。

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

モジュール:IIS Web Core Notification:ExecuteRequestHandler "

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

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

私の場合、上記のソリューションはどれも機能していませんでした。これは、Deleteメソッドでパラメータの名前を変更があったためです。

持っていた

public void Delete(string Questionid)

の代わりに

public void Delete(string id)

idファイルで宣言されている名前なので、WebApiConfig名を使用する必要があります。 3行目と4行目のid名に注意してください。

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

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

31
Hugo Nava Kopp

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

notを使用してください:

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

POSTメソッドを使用するときのように。

13
Pavel Kharibin

ここでほとんどすべてのソリューションを試した後、これは私のために働いた。これを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>
4
Nithin Chandran

私も同じ問題を抱えていました。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;
    }
}
3
Aamir

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

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

2
Reza

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

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

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

1
user6247020

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

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

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

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

1
Paul D

リクエストには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>
0
Zadok

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

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

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

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

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