C# 支持GUID和整数ID的Web API路由

C# 支持GUID和整数ID的Web API路由,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,如何支持GUID和integer的GET路由?我意识到guid并不理想,但它现在就是这样。我想增加对整数的支持,让用户更容易记住和交流应该是唯一的“键” 示例路线: testcases/9D9A691A-AE95-45A4-A423-08DD1A69D0D1 testcases/1234 我的WebApiConfig: public static void Register(HttpConfiguration config) { config.MapHttpAttributeRo

如何支持GUID和integer的
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”)]
公共类测试用例控制器:PlanControllerBase
{
[路线(“”)
公共操作结果获取([FromUri]TestCaseRequest请求)
[路由(“{id}”)]
[HttpGet]
公共操作结果获取(Guid id)
[路由(“{key}”)]
[HttpGet]
公共操作结果获取(int键)
...
}

当我尝试使用整数调用资源时,出现了一个内部服务器错误。感谢您的帮助

谢谢@sirwanaffi!我看到了您提到的SO问题中提到的文章,但显然当时我不认为需要路由属性约束


对我来说,在我的控制器方法上使用了
[Route({id:guid}”)]
[Route({key:int}”)]
。我还在我的
WebApiConfig
中注释掉了与
{id}
{key}
相关的Http路由,以验证控制器中的属性是否负责执行路由。

接受字符串的单路由,并执行一些检查?看看这个答案:
[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)

    ...
}