2016-09-18 11 views
1

私はWebAPIを構築しており、ActionNameで正しいメソッドにルーティングしようとしています。それは、私が呼び出しようとしている私のメソッドの一つで動作しますが、もう一つは404エラーを受け取ります。 WebAPI ActionName routing half working

マイWebAPIの設定ファイル

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

マイWebAPIのコントローラのメソッドは、このようなとしてフォーマットされています

この最初のものは作業1である:

[ActionName("postdb")] 
public IEnumerable<string[]> postDB(string id) 
{ ... 

この第二の1にはありません。

[ActionName("getquery")] 
public IEnumerable<string[]> getQuery(string tables) 
{ ... 

私は(温度引数として渡される文字列である)の角度から同じように、それらの両方を呼んでいる:

$http.post('api/Test/postdb/' + temp).then(function (response) { ... 

$http.get('api/Test/getquery/' + temp).then(function (response) { ... 

私は両方のアクションの名前を変更しようとしています最初のものは名前に関係なく動作し、2番目のものは名前に関係なく動作しません。私はまた、それらを並べ替え、GETとPOSTの間で変更し、引数を変更しようとしました。

提案がありますか?

答えて

2

ルーティングを設定するのにActionNameを使用する理由がわかりません。

おそらくRouteという属性があります。例えば。

[HttpPost] 
[Route("postdb")] 
// Action doesn't have to be called 'postdb' 
public IEnumerable<string[]> postDB(string id) 

ActionName

は、通常、異なる目的( Purpose of ActionName

それにもかかわらず、私は奇妙な何かがあなたの例で起こっていると思うのために使用されている - 私はActionNameがルーティングに影響を与えてはいけない設定だと思うだろう。デバッグするには、失敗したリクエストトレースを設定して、要求がアクションに到達しなかった点を確認することをお勧めします。

これらはあなたが属性でHTTPメソッドを指定することができます

  1. WebAPIの中のアクションの選択(http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection)のための基本的なルールは以下のとおりです。AcceptVerbs、HttpDelete、HTTPGET、HttpHead、HttpOptions、HttpPatch、HttpPost、またはHttpPut。

  2. コントローラメソッドの名前が "Get"、 "Post"、 "Put"、 "Delete"、 "Head"、 "Options"、または "Patch"で始まる場合は、そのHTTPメソッドをサポートします。

  3. 上記のいずれにも該当しない場合、このメソッドはPOSTをサポートします。

ので、POSTメソッドへのあなたの例ではpostdb方法かもしれマップ。しかしになる可能性があります。これは小文字のASPにあるためです。あなたが実際に(理由を問わず)をRouteの代わりに使用したい場合、NETはそれを気に入らず、ルール3を適用しました。ActionName("PostDB")[ActionName("GetQuery")]を試してください。

+0

感謝を。私はそれを変更する作業をします! – user6846524

0

2番目のアクションでパラメータtables

[ActionName("getquery")] 
public IEnumerable<string[]> getQuery(string tables) 
{ ... 

の名前は、ルート内のパラメータidの名前と一致していません。アドバイス

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