405メソッドはWebAPIを許可されていません


88

このエラーは非常に一般的であり、私はすべての解決策を試しましたが、どれもうまくいきませんでした。コントロールパネルで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

助言がありますか?

回答:


61

クライアントからPOSTしています:

await client.PostAsJsonAsync("api/products", product);

パッティングではありません。

Web APIメソッドは、PUTリクエストのみを受け入れます。

そう:

await client.PutAsJsonAsync("api/products", product);

コードを試行すると、エラー「HttpClient」に「PostAsJsonAsync」の定義がスローされません。
agileDev

61

同じ例外がありました。私の問題は、私が使用したことでした:

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

18

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

なんらかの理由で、削除では機能しませんでした。作成と更新は正常に機能しました。さて、[HttpPost]を追加したところ、機能しました。しかし、ありがとう、あなたは私を正しい軌道に乗せてくれて、今はたった5分しかかかりません:)
Rubenisme 2016

1
[HttpDelete]属性を追加しないのはなぜですか?
johnny 2017年

14

私の問題は、WebAPIの属性ルーティングであることが判明しました。カスタムルートを作成しましたが、WebAPIではなくGETのように扱われ、POSTであることがわかりました。

    [Route("")]
    [HttpPost] //I added this attribute explicitly, and it worked
    public void Post(ProductModel data)
    {
        ...
    }

私はそれが愚かなものでなければならないことを知っていました(それはあなたの一日を消費します)


これは私の日を救った!
Phate01

6

ChromeはOPTIONS、投稿を行う前に電話をかけようとすることがよくあります。これは、CORSヘッダーが正しいことを確認するために行われます。OPTIONSAPIコントローラーで呼び出しを処理していない場合は、問題が発生する可能性があります。

public void Options() { }

6

このエラーは、サーバーがhttps上にあるときにhttpに接続しようとしたときにも発生する可能性があります。

get-requestsはOKで、問題はpost-requestsでのみ発生したため、少し混乱しました。


4

GET呼び出しで405を取得していましたが、GETサーバー側メソッドGet(int formId)でパラメーターに名前を付けたため、ルートを変更するか、名前を変更する必要がありましたGet(int id)


4

メソッドがパラメーターを予期していて、それを渡していない場合にも、405エラーが発生する可能性があります。

これは機能しません(405エラー)

HTMLビュー/ Javascript

