ApiControllerで次のアクションを実行しました。
public string Something()
{
return "value";
}
そして、ルートを次のように構成しました。
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
ベータ版では、これは問題なく機能しましたが、最新のリリース候補版に更新したところ、次のような呼び出しでエラーが発生しています。
要求されたリソースは、httpメソッド「GET」をサポートしていません。
なぜこれはもう機能しないのですか?
({action}を取り除き、大量のコントローラーを作成できると思いますが、それは面倒です。)
コントローラーのアクションでHttpMethodを構成していない場合、RCではHttpPostのみと見なされます。ベータ版では、GET、PUT、POSTおよびDeleteのすべてのメソッドをサポートすると想定されています。これは、ベータからRCへの小さな変更です。 [AcceptVerbs( "GET"、 "POST")]を使用すると、アクションで複数のhttpmethodを簡単にデコアできます。
上記の情報はすべて正しいです。また、[AcceptVerbs()]
注釈がSystem.Web.MvcとSystem.Web.Http名前空間の両方に存在することを指摘したいと思います。
Web APIコントローラーの場合は、System.Web.Httpを使用します。
これは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)
{
...
}
そして、すべてが順調です。本当に愚かな間違いですが、デバッグするのは難しいです。
メソッドをHttpGet
で装飾する場合は、コントローラーの上部に次のusing
を追加します。
using System.Web.Http;
System.Web.Mvc
を使用している場合、この問題が発生する可能性があります。
これは確かにベータ版から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 に問題が記録されています。これが見たいものである場合は、問題に投票してください。
上記と同じ問題ですが、根本的に大きく異なります。私にとっては、https書き換えルールを使用してエンドポイントに到達していました。 httpでクリックするとエラーが発生し、httpsで期待どおりに機能しました。
OPと同じセットアップを使用します。多くのアクションを備えた1つのコントローラー...それほど「乱雑」ではありません:-)
私の場合、新しいアクションを追加するときに「[HttpGet]」を忘れていました。
[HttpGet]
public IEnumerable<string> TestApiCall()
{
return new string[] { "aa", "bb" };
}
このパスの次のコードを置き換えます
道 :
App_Start => WebApiConfig.cs
コード:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}/{Param}",
defaults: new { id = RouteParameter.Optional,
Param = RouteParameter.Optional }
);
これがOPの投稿に関連するかどうかはわかりませんが、[HttpGet]アノテーションが欠落していたため、@ dinesh_ravvaメソッドがデフォルトでHttpPostであると想定されているため、エラーの原因でした。
私の問題は、返されたメッセージに表示されないnull参照を持つのと同じくらい簡単でした。APIをデバッグして確認する必要がありました。