このサイトは今夜ライブを開始する予定なので、これについてお問い合わせいただきありがとうございます!
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オーサリングルールは無効になっているようです。
どんなアイデアでも大歓迎ですありがとう。
私は最終的に解決策を見つけました!同じ問題に遭遇した場合は、web.configに次を追加します
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/> <!-- ADD THIS -->
</modules>
... rest of settings here
これが役立つことを願っています
場合によっては、モジュールからだけ削除すると、次のエラーが発生する可能性があります。
500.21ハンドラー「WebDAV」のモジュールリストに不正なモジュール「WebDAVModule」があります
モジュール:IIS Web Core Notification:ExecuteRequestHandler "
解決策が提案されました こちら 。また、ハンドラーから削除する必要があります。
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
私の場合、上記のソリューションはどれも機能していませんでした。これは、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 からこの解決策を得ました。
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
メソッドを使用するときのように。
ここでほとんどすべてのソリューションを試した後、これは私のために働いた。これを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>
私も同じ問題を抱えていました。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;
}
}
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" />
私の場合、{id}
を[Route("")]
に追加するのに失敗し、同じエラーが発生しました。それを追加することで問題が解決しました:[Route("{id}")]
追加するだけです。これが設定の場合
config.Routes.MapHttpRoute( name: "DefaultApi"、 routeTemplate: "api/{controller}/{id}"、 defaults:new {id = RouteParameter.Optional }
hugoが言ったように続けてください。Route属性をコントローラーのgetメソッドに設定しないでください。これは私の場合問題になります。
WebApiコントローラーでDeleteメソッドをパブリックにすることを省略したため、405エラーMethod Not Allowedが発生しました。
この場合、Not Foundエラーが予想されるため、これを見つけるのに長い時間がかかりました(長すぎます!)ので、Deleteメソッドが拒否されていると誤って想定していました。
Not FoundではなくNot Allowedの理由は、同じルートに対してGetメソッドも持っていたためです(RESTを実装する場合は通常の方法です)。パブリックGet関数はルーティングと一致し、httpメソッドが間違っているために拒否されます。
私が知っている単純なエラーですが、誰か他の人の時間を節約するかもしれません。
リクエストには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>
Deleteメソッドの上部にある[HttpPost]属性は、この問題を解決しました。
[HttpPost]
public void Delete(int Id)
{
//Delete logic
}
私は同様の問題を抱えていましたが、PUTについては-他の提案はどれもうまくいきませんでした。
ただし、IDにデフォルトのint
ではなくstring
を使用していました。ルートに{id:int}
を追加すると、問題が解決しました。
[Route("api/Project/{id:int}")]
public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
{
...
}