2012-06-12 33 views
74

私はApiController上で次のアクション持っている:ASP.NET Web APIを:要求されたリソースは、HTTPメソッド「GET」をサポートしていません

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

を、次のように私は私のルートを設定した:

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

、これはうまく働いたが、私は、最新のリリース候補に更新され、今、私はこのような呼び出しでエラーを見ている:

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

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

(私は{アクション}を取り除くだけのコントローラーのトンを作る得ることができたとし、それが厄介に感じている。)

答えて

94

あなたがコントローラでのアクションに任意のHTTPMETHODを設定していない場合は、それが想定されRCのHttpPostだけにする。ベータ版では、GET、PUT、POST、およびDELETEのすべてのメソッドをサポートすると想定されています。これはベータからRCへの小さな変化です。あなたは[AcceptVerbs( "GET"、 "POST")]を使って複数のhttpmethodを簡単にデコレートすることができます。

+0

この問題が修正されましたが、不思議なことに、カスタムメソッドでこれを行う必要がありますが、デフォルトの「取得」メソッドではどうしてですか?私はコントローラのテンプレートによって作成されたGetメソッドを持っていますが、装飾されていません。 Get?という名前のため、これは慣例によるものですか? – SelAromDotNet

+3

@Josh:はい!アクションメソッドの名前が "Get ..."で始まる場合、GETメソッドとしてマークする必要はありません。詳細はこちらをご覧ください:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api –

+0

私は答えとして提案しましたが、現在は両方私のコールのGetとPostは、Get Actionにリダイレクトされています。助けてください? –

14

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

これは、動詞以外のアクションを動詞ベースのアクション(つまり、「GetSomething」、「PostSomething」)とミックスする場合に問題になります。上記の属性を使用しようとすると、コントローラ内の動詞ベースのアクションと競合します。 arountを取得する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コードプレックスプロジェクトhttp://aspnetwebstack.codeplex.com/workitem/184にログされている問題があります。これがあなたが見たいものなら、その問題に投票してください。

51

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

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

+0

thx @エリック、なぜそれがうまくいかないのだろうと思っていた... – jbl

+0

@エリック。素晴らしい、これが私のために働いていなかった理由だった。私の動詞には動詞がありましたが、Web.Mvcで参照されていましたので、うまくいきませんでした。 – dreza

+0

偉大な、私の一日を救いました –

25

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

私の問題は、WebAPIがリクエストを突然ルーティングする原因となったメソッドパラメータが正しくないということでした。私は私のProgrammesControllerで以下のメソッドを持っている:私は予想通り

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

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

DELETE要求へ.../API /プログラム/ 3はDeleteProgrammeにルーティングなっていなかったが、GetProgrammeByIdに、DeleteProgrammeがパラメータを持っていなかったので、 idの名前。 GetProgrammeByIdはもちろん、GETを受け入れるものとしてマークされているので、DELETEを拒否していました。

ので修正は簡単だった:

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

そして、すべてが順調です。愚かな間違いは本当に難しいが、デバッグは難しい。あなたがHttpGetとあなたの方法を飾るしている場合

14

、コントローラの先頭に次のusingを追加します。

using System.Web.Http; 

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

+1

これは当てはまり、ばかげて.NETがメッセージをはっきりと表示していません。 –

2

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

2

OPと同じ設定をしてください。 多くのアクションを持つ1つのコントローラ... less "messy" :-)

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

[HttpGet] 
public IEnumerable<string> TestApiCall() 
{ 
    return new string[] { "aa", "bb" }; 
} 
関連する問題