$.ajax({
         url: '/api/News',
         //.....

Web API:

public HttpResponseMessage GetNews(int id)

したがって、メソッドのシグネチャが上記のような場合は、次のことを行う必要があります。

HTMLビュー/ Javascript

$.ajax({
         url: '/api/News/5',
         //.....

私は...彼らはメソッドのシグネチャとパラメータの問題や問題や属性の問題などを命名規則をヒットしようとすることの事実に至るまで、すべての沸騰を行い、様々な理由のために405エラーに実行しているように見える
トムStickel

4

私はこのパーティーに遅れていますが、ほとんどの場合、上記のどれも実行可能でも機能していなかったので、これが私にとって最終的に解決された方法です。

サイト/サービスがホストされているサーバーでは、機能が必要でした!HTTPアクティベーション!!!

サーバーマネージャー>管理>役割と機能の追加>機能に到達するまで次の次へ> .NET(各バージョン)でHTTPアクティベーションにチェックマークを付けます。また、> net> WCFサービスの下に隠されているものがあることに注意してください。

これはすぐに機能しました!それは私の脳を溶かしていた


4

あなたがのようなルートを持っているなら

[Route("nuclearreactors/{reactorId}")]

メソッドでまったく同じパラメータ名を使用する必要があります。

public ReactorModel GetReactor(reactorId)
{
 ...
}

まったく同じパラメーターを渡さないと、ルートがリクエストと一致せず、WebApiが異なる許可されたHTTPメソッドを持つ別のコントローラーメソッドにヒットするため、「405メソッドは許可されていません」というエラーが発生する可能性があります。


これも答えではありません!
Divyang Desai 2017

@Div「405メソッドは許可されていません」は、ルート設定が無効であるため、メソッドがapi-callをキャッチしないため、共有した場合に表示される可能性があります。その後、api-callは、別のHTTPアクションが許可される可能性のある別の意図しないメソッドにヒットする可能性があります。はい、この回答が実際の質問に100%関連していない可能性があることに同意しますが、Xardasによる質問のタイトルはあまり具体的ではなく、タイトルに記載されている質問への回答を求めてここに上陸する多くの人々がこの答えが役に立つと思います。
roylac 2017


3

これはあなたの特定の質問に答えませんが、私が同じ問題を抱えていたとき、私はここに行き着き、より多くの人々が同じことをするかもしれないと思いました。

私が抱えていた問題は、Getメソッドを意図的に静的として宣言していたことでした。私はこれをずっと見逃しました、そしてそれは属性または同様のものからの警告を引き起こしませんでした。

間違った例:

public class EchoController : ApiController
{
    public static string Get()
    {
        return string.Empty;
    }
}

正しい:

public class EchoController : ApiController
{
    public string Get()
    {
        return string.Empty;
    }
}

2

[HttpPost]は不要です!

[Route("")]
public void Post(ProductModel data)
{
    ...
}

1
はい、明示的な[HttpPost]を必要としないという点で正しい方法ですが、規則(yikes)に従わない人もいるため、[Route( "MyMethodSaver"] public string MyMethodtoSave(int? id)-> [HttpPost]が必要で、それが機能する
Tom Stickel

2

私はこれを解決できませんでした。POSTがvoid(ASP.NET 4.0-WEBAPI 1)を返す限り、CORSを有効にして機能させました。HttpResponseMessageを返そうとすると、HTTP405応答を取得し始めました。

上記の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>

これには、OPTIONSプリフライトリクエスト(およびPOST)で呼び出されるメソッドがあります。この時点でjsonnull、通常、プリフライトリクエストにはペイロードがないため、またはポストアクションを2回実行します。
glennsl 2018

1

同様の問題がありました。私たちはからGETしようとしていました:

[RoutePrefix("api/car")]
public class CarController: ApiController{

    [HTTPGet]
    [Route("")]
    public virtual async Task<ActionResult> GetAll(){

    }

}

したがって.GET("/api/car")、これはをスローし405 errorます。


修正:

ザ・ CarController.csファイルがディレクトリにありました/api/car私たちは、このAPIエンドポイントを要求したとき、それは我々が我々が許されなかったことを仮想ディレクトリにアクセスしようとしていたように見えたので、IISがエラーを送り返すますので。

オプション1:コントローラーが存在するディレクトリを変更/名前変更します
オプション2:ルートプレフィックスを仮想ディレクトリと一致しないものに変更します。


1

私の場合、プロジェクトにWebAPIルートと同じ名前の物理フォルダー(サンドボックスなど)があり、POST要求のみがIISの静的ファイルハンドラーによってインターセプトされました(明らかに)。

予想される404ではなく誤解を招く405エラーが発生したことが、トラブルシューティングに時間がかかった理由です。

これに陥るのは簡単ではありませんが、可能です。それが誰かを助けることを願っています。


1

私の場合、POSTハンドラーは次の形式でした。

[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromRoute] int routeParam, [FromBody] PostData data)

次のように、引数交換する必要があることがわかりました。つまり、最初に本体データ、次にルートパラメータを交換する必要があります

[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromBody] PostData data, [FromRoute] int routeParam)

0

プロジェクトの.csprojファイルをチェックインして変更します

<IISUrl>http://localhost:PORT/</IISUrl>

このようなあなたのウェブサイトのURLに

<IISUrl>http://example.com:applicationName/</IISUrl>

0

同じ動作を引き起こす別の考えられる問題は、ルーティングのデフォルトパラメータです。私の場合、コントローラーは正しく配置され、インスタンス化されましたが、デフォルトのGetアクションが指定されているため、POSTはブロックされました。

config.Routes.MapHttpRoute(
    name: "GetAllRoute",
    routeTemplate: "api/{controller}.{ext}"/*,
    defaults: new { action = "Get" }*/ // this was causing the issue
);

0

私はまったく同じ問題を抱えていました。私のPOST方法がのprivate代わりであることに気付くまで、私は運が悪かったのに何が悪いのかを2時間探しましたpublic

エラーメッセージが一般的なものであるのを見ておかしいです。それが役に立てば幸い!


0

コントローラがControllerクラスから継承していることを確認してください。

それがなくてもローカルで機能するのはもっとクレイジーかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.