ASP.NET Web API:要求されたリソースはhttpメソッド 'GET'をサポートしていません


92

ApiControllerで次のアクションを実行します。

public string Something()
{
    return "value";
}

また、ルートを次のように構成しました。

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

ベータ版ではこれで問題なく動作しましたが、最新のリリース候補に更新したところ、次のような呼び出しでエラーが発生しました。

リクエストされたリソースはhttpメソッド「GET」をサポートしていません。

なぜこれが機能しないのですか?

(私は{action}を削除して大量のコントローラーを作ることができると思いますが、それは面倒に感じます。)

回答:


107

コントローラーのアクションでHttpMethodを構成していない場合、RCではHttpPostのみであると想定されます。ベータ版では、GET、PUT、POST、およびDeleteのすべてのメソッドをサポートすると想定されています。これはベータ版からRCへの小さな変更です。[AcceptVerbs( "GET"、 "POST")]を使用すると、アクションで複数のhttpmethodを簡単にデコアできます。


修正のおかげでこれに遭遇したばかりですが、奇妙ですが、なぜデフォルトの「Get」メソッドではなく、カスタムメソッドでこれを実行する必要があるのですか?コントローラーのテンプレートによって作成されたGetメソッドがありますが、装飾されていません。Getという名前のため、これは慣例によるものですか?
SelAromDotNet 2014

3
@ジョシュ:はい!アクションメソッドの名前が「Get ...」で始まる場合、GETメソッドとしてマークする必要はありません。もっとここで読む:asp.net/web-api/overview/web-api-routing-and-actions/...
ジェニー・オライリー

私は答えで提案されたように行いましたが、私の呼び出し、GetとPostの両方がGet Actionにリダイレクトされています。何か助けてください?
Syed Ali Taqi

54

上記の情報はすべて正しいので、[AcceptVerbs()]注釈がSystem.Web.Mvc名前空間とSystem.Web.Http名前空間の両方に存在することも指摘しておきます。

Web APIコントローラーの場合は、System.Web.Httpを使用します。


@エリック。すばらしい、これが私にとってうまくいかなかった理由でした。アクションに動詞がありましたが、Web.Mvcを介して参照されたため機能しませんでした。
dreza 2013年

グレート、あなたは私の日を救った
ホセイン・ナリマニ・ラッド

System.Web.Mvcは私にとって良くなかったので、どうもありがとう。
BurakKarakuş16年

34

これはOPに対する回答ではありませんが、根本的な原因がまったく異なるため、まったく同じエラーが発生しました。これが他の誰かを助ける場合に備えて...

私にとっての問題は、WebAPIが要求を予期せずルーティングする原因となった、誤った名前のメソッドパラメータでした。ProgrammesControllerには次のメソッドがあります。

[HttpGet]
public Programme GetProgrammeById(int id)
{
    ...
}

[HttpDelete]
public bool DeleteProgramme(int programmeId)
{
    ...
}

... / api / programmes / 3へのDELETEリクエストは、期待どおりにDeleteProgrammeにルーティングされませんでしたが、DeleteProgrammeにidのパラメーター名がなかったため、GetProgrammeByIdにルーティングされました。GetProgrammeByIdはもちろん、GETのみを受け入れるものとしてマークされているため、DELETEを拒否していました。

したがって、修正は簡単でした:

[HttpDelete]
public bool DeleteProgramme(int id)
{
    ...
}

そして、すべてが順調です。愚かな間違いは本当にあるが、デバッグするのは難しい。


1
誰かがURLルーティングを使用している場合は、[Route( "{programmeId = programmeId:int}")]のようにしてみてください
sree

1
これで終わりです。WebApiConfig-> MapHttpRoutesには-> routeTemplate: "api / {controller} / {id}"があったため、「id」のパラメーターを使用する必要がありました。
HockeyJ 2018年

1
あなたの答えは少し違う私の問題を私に指摘しました私はメソッドの1つの[FromUri]パラメーターの名前を変更し、クライアント側でそれを更新しませんでした
Matus

22

メソッドをHttpGetで装飾している場合usingは、コントローラーの上部に以下を追加します。

using System.Web.Http;

を使用しているSystem.Web.Mvc場合、この問題が発生する可能性があります。


5
これは本当であり、途方もなく.NETはメッセージを明確に表示していません。
Teoman Shipahi

15

これは確かにベータ版からRCへの変更です。質問の例では、アクションを[HttpGet]または[AcceptVerbs( "GET")]で装飾する必要があります。

これは、動詞ベースのアクション(「GetSomething」、「PostSomething」など)を非動詞ベースのアクションと混在させたい場合に問題を引き起こします。上記の属性を使用しようとすると、コントローラーの動詞ベースのアクションと競合します。動詞ごとに個別のルートを定義し、デフォルトのアクションを動詞の名前に設定することで、問題を回避する1つの方法です。このアプローチは、APIで子リソースを定義するために使用できます。たとえば、次のコードは「/ resource / id / children」をサポートしています。ここで、idと子はオプションです。

        context.Routes.MapHttpRoute(
           name: "Api_Get",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Get" },
           constraints: new { httpMethod = new HttpMethodConstraint("GET") }
        );

        context.Routes.MapHttpRoute(
           name: "Api_Post",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Post" },
           constraints: new { httpMethod = new HttpMethodConstraint("POST") }
        );

うまくいけば、Web APIの将来のバージョンでは、このシナリオのサポートが改善されるでしょう。現在、aspnetwebstack codeplexプロジェクトhttp://aspnetwebstack.codeplex.com/workitem/184に記録されている問題があります 。これがあなたが見たいものであるならば、問題に投票してください。


8

OPと同じセットアップを使用します。多くのアクションを備えた1つのコントローラー...「面倒」が少ない:-)

私の場合、新しいアクションを追加するときに「[HttpGet]」を忘れました。

[HttpGet]
public IEnumerable<string> TestApiCall()
{
    return new string[] { "aa", "bb" };
}

6

上記と同じ問題ですが、根本は大きく異なります。私にとっては、httpsリライトルールでエンドポイントにアクセスしていたということです。httpでヒットするとエラーが発生し、httpsで期待どおりに機能しました。


3

このパスの次のコードを置き換えます

道 :

App_Start => WebApiConfig.cs

コード:

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


0

私の問題は、返されたメッセージに表示されないnull参照があるのと同じくらい簡単でした。それを確認するには、APIをデバッグする必要がありました。

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