首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web Api和版本化控制器中的版本路由

Web Api和版本化控制器中的版本路由
EN

Stack Overflow用户
提问于 2016-05-25 23:44:34
回答 2查看 3.6K关注 0票数 2

使用.Net 4.5.2

我在Web Api中使用版本化路由。

规范要求我们定义以下路由:

/api/v1/members/test

/api/v2/members/test

下面的代码在版本1中查找正确的方法。

代码语言:javascript
复制
 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,当我们按如下方式定义我们的方法时,这一切都能正常工作

代码语言:javascript
复制
        [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方法被执行了。

是不是有什么我不明白的地方。有人能帮上忙吗?

如果我说得不够清楚,请要求进一步澄清。

EN

回答 2

Stack Overflow用户

发布于 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中使用它。

票数 2
EN

Stack Overflow用户

发布于 2016-05-26 00:21:25

在这两种情况下定义的路由都是"/Members/{id}/{action}",因此对v2/members/test的请求与第一个v1路由的模板相匹配(因为路由定义的顺序在匹配请求时很重要)

因此,您需要做的是使用显式版本定义您的路由,如下所示:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37441980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档