C# 当要路由的部分少于4个时,Web API属性路由不起作用

C# 当要路由的部分少于4个时,Web API属性路由不起作用,c#,asp.net-mvc,asp.net-web-api,.net-4.5,attributerouting,C#,Asp.net Mvc,Asp.net Web Api,.net 4.5,Attributerouting,这是一个随机的,让我很困惑 我刚刚将我的项目更新为WebAPI 2,以便可以使用新的属性路由功能。我遵循官方网站上的教程,最终在我的全局文件中使用config,如下所示: protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); FilterConfig.RegisterGlobalFil

这是一个随机的,让我很困惑

我刚刚将我的项目更新为WebAPI 2,以便可以使用新的属性路由功能。我遵循官方网站上的教程,最终在我的全局文件中使用config,如下所示:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RouteConfig.RegisterRoutes(RouteTable.Routes);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    GlobalConfiguration.Configure(WebApiConfig.Register);
}
然后在
WebApiConfig
类中设置属性路由,如下所示:

public static void Register(HttpConfiguration config)
{
    config.DependencyResolver = new DependencyResolverFactory();
    config.MapHttpAttributeRoutes();
}
然后,我需要一个路由为“api/users/{id}”的操作方法:

到目前为止,我觉得这一切都很好。然而,当我尝试点击这条路线时,我得到了一个例外:

IController工厂 “withoomph.Common.Ioc.DependencyControllerFactory”未返回 名为“api”的控制器

DependencyControllerFactory
是我为我的MVC控制器进行依赖项注入的地方,所以我不确定它为什么会出现

奇怪的是,如果我改变路线,让它有一个额外的部分:

[Route("api/users/test/{id}")]
public UserAccountModel GetUserAccount(string id)
{
    return _userAccountService.GetAccountDetails(id);
}
它起作用了!我在几个不同的控制器中尝试过这一点,使用不同的名称,使用api,不使用api等等,但总是一样的:如果路由到它的部分少于4个,它就不起作用。只要超过4个,它就能工作


有人知道福吉在干什么吗

您需要重新排序上面的注册码,因为与Web API的特定路由(
API/{controller}/{id}
)相比,MVC路由更通用(例如:
{controller}/{action}/{id}
)。根据路由指南,在通用路由之前,必须注册更具体的路由

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);

        RouteConfig.RegisterRoutes(RouteTable.Routes);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

我最初是这样做的,但如果我这样做,我会得到一个异常:
对象尚未初始化。确保在所有其他初始化代码之后在应用程序的启动代码中调用HttpConfiguration.EnsureInitialized()。
正确,该错误消息是预期的,您需要将现有的
WebApiConfig.Register(GlobalConfiguration.Configuration)
调用更改为
GlobalConfiguration.Configure(WebApiConfig.Register);
修复它。基本上
GlobalConfiguration.Configure(WebApiConfig.Register);
为您重新初始化内部调用
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);

        RouteConfig.RegisterRoutes(RouteTable.Routes);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }