C# 当要路由的部分少于4个时,Web API属性路由不起作用
这是一个随机的,让我很困惑 我刚刚将我的项目更新为WebAPI 2,以便可以使用新的属性路由功能。我遵循官方网站上的教程,最终在我的全局文件中使用config,如下所示: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
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);
}