2017-05-25 17 views
0

私はいくつかのSO postsを読みましたが、それらのどれも私のシナリオをカバーしていませんので、ここに投稿します。私はこのようにそれを行うことはIHttpActionSelectorのための十分な曖昧さ回避のだろうと思ったリクエストに一致する複数のアクションが見つかりました:WebAPI 2

public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request) 
{ 

} 

public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request) 
{ 

} 


public class GetDocumentsRequest 
{ 
    public string CorrelationId { get; set; } 
    public int Id { get; set; } 
    public string ObjectId { get; set; } 
    public string BusinessArea { get; set; } 
    public string UserId { get; set; } 
    public string SystemName { get; set; } 
    public string SystemToken { get; set; } 
    public Letter LetterDetails { get; set; } 
    public List<KeyValuePair<string, string>> KeyValue { get; set; } 
} 

public class FinishDocumentsRequest 
{ 
    public string CorrelationId { get; set; } 
    public string[] Documents { get; set; } 
} 

public static void Register(HttpConfiguration config) 
{ 
    // Web API configuration and services 

    // Web API routes 
    config.MapHttpAttributeRoutes(); 

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

とApiControllerから継承するコントローラでこれらのコントローラアクション:

は、次のルート設定登録を考えます経路を正しく選択することはできますが、残念ながらそうではありません。

私の質問は「このコードを正しく動作させ、同じコントローラに保持する方法はありますか」です。

スティーブン

はルートの追加
+0

両方に対して同じURLを呼び出す予定がありましたか? – Nkosi

答えて

1

これにはattribute routingを使用できます。

ルート内の文字列としてルートこの

[Route("api/controller/Post1")] 
[HttpPost] 
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request) 
{ 

} 
[Route("api/controller/Post2")] 
[HttpPost] 
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request) 
{ 

} 
0

、ありがとうは、あなたのWeb API関数に装飾を属性とそのルートを選択するセレクタをassitます:

[Route("Post1")] 
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request) 
{ 

} 

[Route("Post2")] 
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request) 
{ 

} 

私はまた、このようなHTTPメソッドの装飾を追加することをお勧めします[HttpPost]または[HttpGet]

1

などのメソッドの岩下属性を定義するルーティングパイプラインは、別名(リクエストのボディは、パラメータの型と一致するかどうかを判断するために十分にスマートではありません要求オーバーロード)。コンパイラであり、これがコンパイルされ、実行時に問題が発生する理由です。

いくつかのオプションがあります。

  1. 両方の投稿に[Route(<ActionName>)]属性を追加することもできます。
  2. 二つのコントローラ、GetDocuments用とFinishDocuments
  3. のための1つがあいまいである1つのPost方法を確認してください。 (これは避けてください)

オプション1を選択した場合、API uriは.../api/MyController/ではなく.../api/MyController/MyActionNameにする必要があります。メソッドに[HttpGet][HttpPost]の属性を追加することもお勧めします。

サンプル:

public class DocumentController : ApiController 
{ 
    // POST /api/Document/GetDocuments 
    [HttpPost] 
    [Route("GetDocuments")] 
    public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request) { ... } 

    // POST /api/Document/FinishDocuments 
    [HttpPost] 
    [Route("FinishDocuments")] 
    public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request){ ...} 
} 

あなたはオプション2を選択した場合は、追加のコードファイルを維持する必要があります。

public class GetDocumentsController : ApiController 
{ 
    // POST /api/GetDocuments 
    [HttpPost] 
    public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request) { ... } 
} 

public class FinishDocumentsController : ApiController 
{ 
    // POST /api/FinishDocuments/ 
    [HttpPost] 
    public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request){ ...} 
} 

あなたはオプション3を選択した場合、は、神はあなたが悪い時、それを維持する必要があるとしているあなたの魂に慈悲を持っていることがあります。

関連する問題