试想一下,你声明你这样的路线:
config.Routes.MapHttpRoute("defaultVersioned", "v{version}/{controller}/{id}",
new { id = RouteParameter.Optional }, new { version = @"\d+" });
config.Routes.MapHttpRoute("default", "{controller}/{id}",
new { id = RouteParameter.Optional });
现在,您可以创建一个单独的版本不同的控制器,例如使用特定的命名约定:现在
public class FooController : ApiController {}
public class FooV2Controller : ApiController {}
public class FooV3Controller : ApiController {}
,因为版本是部分你可以实现一个自定义控制器选择器,你可以在这里选择路径中的版本并根据它选择一个相关的控制器。
public class VersionAwareControllerSelector : DefaultHttpControllerSelector
{
public VersionAwareControllerSelector(HttpConfiguration configuration) : base(configuration) { }
public override string GetControllerName(HttpRequestMessage request)
{
var controllerName = base.GetControllerName(request);
var versionFinder = new VersionFinder();
var version = versionFinder.GetVersionFromRequest(request);
if (version > 0)
{
return GetVersionedControllerName(request, controllerName, version);
}
return controllerName;
}
private string GetVersionedControllerName(HttpRequestMessage request, string baseControllerName, int version)
{
var versionControllerName = string.Format("{0}v{1}", baseControllerName, version);
HttpControllerDescriptor descriptor;
if (GetControllerMapping().TryGetValue(versionControllerName, out descriptor))
{
return versionControllerName;
}
throw new HttpResponseException(request.CreateErrorResponse(
HttpStatusCode.NotFound,
String.Format("No HTTP resource was found that matches the URI {0} and version number {1}",
request.RequestUri, version)));
}
}
此代码使用一个VersionFinder
助手类,其可以被发现here。
然后你只需要注册自定义选择:
config.Services.Replace(typeof(IHttpControllerSelector), new VersionAwareControllerSelector(config));
对于一个完整的例子 - have a look here on Github,它的的ASP.NET Web API 2食谱书的一部分。