Как поддерживать как "обычные", так и "читаемые" 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
маршрут.
Не проверял, хотя надеюсь, вы поняли мою точку зрения.