99

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

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

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

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

ベータ版では問題なく動作しましたが、最新の Release Candidate に更新したところ、次のような呼び出しでエラーが発生しています。

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

なぜこれが機能しなくなったのですか?

({action} を削除して大量のコントローラーを作成できると思いますが、面倒です。)

4

11 に答える 11

112

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

于 2012-06-12T23:52:29.590 に答える
55

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

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

于 2012-07-20T22:56:44.340 に答える
35

これはOPへの回答ではありませんが、まったく異なる根本原因からまったく同じエラーが発生しました。したがって、これが他の誰かに役立つ場合に備えて...

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

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

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

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

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

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

そして、すべて順調です。ばかげた間違いですが、デバッグするのは難しいです。

于 2014-01-29T10:49:10.227 に答える
28

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

using System.Web.Http;

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

于 2014-06-24T10:08:26.687 に答える
15

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

于 2012-06-28T22:43:57.397 に答える
8

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

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

[HttpGet]
public IEnumerable<string> TestApiCall()
{
    return new string[] { "aa", "bb" };
}
于 2016-07-19T10:20:03.153 に答える
7

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

于 2016-04-27T16:34:16.180 に答える
0

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

于 2019-08-09T23:16:38.317 に答える