使用URL在Web Api 2中进行控制器版本控制

我想为我的控制器使用基于URL的版本控制。 我发现的最佳解决方案是下面的代码。 我正在寻找更好的解决方案。 我试过Constrain它不起作用也许我做了一些错误我唯一关心的是在不同的命名空间中使用同名的控制器……?! 我用字符串合并到创建想要的类型。 可能这不是一个好主意。 如果你知道的话,请为这个主题发送好的参考资料…..?

public class ControllerVersioning : DefaultHttpControllerSelector { private HttpConfiguration _config; public ControllerVersioning(HttpConfiguration config) : base(config) { _config = config; } public override HttpControllerDescriptor SelectController(HttpRequestMessage request) { var routeData = request.GetRouteData(); var controllerName = routeData.Values["controller"].ToString(); controllerName = char.ToUpper(controllerName[0]) + controllerName.Substring(1); var versionName = routeData.Values["version"].ToString(); HttpControllerDescriptor controllerDescriptor = new HttpControllerDescriptor(); controllerDescriptor.Configuration = _config; controllerDescriptor.ControllerName = controllerName; string s = "ngolforoushan.Web.Api.Controllers.V" + versionName + "." + controllerName + "Controller"; Type t=Type.GetType(s); controllerDescriptor.ControllerType = t; return controllerDescriptor; } } 

 var dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); var assembliesResolver = _config.Services.GetAssembliesResolver(); var controllerResolver = _config.Services.GetHttpControllerTypeResolver(); var controllerTypes = controllerResolver.GetControllerTypes(assembliesResolver); foreach (var cType in controllerTypes) { var segments = cType.Namespace.Split(Type.Delimiter); var controllerName = cType.Name.Remove(cType.Name.Length - DefaultHttpControllerSelector.ControllerSuffix.Length); var controllerKey = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", segments[segments.Length - 1], controllerName); if (!dictionary.Keys.Contains(controllerKey)) { dictionary[controllerKey] = new HttpControllerDescriptor(_config, cType.Name, cType); } } 

这是您可以返回Assembly上所有控制器列表并将所有控制器放入字典的方法。

基于我上面的代码 – 我的意思是线程主题,我的第一篇文章 – 你知道如何获得{版本,控制器}和选择的相关控制器并将其作为参数传递。

我在下面添加了代码,以便更容易获取版本和控制器,但是您需要知道在分配版本和控制器字符串之前是否有与版本控制无关的不同路由。

 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{version}/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); 

在MVC5或更高版本中,您可以使用属性路由…

〔路线( “API / V1 / AC1”)]

〔路线( “API / V2 / AC1”)]