このエラーは非常に一般的であり、すべての解決策を試してみましたが、それらのいずれも機能しませんでした。コントロールパネルでWebDAV発行を無効にし、これをWeb構成ファイルに追加しました。
<handlers>
<remove name="WebDAV"/>
</handlers>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
エラーは引き続き発生します。これはコントローラーです:
static readonly IProductRepository repository = new ProductRepository();
public Product Put(Product p)
{
return repository.Add(p);
}
メソッドの実装:
public Product Add(Product item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
item.Id = _nextId++;
products.Add(item);
return item;
}
そして、これは例外がスローされる場所です:
client.BaseAddress = new Uri("http://localhost:5106/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.PostAsJsonAsync("api/products", product);//405 exception
助言がありますか?
クライアントからPOSTしています:
await client.PostAsJsonAsync("api/products", product);
pUTではありません。
Web APIメソッドは、PUT要求のみを受け入れます。
そう:
await client.PutAsJsonAsync("api/products", product);
同じ例外がありました。私の問題は、私が使用していたことでした:
using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!!
[HttpGet]
public string Blah()
{
return "blah";
}
あるべき
using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!!
[HttpGet]
public string Blah()
{
return "blah";
}
DELETEメソッドを機能させるために多くのことを試みました(405のメソッドはWeb APIを許可していませんでした)、最後に[Route( "api/scan/{id}")]をコントローラーに追加し、うまくいきました。この投稿がお役に立てば幸いです。
// DELETE api/Scan/5
[Route("api/scan/{id}")]
[ResponseType(typeof(Scan))]
public IHttpActionResult DeleteScan(int id)
{
Scan scan = db.Scans.Find(id);
if (scan == null)
{
return NotFound();
}
db.Scans.Remove(scan);
db.SaveChanges();
return Ok(scan);
}
私の問題は、WebAPIの属性ルーティングであることが判明しました。カスタムルートを作成し、WebAPIではなくGETのように処理して、POSTであることを発見しました
[Route("")]
[HttpPost] //I added this attribute explicitly, and it worked
public void Post(ProductModel data)
{
...
}
私はそれがばかげたものでなければならないことを知っていました(それはあなたの一日を消費します)
ここに1つの解決策があります
<handlers accessPolicy="Read, Script"> <remove name="WebDAV" /> </handlers>
モジュールからWebDAVを削除する
<remove name="WebDAVModule" />
このエラーは、サーバーがhttps上にあるときにhttpに接続しようとした場合にも発生する可能性があります。
私のgetリクエストはOKだったため、少し混乱しました。問題はpost-requestにのみ存在していました。
次のようなルートがある場合
[Route("nuclearreactors/{reactorId}")]
メソッドでは、まったく同じパラメーター名を使用する必要があります。
public ReactorModel GetReactor(reactorId)
{
...
}
まったく同じパラメーターを渡さないと、「405 method not allowed」というエラーが表示される場合があります。これは、ルートがリクエストと一致せず、WebApiが異なる許可されたHTTPメソッドを持つ異なるコントローラーメソッドをヒットするためです。
GET呼び出しで405を取得していましたが、GETサーバー側メソッドGet(int formId)
のパラメーターに名前を付けたため、ルートを変更するか、Get(int id)
に名前を変更する必要がありました。
Chromeは、投稿を行う前にOPTIONS
呼び出しを試みることがよくあります。これは、CORSヘッダーが正しいことを確認するために行われます。 APIコントローラーでOPTIONS
呼び出しを処理していない場合、問題が発生する可能性があります。
public void Options() { }
メソッドがパラメータを予期していて、それを渡していない場合、405エラーが発生することもあります。
これは機能しません(405エラー)
HTMLビュー/ Javascript
$.ajax({
url: '/api/News',
//.....
Web API:
public HttpResponseMessage GetNews(int id)
したがって、メソッドのシグネチャが上記のような場合は、以下を実行する必要があります:
HTMLビュー/ Javascript
$.ajax({
url: '/api/News/5',
//.....
私はこのパーティーに遅れていますが、ほとんどの場合、上記のいずれも実行可能または機能していなかったため、これが最終的に解決されました。
サイト/サービスがホストされているサーバーでは、機能が必要でした! HTTPアクティベーション!!!
[サーバーマネージャー]> [管理]> [役割と機能の追加]> [次へ]次に[機能]> [。 > net> WCF Servicesの下に隠されているものもあります。
これはすぐに機能しました!それは私の脳を溶かしていた
これを解決できませんでした。 POSTがvoid(ASP.NET 4.0-WEBAPI 1)を返す限り、CORSを有効にして動作していました。 HttpResponseMessageを返そうとすると、HTTP 405応答を取得し始めました。
上記のLladの回答に基づいて、私は自分の参考文献を調べました。
POSTメソッドの上にリストされている属性[System.Web.Mvc.HttpPost]がありました。
私はこれを使用するように変更しました:
[System.Web.Http.HttpPostAttribute]
[HttpOptions]
public HttpResponseMessage Post(object json)
{
...
return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}
これは私の悩みを解決しました。これが他の人の助けになることを願っています。
完全を期すために、web.configには次のものが含まれています。
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" />
<add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" />
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
[HttpPost]は不要です!
[Route("")]
public void Post(ProductModel data)
{
...
}
これはあなたの特定の質問には答えませんが、私が同じ問題を抱えたとき、私はここにたどり着き、より多くの人々が同じことをするかもしれないと考えました。
私が抱えていた問題は、Getメソッドを意図的にstaticとして宣言していたことです。私はこれを完全に先を見越しており、属性などからの警告は発生しませんでした。
間違った:
public class EchoController : ApiController
{
public static string Get()
{
return string.Empty;
}
}
正しい:
public class EchoController : ApiController
{
public string Get()
{
return string.Empty;
}
}
同じ動作を引き起こす可能性のある別の問題は、ルーティングのデフォルトパラメータです。私の場合、コントローラーは正しく配置およびインスタンス化されましたが、デフォルトのGet
アクションが指定されているため、POSTはブロックされました。
config.Routes.MapHttpRoute(
name: "GetAllRoute",
routeTemplate: "api/{controller}.{ext}"/*,
defaults: new { action = "Get" }*/ // this was causing the issue
);
私はまったく同じ問題を抱えていました。 POST
メソッドがprivate
ではなくpublic
であることに気付くまで、運が悪かったのを2時間探しました。
エラーメッセージが一般的なものであることがわかりました。それが役に立てば幸い!
私の場合、プロジェクトにWebAPIルート(サンドボックスなど)と同じ名前の物理フォルダーがあり、POST要求のみがIISの静的ファイルハンドラーによってインターセプトされました。 (明らかに)。
予想される404エラーではなく、誤解を招く405エラーが発生したことが、トラブルシューティングに時間がかかった理由でした。
これに陥るのは簡単ではありませんが、可能です。それが誰かを助けることを願っています。
プロジェクトの.csprojファイルをチェックインして変更します
<IISUrl>http://localhost:PORT/</IISUrl>
このようなあなたのウェブサイトのURLへ
<IISUrl>http://example.com:applicationName/</IISUrl>