159

最近、VisualStudio2010からVisualStudio2012RCにアップグレードしました。インストーラーは、VisualStudioがデフォルトのWebサーバーとして使用するIIS8Expressもインストールします。

IIS 8は、PUTANDDELETE動詞を使用するWEBAPI要求をブロックしています。IISは405エラーを返しますThe requested resource does not support http method 'PUT'

私は人々が過去にこれに問題を抱えていることを知っています、そしてそれについてのいくつかのメッセージがStackOverflowにあります。IIS 7 Expressの解決策は、WebDavをアンインストールすることでした。残念ながら、IIS8でそれを行う方法がわかりません。

applicationhost.configからWebDavセクションを編集しようとしましたが、役に立ちませんでした。たとえば<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />、設定ファイルから削除しました。

私はこれにあまりにも長い時間を費やしました。PUTとDELETEを有効にする簡単な方法が必要ですか?

4

21 に答える 21

169

わかった。私はついにこれの底に到達しました。PUT動詞とDELETE動詞をIIS8で正しく機能させるには、いくつかのフープをジャンプする必要があります。実際、VS 2012のリリース候補をインストールし、新しいWEB APIプロジェクトを作成すると、サンプルのPUTメソッドとDELETEメソッドがすぐに404エラーを返すことがわかります。

Web APIでPUTおよびDELETE動詞を使用するには、%userprofile%\ document \ iisexpress \ config \ applicationhost.configを編集し、次のように動詞をExtensionlessUrlハンドラーに追加する必要があります。

この行を変更します。

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

に:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

上記に加えて、WebDAVがリクエストに干渉していないことを確認する必要があります。これは、applicationhost.configから次の行をコメントアウトすることで実行できます。

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" /> 
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

また、デフォルトのWeb API規則では、メソッド名は呼び出されたHTTP動詞と同じである必要があることに注意してください。たとえば、HTTP削除リクエストを送信する場合、デフォルトでは、メソッドの名前はDeleteにする必要があります。

于 2012-06-06T02:07:20.840 に答える
131

Web.Configファイルを次のように変更します。それは魅力のように振る舞います。

ノード<system.webServer>にコードの以下の部分を追加します

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

追加すると、Web.Configは次のようになります。

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <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>
于 2013-11-01T08:04:53.993 に答える
64

WebDAVを削除すると、私の場合は完全に機能します。

<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.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>

別のマシンでホストされているアプリの場合は発生しない、iisまたはmachine.configを使用して問題を修正するのではなく、web.configを使用して問題を解決することをお勧めします。

于 2015-04-27T01:36:14.977 に答える
48

web.configを更新します

  <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <add name="ExtensionlessUrl-Integrated-4.0"
           path="*."
           verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

ホスト構成を変更する必要がなくなります。

于 2014-09-23T19:43:08.737 に答える
18

Asp.NetWebAPIの場合-webconfig。これはすべてのブラウザで機能します。

System.webタグ内に次のコードを追加します

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

system.webserverタグを次のコードに置き換えます

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>

<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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

</handlers>

于 2013-08-27T06:06:31.213 に答える
5

これは、他のいくつかの回答と一緒にiis8で私のために働きました。私のエラーは特に404.6でした

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>
于 2015-01-25T01:43:13.113 に答える
5

この問題に遭遇する可能性のある他の人のための簡単な更新。今日の時点で、%userprofile%\ document \ iisexpress \ config \ applicationhost.configの変更は機能しなくなりました(これはこれまで正常に機能していましたが、これがWindows Updateによるものかどうかはわかりません)。何時間もイライラした後、web.configを変更して、これらのハンドラーをsystem.webserverに追加し、機能させました。

<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>
于 2016-01-05T23:06:32.983 に答える
5

CORSを有効にする(ニースとニート)

1.CORSnugetパッケージを追加します

Install-Package microsoft.aspnet.webapi.cors

2. WebApiConfig.csファイルでRegisterメソッドに次のコードを追加します:

config.EnableCors();

例:
System.Web.Httpを使用します。

namespace test
{
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services


        config.EnableCors(); //add this**************************


