【问题标题】:No route providing a controller name was found to match request URI找不到提供控制器名称以匹配请求 URI 的路由
【发布时间】:2015-01-14 09:19:37
【问题描述】:

使用 WebApi 2.2。在我的 WebApiConfig.cs 我有:

public static void Register(HttpConfiguration configuration)
{
    configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
       new { id = RouteParameter.Optional });

    configuration.Routes.MapHttpRoute(
       name: "EnvironmentCreateAnnualTargetApi",
       routeTemplate: "api/EnvironmentTargets/{WorkLocationGuid}/{UserGuid}/{Year}"
    );

    configuration.Routes.MapHttpRoute(
       name: "EnvironmentUnitConversionApi",
       routeTemplate: "api/Conversions/{ConvertFromMeasureId}/{ConvertFromAmount}/{ConvertToMeasureId}/{MeasureDefinition}",
       defaults: new
       {
           ConvertFromMeasureId = RouteParameter.Optional,
           ConvertFromAmount = RouteParameter.Optional,
           ConvertToMeasureId = RouteParameter.Optional,
           MeasureDefinition = RouteParameter.Optional
        }
     );
}

名为“EnvironmentCreateAnnualTargetApi”的路线正在工作,但我无法让第二个工作,尝试了许多不同的事情并搜索了这个网站。

我的控制器是这样的:

[RoutePrefix("api/Conversions")]
public class ConversionsController : ApiController
{

然后到方法:

// GET: api/Conversions/7/5000/10/1
    [HttpGet, ActionName("Get")]
    [AllowAnonymous]
    public double Get(int ConvertFromMeasureId, double ConvertFromAmount, int ConvertToMeasureId, int MeasureDefinition)

我已经尝试过在 MapHttpRoute 方法中设置和不设置默认值。

我不断收到的错误是:

<Error>
<Message>No HTTP resource was found that matches the 
request URI 'http://localhost:50000/api/Conversions/7/10000/10/1'.</Message>
<MessageDetail>No route providing a controller name was 
found to match request URI 
'http://localhost:50000/api/Conversions/7/10000/10/1'</MessageDetail>
</Error>

我不明白我在这里可能会出错。已经尝试过frommanydifferentanswers,但没有一个更聪明。

【问题讨论】:

  • 假设Utilities.MeasureDefinitions是一个枚举,你有没有试过把参数类型改成int,然后在body中手动转换成枚举?
  • 您也可以尝试使方法参数名称等同于路由器参数名称吗?
  • 实施了这两个建议并相应地更新了我上面的问题。但是,仍然返回相同的错误。我对此还是很陌生 - 有没有可以附加调试器的地方,这样我就可以尝试跟踪正在发生的事情,也许看看它在哪里崩溃,你知道吗?
  • 这似乎是一个类似的问题stackoverflow.com/questions/19914237/…
  • 您能否按照链接中的建议注释掉您的其他路线,看看是否可行?

标签: c# asp.net-web-api2


【解决方案1】:

在剥离一切并尝试随机的事情后,我最终找到了解决方案(无论如何对我来说)。

变化:

configuration.Routes.MapHttpRoute(
       name: "EnvironmentUnitConversionApi",
       routeTemplate: "api/Conversions/{ConvertFromMeasureId}/{ConvertFromAmount}/{ConvertToMeasureId}/{MeasureDefinition}",
       defaults: [blah]

到:

configuration.Routes.MapHttpRoute(
    name: "EnvironmentConversions",
    routeTemplate: "api/{Controller}/{ConvertFromMeasureId}/{ConvertFromAmount}/{ConvertToMeasureId}/{MeasureDefinition}",
    defaults: new
    {
       Controller = "Conversions",
       ConvertFromMeasureId = RouteParameter.Optional,
       ConvertFromAmount = RouteParameter.Optional,
       ConvertToMeasureId = RouteParameter.Optional,
       MeasureDefinition = RouteParameter.Optional
    }
    );

它突然起作用了。 routeTemplate 中关于{controller} 的一些东西使它起作用。但是,我不知道为什么(并且想知道如果我未来的路线具有类似的参数风格,这会产生什么影响)。

【讨论】:

  • 我可以确认这一点。有人知道吗?
  • 它也对我有用。我在指向一个简单的控制器时遇到了问题。在我的路由模板中添加 {Controller} 并在默认值上给出名称是解决方案。
  • 确认,在路由模板中使用明确的控制器名称在我的情况下不起作用,但使用 {controller} 确实有效。
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 2013-05-26
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多