使用.Net 4.5.2
我在Web Api中使用版本化路由。
规范要求我们定义以下路由:
/api/v1/members/test
/api/v2/members/test
下面的代码在版本1中查找正确的方法。
private static IEnumerable<VersionedRoute> GetRoutes(int version)
{
var routes = new List<VersionedRoute>();
if (version >= 1)
{
var versionedRoutes = new List<VersionedRoute>
{
new VersionedRoute(
version,
"Test",
"/Members/{id}/{action}",
new RouteValueDictionary
{
{"controller", "Members"},
{"action", "Test"},
{"id", RouteParameter.Optional}
})
};
routes.AddRange(versionedRoutes);
}
if (version >= 2)
{
var versionedRoutes = new List<VersionedRoute>{
new VersionedRoute(
version,
"TestV2",
"/Members/{id}/{action}",
new RouteValueDictionary
{
{"controller", "MembersV2"},
{"action", "Test"},
{"id", RouteParameter.Optional}
}),
};
routes.AddRange(versionedRoutes);
}
return routes;
}对于v1,当我们按如下方式定义我们的方法时,这一切都能正常工作
[HttpGet]
[ActionName("Test")]
public HttpResponseMessage GetTest(string id)
{
var x = "GET: Well helleeoo";
return new HttpResponseMessage(HttpStatusCode.Accepted) {Content = new StringContent(x)};
}
[HttpPut]
[ActionName("Test")]
public HttpResponseMessage PutTest(string id)
{
var x = "PUT: Well helleeoo";
return new HttpResponseMessage(HttpStatusCode.Accepted) { Content = new StringContent(x) };
}但是,正如您所看到的,对于v2路由,我希望将请求定向到另一个控制器(MembersV2),在那里它将找到v2方法,但保持相同的路由公开。不幸的是,成员没有被找到,所以当我向api/v2/ MembersV2 /test发送一个请求时,虽然找到了路由,但是成员控制器被调用了,旧的v1方法被执行了。
是不是有什么我不明白的地方。有人能帮上忙吗?
如果我说得不够清楚,请要求进一步澄清。
发布于 2016-05-26 00:17:31
有多种方法可以进行API版本控制。你肯定不想重新发明轮子,因为它可能非常复杂。
你可以阅读ASP.NET Web API: Using Namespaces to Version Web APIs。
在ASP.NET Web API 2: Building a REST Service from Start to Finish书的第57页中,Jamie Kurtz解释了他如何修改上面的代码来满足他在新的WebAPI2中的需求。
我个人喜欢Jamie Kurtz的修改版本,并且在我的一些API中使用它。
发布于 2016-05-26 00:21:25
在这两种情况下定义的路由都是"/Members/{id}/{action}",因此对v2/members/test的请求与第一个v1路由的模板相匹配(因为路由定义的顺序在匹配请求时很重要)
因此,您需要做的是使用显式版本定义您的路由,如下所示:
private static IEnumerable<VersionedRoute> GetRoutes(int version)
{
var routes = new List<VersionedRoute>();
if (version >= 1)
{
var versionedRoutes = new List<VersionedRoute>
{
new VersionedRoute(
version,
"Test",
"v1/Members/{id}/{action}",
new RouteValueDictionary
{
{"controller", "Members"},
{"action", "Test"}
})
};
routes.AddRange(versionedRoutes);
}
if (version >= 2)
{
var versionedRoutes = new List<VersionedRoute>{
new VersionedRoute(
version,
"TestV2",
"v2/Members/{id}/{action}",
new RouteValueDictionary
{
{"controller", "MembersV2"},
{"action", "Test"}
}),
};
routes.AddRange(versionedRoutes);
}
return routes;
}https://stackoverflow.com/questions/37441980
复制相似问题