Подтвердить что ты не робот

Маршруты веб-API для поддержки идентификаторов GUID и целочисленных идентификаторов

Как я могу поддерживать маршруты GET как для GUID, так и для целого? Я понимаю, что 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)

    ...
}

Я получаю внутреннюю ошибку сервера, когда пытаюсь вызвать ресурс с помощью целого числа. Любая помощь приветствуется!

4b9b3361

Ответ 1

Спасибо @SirwanAfifi! Я столкнулся с Attribute Routing в ASP.NET, о котором упоминается в вопросе SO, о котором вы упомянули, но, видимо, я не видел необходимости ограничения атрибутов маршрута в то время.

Для меня это использовало [Route("{id:guid}")] и [Route("{key:int}")] в моих методах контроллера, которые сделали трюк. Я также прокомментировал маршруты Http, связанные с {id} и {key}, в моем WebApiConfig, чтобы убедиться, что атрибуты в контроллере несут ответственность за выполнение маршрутизации.