我有一个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,所以情况永远不会如此,因此我想选择一个控制器完全匹配的路线。
答案 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);
}
}
约束将阻止路由器中的匹配冲突。