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

本文关键字:控制器 类型 参数 路由 | 更新日期: 2023-09-27 18:28:06

我有一个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,因此永远不会出现这种情况,因此我想选择具有完全匹配路由的控制器。

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

您可以使用路由约束来完成此项工作。例如,您可以将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"的url相匹配。这是搜索控制器:

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

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