2016-06-29 5 views
2

質問の背景ルーティング:WEBAPI - 複数のは、同一の署名とアクションをGET - 問題

を私は2つのアクションメソッドを持っている私のWEBAPI内の単一のコントローラを持っています。これらの2つのアクションメソッドはGETであり、パラメータはありません。

「GetMessages」という名前のアクションメソッドと、「GetEmployeeList」という名前のアクションメソッドがあります。

問題:

これらの私のコントローラで、次のアクションメソッドは、次のとおりです。

[HttpGet] 
public string GetMessages() 
{ 
    return "Get Messages Endpoint"; 
} 

[HttpGet] 
public string GetEmployeeList() 
{ 
    return "Get Employees Endpoint"; 
} 

これらは私がWepApiConfig

config.Routes.MapHttpRoute(
    name: "Messages", 
    routeTemplate: "v2/api/People/{action}/{id}", 
    defaults: new { action = "GetMessages", id = RouteParameter.Optional }); 


    config.Routes.MapHttpRoute(
    name: "Employees", 
    routeTemplate: "v2/api/People/{action}/{id}", 
    defaults: new { action = "GetEmployeeList", id = RouteParameter.Optional}); 

で設定した税関ルートがある場合にはI次のURLのいずれかを呼び出してください:

/v2/api/People/GetMessages 
/v2/api/People/GetEmployeeList 

は、私は複数のアクションは、URL要求と一致していることを述べ、次の例外メッセージをreceieve:

Multiple actions were found that match the request: System.Net.Http.HttpResponseMessage GetMessages() on type Persons.PeopleController System.Net.Http.HttpResponseMessage GetEmployeeList() on Persons.PeopleController 

は、どのように私は、同じシグネチャを持つI使用2つのGETアクション・メソッド一緒ので、これを是正することはできますか?

+0

ここで私の答えをチェックしてください:http://stackoverflow.com/questions/37608637/rest-web-api-2-makes-a-call-to-action-methond-without-invoked/37608831#37608831 –

答えて

3

(ルートテンプレートでアクション名を何卒ご了承下さい)私はポイントを取得していない可能性がありますが、なぜあなたは、単にこのようなルートを調整していない:

config.Routes.MapHttpRoute(
    name: "Messages", 
    routeTemplate: "v2/api/People/GetMessages/{id}", 
    defaults: new { action = "GetMessages", id = RouteParameter.Optional }); 

config.Routes.MapHttpRoute(
    name: "Employees", 
    routeTemplate: "v2/api/People/GetEmployeeList/{id}", 
    defaults: new { action = "GetEmployeeList", id = RouteParameter.Optional}); 

私はむしろに行くだろうがより一般的なオプション:

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

このようにして、両方のアクションを1つのルートでカバーすることができます。このオプションを選択しない理由はありますか?

0

各メソッドのルートを個別に指定することはどうですか?

[RoutePrefix("api/people")] 
public class MyController : ApiController 
{ 
    [HttpGet] 
    [Route("messages")] 
    public string GetMessages() 
    { 
     return "Get Messages Endpoint"; 
    } 

    [HttpGet] 
    [Route("employees")] 
    public string GetEmployeeList() 
    { 
     return "Get Employees Endpoint"; 
    } 
}  

ので、あなたは、次の2つのルートを持っている必要がいけない

0

をもう少しRESTfulなあなたの例よりも見えた私見

/v2/api/people/messages 
/v2/api/people/employees 

のようなあなたのURLを持つことになります。 1つで十分です。あなたのルートを次のように変更してみてください。

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

ルートを個別に指定することはできますが、する必要はありません。ウェブAPIへの呼び出しが100%正しいことを確認してください。

関連する問題