        // Web API routes
        config.MapHttpAttributeRoutes();

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

3.以下のコードをコントローラーの名前空間に追加します。get、post、delete、put、または任意のhttpメソッドが含まれます。

[EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")]

元:

using System.Web.Http.Cors;//add this******************************
namespace Test.Controllers
{
[EnableCors(origins: "http://localhost:53681/HTML/Restaurant.html", headers: "*", methods: "*")]
public class RestaurantController : ApiController
{
    protected TestBusinessLayer DevTestBLL = new TestBusinessLayer();

    public List<Restaurant> GET()
    {
        return DevTestBLL.GetRestaurant();
    }

    public List<Restaurant> DELETE(int id)
    {
        return DevTestBLL.DeleteRestaurant(id);
    }       
}
}

参照:http ://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

于 2016-01-31T18:14:16.067 に答える
4

PHPの場合、それは単純です。

  1. IISを開きます
  2. ハンドラーマッピングに移動します
  3. php5.6.xまたはphp7.0.xで[編集]をクリックします
  4. 「制限のリクエスト」をクリックします
  5. [動詞]タブで、[次の動詞のいずれか]を選択し、[GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS]を追加します

これは他のハンドラーでも機能すると思います。

于 2016-05-23T06:36:50.320 に答える
4

何も機能しなかった後、以下の手順でこれを解決することができました。

•IISのインストール中に、[WEBDAVPUBLISHING]IIS設定を選択しませんでした。•INETMGR–デフォルトのWebサイト–リクエストフィルタリング– HTTP動詞– PUT as True

于 2016-06-15T08:44:22.710 に答える
3

すでに提供されている回答を無限に検索して試した後(PUT、DELETE動詞を追加し、WEBdavを削除)、機能しませんでした。

IISログ設定に移動しました:>ログファイルの表示。私の場合、W3SVC4は最新の日付のフォルダーであり、フォルダーを開き、最新のログファイルを検索して、次のエントリを確認しました:GET / Rejected-By-UrlScan〜/ MYDOMAIN / API / ApiName / UpdateMETHOD

Updateメソッドは動詞GETでリストされていましたが、奇妙ですよね?だから私はRejected-By-UrlScanをグーグルで検索し、このリンクを見つけました:UrlScan BrokeMyBlog

ここに行きました:%windir%\ system32 \ inetsrv \ urlscan \ UrlScan.ini

基本的に、UrlScanはPUTおよびDELETE動詞をブロックしました。このINIファイルを開き、PUTとDELETEをAllowVerbsに追加して、DenyVerbsリストから削除しました。INIファイルを保存しましたが、機能しました。したがって、私にとってこれらの手順は、ExtensionlessUrlHandlerヒントの次に必要でした。

Windows Webserver 2008 R2(64ビット)、IIS7.5。これをDotNetNuke(DNN)WebAPIと組み合わせて使用​​しています。ASP.Net 4.0私の更新方法:

[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)
于 2015-04-30T22:06:44.073 に答える
3


私はあなたと同じ問題に直面し、それを解決しました、ここに解決策があります、私はそれが最初に役立つかもしれないことを望みます

IIS構成で、 WebDAVModulemodulesをループアップし、Webサーバーにある場合は、それを削除します

2番

IIShandler mappings構成では、有効化ハンドラーのリストを表示し、選択the PHP itemして編集します。編集ページで[制限の要求]ボタンをクリックthe verbs tabし、モーダルで選択し、処理する動詞のラベルを指定して、をチェックしますall verbs radio。 [OK]をクリックすると、警告が表示される場合もあります。これは、PHP-CGIの実行に二重引用符を使用していることを示しています。

完了したら、IISサーバーを再起動します。問題ありません。

ここに画像の説明を入力してください

于 2018-07-03T10:48:18.873 に答える
2

上記のすべての解決策に加えて、「id」またはDELETEメソッドのカスタム定義パラメーターがルート構成と一致しているかどうかを確認してください。

public void Delete(int id)
{
 //some code here
}

405エラーが繰り返される場合は、上記のようにメソッドシグネチャをデフォルトにリセットして試してください。

ルート設定はデフォルトでURLでIDを検索します。したがって、 App_Startフォルダーの下のルート構成を変更しない限り、ここではパラメーター名IDが重要です。

ただし、 IDのデータ型は変更できます。

たとえば、以下の方法は問題なく機能するはずです。

public void Delete(string id)
{
 //some code here
}

注:また、ペイロードを本文コンテンツとして運ぶデータメソッドではなく、URLを介してデータを渡すようにしてください。

DELETE http://{url}/{action}/{id}

例:

DELETE http://localhost/item/1

それが役に立てば幸い。

于 2015-11-16T12:25:35.623 に答える
1

IISマネージャーGUIを使用して追加のHTTP動詞を許可する方法は次のとおりです。

  1. IISマネージャーで、PUTまたはDELETEを許可するサイトを選択します。

  2. [フィルタリングのリクエスト]オプションをクリックします。「HTTP動詞」タブをクリックします。

  3. サイドバーの[動詞を許可...]リンクをクリックします。

  4. 表示されるボックスに「DELETE」と入力し、[OK]をクリックします。

  5. サイドバーの[動詞を許可...]リンクをもう一度クリックします。

  6. 表示されるボックスに「PUT」と入力し、[OK]をクリックします。

于 2017-01-30T18:44:31.227 に答える
1

MVCアプリケーションでashxファイルを使用していますが、上記の回答はどれもうまくいきませんでした。IIS10。

これがうまくいったことです。IISまたはweb.configで「 ExtensionlessUrl-Integrated-4.0 」を変更する代わりに、「 *。ashx」ファイルの「 SimpleHandlerFactory-Integrated-4.0」を変更しました。

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" 
verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
type="System.Web.UI.SimpleHandlerFactory" 
resourceType="Unspecified" requireAccess="Script" 
preCondition="integratedMode,runtimeVersionv4.0" />
于 2019-01-10T15:12:57.703 に答える
0

正しい設定ファイルを編集したかどうかわかりません。次の手順を試してください

  1. %userprofile%\ ducuments \ iisexpress \ config\applicationhost.configを開きます

  2. デフォルトでは、以下のエントリはapplicationhost.configファイルでコメント化されます。これらのエントリのコメントを解除します。

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />


<add name="WebDAVModule" />
<add name="WebDAV" path="*"
 verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK"
 modules="WebDAVModule" resourceType="Unspecified" requireAccess="None"
 />
于 2012-06-06T01:54:40.353 に答える
0

別の理由は次のとおりです。 この回答
に従って、Url forWebApiメソッドを変更しました。

Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })

