路由参数和多种控制器类型

时间:2014-10-27 09:05:06

标签: c# asp.net asp.net-web-api attributerouting

我有一个asp.net web api,使用控制器上的路由属性。在行动层面上没有路线属性。访问资源的路径是:

[Route("{id}"]
public MyApiController: ApiController
{
    public HttpResponseMessage Get(Guid id)
    { 
        // ...
    }
}

我的问题是,当我想创建一个搜索控制器时,我希望URL为

[Route("search")]

但这会导致错误:Multiple controller types were found that match the URL。是否有可能确保在通用匹配路线之前选择完全匹配的路线?

从技术上讲,短语search可能是第一个控制器的有效ID,但由于{id}是一个guid,所以情况永远不会如此,因此我想选择一个控制器完全匹配的路线。

1 个答案:

答案 0 :(得分:1)

您可以使用路线约束来完成这项工作。例如,您可以约束您的ID路由以仅接受有效的GUID。

这是一个ID控制器,只接受URL中的GUID字符串:

[System.Web.Http.Route("{id:guid}")]
public class MyApiController: ApiController
{
    public HttpResponseMessage Get(Guid id)
    {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

搜索控制器将匹配"/search"之类的网址。这是搜索控制器:

[System.Web.Http.Route("search")]
public class SearchController : ApiController
{
    public HttpResponseMessage Get()
    {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

约束将阻止路由器中的匹配冲突。