最近、Visual Studio 2010からVisual Studio 2012 RCにアップグレードしました。インストーラーは、Visual StudioがデフォルトのWebサーバーとして使用するIIS 8 Expressもインストールします。
IIS 8は、PUT AND DELETE動詞を使用するWEB API要求をブロックしています。 IISは、405エラーThe requested resource does not support http method 'PUT'
を返します。
私は過去にこれに問題があることを知っていて、Stack Overflowにはいくつかのメッセージがあります。 IIS 7 Expressでは、ソリューションはWebDavをアンインストールすることでした。残念ながら、IIS 8でこれを行う方法はありません。
Applicationhost.configからWebDavセクションを編集してみましたが、助けにはなりませんでした。たとえば、構成ファイルから<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
を削除しました。
私はこれにあまりにも長い間費やしました。 PUTとDELETEを有効にする簡単な方法が必要ですか?
はい。私はついにこれの底に着いた。 IIS8でPUTおよびDELETE動詞が正しく機能するには、いくつかのフープをジャンプする必要があります。実際、VS 2012のリリース候補をインストールし、新しいWEB APIプロジェクトを作成すると、サンプルのPUTおよびDELETEメソッドがすぐに404エラーを返すことがわかります。
Web APIでPUTおよびDELETE動詞を使用するには、次のように%userprofile%\ documents\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である必要があります。
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>
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を介して問題を解決することを常にお勧めします。アプリが別のマシンでホストされている場合は発生しません。
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>
ホスト設定を変更する必要がなくなります。
Asp.Net Web APIで-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>
この問題に遭遇する可能性のある他の人のための簡単な更新です。今日の時点では、%userprofile%\ documents\iisexpress\config\applicationhost.configを変更しても機能しなくなりました(これまでは正常に機能していましたが、Windowsの更新によるものかどうかはわかりません)。数時間のフラストレーションの後、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>
これはiis8で他のいくつかの回答とともに機能しました。私のエラーは具体的に404.6でした
<system.webServer>
<security>
<requestFiltering>
<verbs applyToWebDAV="false">
<add verb="DELETE" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
CORSを有効にする(ニースとニート)
1.CORS nugetパッケージを追加
Install-Package Microsoft.aspnet.webapi.cors
2. WebApiConfig.csファイルでメソッドを登録して、以下のコードを追加します
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
何も機能しなかった後、以下の手順でこれを解決できました。
•IISのインストール中に[WEB DAV PUBLISHING] IIS設定を選択しませんでした。 •INETMGR-デフォルトのWebサイト–要求のフィルタリング– HTTP動詞– PUTとしてTrue
無限に検索して、既に提供された回答(PUT、DELETE動詞の追加、およびWEBdavの削除)を試行した後、機能しませんでした。
IISログ設定に移動しました:>ログファイルを表示します。私の場合、W3SVC4は最新の日付のフォルダーであり、フォルダーを開いて最新のログファイルを検索し、次のエントリを見ました:GET/Rejected-By-UrlScan〜/ MYDOMAIN/API/ApiName/UpdateMETHOD
Updateメソッドは、動詞GETでリストされましたが、変ですよね?だから、Rejected-By-UrlScanをGoogleで検索して、次のリンクを見つけました: rlScan Broke My Blog 。
ここに行きました:%windir%\ system32\inetsrv\urlscan\UrlScan.ini
基本的に、UrlScanはPUTおよびDELETE動詞をブロックしました。このINIファイルを開き、PUTとDELETEをAllowVerbsに追加し、DenyVerbsリストから削除しました。 INIファイルを保存しましたが、うまくいきました!したがって、私にとっては、ExtensionlessUrlHandlerヒントの次にこれらの手順が必要でした。
Windows Webserver 2008 R2(64ビット)、IIS 7.5。これをDotNetNuke(DNN)WebAPIと組み合わせて使用しています。 ASP.Net 4.0私の更新方法:
[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)
PHPの場合、それは次のとおりです。
これは他のハンドラーでも機能すると思います。
上記のすべてのソリューションに加えて、「id」があるか、DELETEメソッドでカスタム定義されたパラメーターがルート構成と一致しているかどうかを確認します。
public void Delete(int id)
{
//some code here
}
405エラーを繰り返してヒットした場合は、上記のようにメソッドシグネチャをデフォルトにリセットしてから再試行してください。
デフォルトのルート設定は、URLでidを探します。そのため、ここでパラメータ設定idは、App_Startフォルダの下でルート設定を変更しない限り重要です。
ただし、idのデータ型を変更できます。
たとえば、次のメソッドはうまく機能するはずです。
public void Delete(string id)
{
//some code here
}
注:また、ペイロードを本文コンテンツとして運ぶデータメソッドではなく、URLを介してデータを渡すようにしてください。
DELETE http://{url}/{action}/{id}
例:
DELETE http://localhost/item/1
それが役に立てば幸い。
私はあなたと同じ問題に直面し、それを解決しました、ここに解決策があります
最初
IIS modules
構成で、WebDAVModuleをループアップします(Webサーバーにある場合)、それを削除します
第二
IIS handler mappings
構成では、有効化ハンドラーのリストを確認し、the PHP item
を選択して編集し、編集ページで[要求制限]ボタンをクリックし、モーダルでthe verbs tab
を選択し、動詞を指定します。ラベルを処理するには、all verbs radio
を確認し、[OK]をクリックします。警告が表示される場合もあります。PHP-CGIの実行に二重引用符を使用していることを示しています。
完了したら、IISサーバーを再起動します。
正しい構成ファイルを編集したかどうかはわかりません。次の手順を試してください
%userprofile%\ ducuments\iisexpress\config\applicationhost.configを開きます
デフォルトでは、指定されたエントリは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"
/>
IIS Manager GUIを使用して、追加のHTTP動詞を許可する方法を次に示します。
IIS Managerで、PUTまたはDELETEを許可するサイトを選択します。
[リクエストのフィルタリング]オプションをクリックします。 「HTTP Verbs」タブをクリックします。
サイドバーの「動詞を許可...」リンクをクリックします。
表示されるボックスに「削除」と入力し、[OK]をクリックします。
サイドバーの「動詞を許可...」リンクをクリックします。
表示されるボックスに「PUT」と入力し、[OK]をクリックします。
MVCアプリケーションでashxファイルを使用していますが、上記の答えがどれもうまくいきませんでした。 IIS 10。
これが機能したものです。 IISまたはweb.configで「ExtensionlessUrl-Integrated-4.0」を変更する代わりに、「SimpleHandlerFactory-Integrated-4.0」(「*。ashx」ファイルの場合:
<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" />
IIS 8.5/Windows 2012R2では、ここで言及したことは何も役に立ちませんでした。 WebDAVを削除することの意味はわかりませんが、それでも問題は解決しませんでした。
私を助けたのは以下の手順です。
今、すべてが機能しています。
もう1つの理由は次のとおりです。
Web ApiメソッドのURLを この回答 に従って変更しました。
Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })
ただし、このメソッドは次のようなリンクを作成します。
/api/MyApiCtrl?action=MyAction
これは、GETおよびPOST要求では正常に機能しますが、PUTまたはDELETEでは機能しません。
したがって、私はそれを次のように置き換えました:
/api/MyApiCtrl
そしてそれは問題を修正しました。