Как поддерживать как "обычные", так и "читаемые" URL-адреса в маршрутизации атрибутов Web API?

У меня есть проект ASP.NET Web API 2.1 с включенной маршрутизацией атрибутов, а действие контроллера оформлено следующим образом:

[Route("api/product/barcode/{barcodeType}/{barcode}")]
public async Task<IHttpActionResult> GetProduct([FromUri] BarcodeSearchCriteria searchCriteria)

где BarcodeSearchCriteria является сложным типом:

public class BarcodeSearchCriteria
{
    public string Barcode { get; set; }

    public string BarcodeType { get; set; }
}

Это хорошо работает для "обычного" URL, например:

/api/product/barcode/EAN/0747599330971

но как в то же время поддерживать URL-адрес, как это:

/api/product/barcode/?barcodeType=EAN&barcode=0747599330971

Я использовал его в моем *.webtest до того, как переключился в "читабельный" режим.

2 ответа

Решение

В этом случае вы можете иметь 2 маршрута:

[Route("api/product/barcode")] //expects values from query string
[Route("api/product/barcode/{barcodeType}/{barcode}")] //expects value from route
public async Task<IHttpActionResult> GetProduct([FromUri] BarcodeSearchCriteria searchCriteria)

Похоже, что для обычного URL-адреса с параметрами строки запроса не определен маршрут.

Попробуйте сделать параметры маршрута необязательными, как это.

[Route("api/product/barcode/{barcodeType=""}/{barcode=""}")]
public async Task<IHttpActionResult> GetProduct([FromUri] BarcodeSearchCriteria searchCriteria)

Таким образом, он также должен соответствовать шаблону маршрута api/product/barcode маршрут.

Не проверял, хотя надеюсь, вы поняли мою точку зрения.

Другие вопросы по тегам