【问题标题】:C# Webapi attribute routing is not workingC# Webapi 属性路由不起作用
【发布时间】:2016-06-23 16:08:17
【问题描述】:

我有两个不同的 webapi 控制器,其操作如下所示。出于某种原因,我不断收到“找到与 URL 匹配的多个控制器类型......”异常。谁能帮我弄清楚我在这里做错了什么?

控制器A

[HttpGet]
[Route("clips/{Id}", Name = "GetById")]
public async Task<HttpResponseMessage> Get(string Id)
{

}

*Id 是字母数字,总是以数字开头

控制器B

[HttpGet]
[Route("clips/product", Name="GetXProducts")]
public async Task<HttpResponseMessage> GetXProducts([FromUri]SearchCriteria searchCriteria)
{

}

谢谢

【问题讨论】:

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


    【解决方案1】:

    您可以将正则表达式应用于两个路由,以确保在传递适当的参数时选择它:

    [Route(@"clips/{Id:regex([0-9]*[A-Z0-9]*)}", Name = "GetById")]
    

    您需要对其他路由应用类似的表达式来排除这些匹配。

    但我同意 @ryancdotnet 的观点,您可能应该重新评估您的路线。

    【讨论】:

    • 谢谢。但要求就是我在问题中提到的。还有其他几条路线,例如 i) clips/AAA, ii)clips/BBB 等,请问还有其他方法可以实现这些要求吗?
    • 我不确定我是否了解所需 URL 方案的全部范围,但如果您无法使用正则表达式处理不同的路由,您可以随时编写自定义路由限制。见:asp.net/web-api/overview/web-api-routing-and-actions/…。请注意,此示例适用于 Web API,但 System.Web.Routing (IRouteConstraint) 中存在类似的类。
    【解决方案2】:

    看起来问题是因为您在控制器 A 上的 {id} 是 string 类型,而控制器 B 的路由本质上是相同的,因为 product 也是一个字符串,因此路由不知道如何区分这两种操作。

    【讨论】:

    • 我会尝试重新考虑您的 URI 路径,看看是否有更好的资源表示您想要返回的对象。从 REST 的角度来看,我不确定 /clips/product 是否是一个好的资源表示。也许像 /clipproducts/ 这样的东西?
    猜你喜欢
    • 2014-03-25
    • 2023-03-12
    • 1970-01-01
    • 2017-04-09
    • 2021-06-10
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多