ただし、このメソッドは次のようなリンクを作成します。

/api/MyApiCtrl?action=MyAction

これは、GETおよびPOST要求では正しく機能しますが、PUTまたはDELETEでは機能しません。
だから私はそれを次のように置き換えました:

/api/MyApiCtrl

そしてそれは問題を修正しました。

于 2014-04-25T09:03:01.493 に答える
0

IIS 8.5 / Windows 2012R2では、ここで言及されていることは何も機能しませんでした。WebDAVを削除することの意味はわかりませんが、問題は解決しませんでした。

私を助けたのは以下のステップです。

  1. IISマネージャーに行きました。
  2. 左側のパネルでサイトを選択しました。
  3. 左側の作業領域で、WebDAVを選択し、ダブルクリックして開きました。
  4. 右端のパネルで、無効にします。

これですべてが機能しています。

于 2017-06-08T06:07:59.307 に答える
0

requireAccess="None"私はこれをweb.config好きに追加しました

    <configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
                <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
                <remove name="WebDAV" />
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" requireAccess="None"/>
                <add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,DELETE,COPY,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
                <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,DELTE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
      </handlers>
      <aspNetCore processPath=".\Informing.Gateway.Api.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
    </system.webServer>
  </location>
</configuration>

そしてそれはうまくいった。それでおしまい

于 2021-08-28T08:59:39.307 に答える
0

エラーの試行は、この問題を解決する正しい方法ではありません。実行する必要があるのは次のとおりです。

  • PUT/DELETEリクエストをブロックするソースを特定するには
  • 次に、それを削除したり、無効にしたり、さらに適切に構成したりできます。

1-ソースを知るには、IISで失敗した要求のトレースを構成する必要があります。 ここに画像の説明を入力してください 2-ログに記録するエラーを「追加」する 必要があります。ログファイルでシステムを圧倒しないように、このトレースエントリには短い寿命を使用してください。IISは、呼び出しごとに個別のxmlファイルを生成します。3- PostmanまたはSwaggerを使用して誤ったリクエストを行い、トレースエラーエントリを生成します。4-前の画面から、[トレースログの表示]を選択して、生成されたログファイルに移動できます。5-InternetExplorerを使用して誤ったログファイルを開きます。そして、すべてのメッセージを受け入れます。 6-リクエストをブロックしているソースに注意してください。 7-他のポスターで示されているように、IISインターフェイスのモジュールまたはマッピングハンドラー、またはweb.configで無効にします。ここに画像の説明を入力してください ここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してください

于 2021-12-30T10:28:09.737 に答える
-1

DeleteメソッドをPOSTとして変換できます。

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
于 2015-09-16T18:42:27.613 に答える