【问题标题】:Web API Attribute Routing not working when less than 4 parts to route当要路由的部件少于 4 个时,Web API 属性路由不起作用
【发布时间】:2013-11-11 12:53:32
【问题描述】:

这是一个随机的,它让我一头雾水。

我刚刚将我的项目更新为 WebAPI 2,因此我可以使用新的属性路由功能。我按照官方网站上的教程进行操作,最终在我的全局文件中得到了这样的配置:

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}”的操作方法:

[Route("api/users/{id}")]
public UserAccountModel GetUserAccount(string id)
{
    return _userAccountService.GetAccountDetails(id);
}

到目前为止,这一切对我来说都很好。但是,当我尝试走这条路线时,我得到了一个例外:

IControllerFactory 'withomph.Common.Ioc.DependencyControllerFactory' 没有返回 名称“api”的控制器。

DependencyControllerFactory 是我为我的 MVC 控制器进行依赖注入的地方,所以不确定它为什么会去那里。

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

[Route("api/users/test/{id}")]
public UserAccountModel GetUserAccount(string id)
{
    return _userAccountService.GetAccountDetails(id);
}

有效!我已经在几个不同的控制器中尝试了这个,使用不同的名称,使用 api,不使用 api 等。它总是一样的:如果路由少于 4 个部分,它就不起作用。任何超过 4 个,它都有效。

有谁知道他在搞什么鬼??!!

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api .net-4.5 attributerouting


    【解决方案1】:

    您需要重新排序上面的注册代码,因为与 Web API 的特定路由 (api/{controller}/{id}) 相比,MVC 路由匹配您的请求 URL,因为它更通用(例如:{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);
        }
    

    【讨论】:

    • 我最初是这样做的,但如果我这样做,我会得到一个例外:The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.
    • 是的,该错误消息是预期的,您需要将现有的 WebApiConfig.Register(GlobalConfiguration.Configuration) 调用更改为 GlobalConfiguration.Configure(WebApiConfig.Register); 来修复它。基本上GlobalConfiguration.Configure(WebApiConfig.Register); 在内部为你调用 EnsureInitialized
    猜你喜欢
    • 2013-11-11
    • 2017-09-19
    • 2015-03-19
    • 2017-03-24
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多