web-dev-qa-db-ja.com

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

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

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

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

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

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

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

なぜこれはもう機能しないのですか?

({action}を取り除き、大量のコントローラーを作成できると思いますが、それは面倒です。)

87
Josh Schultz

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

107
dinesh ravva

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

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

52
Eric

これは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)
{
    ...
}

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

33
Carl Sharman

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

using System.Web.Http;

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

19
Sohail xIN3N

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

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

        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 に問題が記録されています。これが見たいものである場合は、問題に投票してください。

14
Jeremy

上記と同じ問題ですが、根本的に大きく異なります。私にとっては、https書き換えルールを使用してエンドポイントに到達していました。 httpでクリックするとエラーが発生し、httpsで期待どおりに機能しました。

4
Vern D.

OPと同じセットアップを使用します。多くのアクションを備えた1つのコントローラー...それほど「乱雑」ではありません:-)

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

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

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

道 :

App_Start => WebApiConfig.cs

コード:

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

これがOPの投稿に関連するかどうかはわかりませんが、[HttpGet]アノテーションが欠落していたため、@ dinesh_ravvaメソッドがデフォルトでHttpPostであると想定されているため、エラーの原因でした。

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

0
Ninos