web-dev-qa-db-ja.com

GUIDと整数IDの両方をサポートするWeb APIルート

GUIDと整数の両方でGETルートをサポートするにはどうすればよいですか?GUIDは理想的ではないことに気づきましたが、今のところそれがそうです。サポートを追加したいユーザーが覚えやすく、何を伝えやすいようにするための整数すべきである一意の「キー」。

ルートの例:

testcases/9D9A691A-AE95-45A4-A423-08DD1A69D0D1   
testcases/1234

私のWebApiConfig

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();
    var routes = config.Routes;

    routes.MapHttpRoute("DefaultApiWithAction", 
        "Api/{controller}/{action}");

    routes.MapHttpRoute("DefaultApiWithKey",
        "Api/{controller}/{key}",
        new { action = "Get" },
        new { httpMethod = new HttpMethodConstraint(HttpMethod.Get), key = @"^\d+$" });

    routes.MapHttpRoute("DefaultApiWithId", 
        "Api/{controller}/{id}", 
        new { action = "Get" }, 
        new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });

    routes.MapHttpRoute("DefaultApiGet", 
        "Api/{controller}", 
        new { action = "Get" }, 
        new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });

    routes.MapHttpRoute("DefaultApiPost", 
        "Api/{controller}", 
        new { action = "Post" }, 
        new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });
}

私のコントローラー(メソッドシグネチャのみ):

[RoutePrefix("Api/TestCases")]
public class TestCasesController : PlanControllerBase
{
    [Route("")]
    public OperationResult<IEnumerable<TestCaseDTO>> Get([FromUri] TestCaseRequest request)

    [Route("{id}")]
    [HttpGet]
    public OperationResult<TestCaseDTO> Get(Guid id)

    [Route("{key}")]
    [HttpGet]
    public OperationResult<TestCaseDTO> Get(int key)

    ...
}

整数を使用してリソースを呼び出そうとするとInternal Server Errorが発生します。どんな助けでもありがたいです!

22
gopherr

@SirwanAfifiにありがとう! SO質問で言及された ASP.NETでの属性ルーティング の記事に出くわしましたが、どうやらルート属性の制約の必要性がわかりませんでした。当時の。

私にとっては、トリックを実行するコントローラーメソッドで[Route("{id:guid}")]および[Route("{key:int}")]を使用していた。 WebApiConfig{id}および{key}に関連するHttpルートもコメントアウトして、コントローラーの属性がルーティングの実行に責任があることを確認しました。

25
gopherr