如何在Web API属性路由中同时支持“常规”和“可读”URL?

时间:2014-02-15 06:41:51

标签: c# url asp.net-web-api asp.net-web-api-routing routeattribute

我有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; }
}

它适用于这样的“常规”网址:

/api/product/barcode/EAN/0747599330971

但同时如何支持这样的网址:

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

我曾经在我的* .webtest中使用它,然后才切换到'可读'模式。

2 个答案:

答案 0 :(得分:1)

在这种情况下你可以有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)

答案 1 :(得分:0)

看起来没有为查询字符串参数定义常规Url的路由。

尝试将路线参数设为可选,如下所示。

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

因此它也应匹配路线模板api/product/barcode路线。

没有经过测试,但希望你明白我的意思。