Web API 支持 GUID 和整数 ID 的路由
Web API Routes to support both GUID and integer IDs
如何支持 GUID 和整数的 GET
路由?我意识到 GUID 并不理想,但现在就是这样。我想添加对整数的支持,让用户更容易记住和传达什么 应该是 独特的 "keys."
示例路线:
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)
...
}
当我尝试使用整数调用资源时出现内部服务器错误。感谢您的帮助!
感谢@SirwanAfifi!我遇到了你提到的 SO 问题中提到的 Attribute Routing in ASP.NET 文章,但显然我当时没有看到路由属性约束的必要性。
对我来说,是在我的控制器方法上使用 [Route("{id:guid}")]
和 [Route("{key:int}")]
才成功。我还在 WebApiConfig
中注释掉了与 {id}
和 {key}
相关的 Http 路由,以验证控制器中的属性是否负责进行路由。
如何支持 GUID 和整数的 GET
路由?我意识到 GUID 并不理想,但现在就是这样。我想添加对整数的支持,让用户更容易记住和传达什么 应该是 独特的 "keys."
示例路线:
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)
...
}
当我尝试使用整数调用资源时出现内部服务器错误。感谢您的帮助!
感谢@SirwanAfifi!我遇到了你提到的 SO 问题中提到的 Attribute Routing in ASP.NET 文章,但显然我当时没有看到路由属性约束的必要性。
对我来说,是在我的控制器方法上使用 [Route("{id:guid}")]
和 [Route("{key:int}")]
才成功。我还在 WebApiConfig
中注释掉了与 {id}
和 {key}
相关的 Http 路由,以验证控制器中的属性是否负责进行路由。