我想要一条接收来自
的请求的路线/ API / V1 /工作
到
住在
的控制器/ API / V1 / jobController
其中控制器名称为jobv1Controller
configuration.Routes.MapHttpRoute(
"v1",
"Api/v1/{controller}/{id}",
new { controller = "{controller}v1", id = RouteParameter.Optional });
答案 0 :(得分:1)
简短版本:
内置DefaultControllerFactory
可能无法创建您需要的控制器,因为它将值视为普通名称字符串,并且不会替换任何令牌。
解决方案是扩展DefaultControllerFactory
并覆盖CreateController
方法。更改controllerName值,然后使用基本功能来获取该控制器。
在Global.asax
中注册您的客户工厂ControllerBuilder.Current.SetControllerFactory(
typeof(YourCustomControllerFactory));
长版:
如您所知,流程如下:
请求>>路由系统>> MVC的默认控制器工厂>>创建控制器>>调用它。
我不认为可以在默认路由数据字典中提供动态值,并期望默认控制器工厂找到该控制器。
这是因为内置控制器工厂处理路径数据字典中给出的控制器键的直接值。
MVC处理程序没有尝试解析作为某些格式化字符串提供的控制器值,并以此格式关联Url Fragment值(控制器/操作等)。它认为它是一个直接值。
默认情况下,调用DefaultControllerFactory以获取控制器类型,并使用字符串值按原样激活控制器类型。
因此,解决问题的一种方法是定义实现IControllerFactory
一旦你这样做,你的工厂
将调用 CreateController
方法,并将RequestContext
和ControllerName
字符串作为2个参数。
RequestContext
包含RequestContext.RouteData.Values
字典,其中包含所有路由数据,令牌,约束,命名空间等。
获得传入的控制器名称后,您可以按照所需的格式(controllername +" v1")按摩它,然后实例化该控制器(使用DI容器或Service Locator或Activator.CreateInstance等)。无论你想要什么)并归还它。尝试使用某种查找缓存。
一旦实现了自定义工厂,就可以在Global.asax中注册自定义控制器工厂和MVC,如下所示:
ControllerBuilder.Current.SetControllerFactory(
typeof(YourCustomControllerFactory));