2014-11-17 53 views
2

使用WebApi 2.2。在我WebApiConfig.cs我:找不到提供控制器名称的路由以匹配请求URI

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但没有更明智的。

+0

假设Utilities.MeasureDefinitions是一个枚举,你是否尝试过将参数类型更改为int,然后手动转换为枚举体? –

+0

也可以尝试使方法参数名称等同于路由器参数名称? –

+0

实施了这两个建议,并相应地更新了我的问题。但是,仍然有返回相同的错误。我对此还是比较陌生 - 是否有某处我可以附加一个调试器,以便我可以尝试跟踪正在发生的事情,也许可以看到它在哪里下降,你知道吗? –

回答

4

将所有事情都剥离并尝试随机事件后,我终于找到了解决方案(无论如何)。

变化:

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}的内容使其工作。我不知道为什么然而(并想知道如果我有一个类似参数风格的未来路线会产生什么影响)。

+0

我可以证实这一点。有人知道吗? – Jason94

+0

它也适用于我。我在指导一个简单的控制器时遇到了问题。在我的路由模板中添加{Controller}并在默认值上给出名称是解决方案。 –

+0

确认,在路由模板中有一个明确的控制器名称在我的情况下不起作用,但改用{controller}确实有效。 – Fjarskiptagervitungl

相关问题