如何在 C# ASP.NET WebAPI 中使用 URI 进行 Web API 版本控制?


一旦 Web API 服务公开,不同的客户端应用程序就开始使用我们的 Web API 服务。随着业务的增长和需求的变化,我们可能也需要更改服务,但服务的更改应以不破坏任何现有客户端应用程序的方式进行。

这时 Web API 版本控制就派上用场了。我们将现有服务保持原样,这样就不会破坏现有的客户端应用程序,并开发新客户端应用程序可以使用的新版本服务。

实现版本控制的选项之一是使用 URI。下面是一个如何实现相同功能的示例。

示例

让我们考虑一个学生控制器的版本 1 (V1),它具有以下操作方法。

学生模型 V1

namespace DemoWebApplication.Models{
   public class StudentV1{
      public int Id { get; set; }
      public string Name { get; set; }
   }
}

学生控制器 V1

using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   public class StudentV1Controller : ApiController{
      List<StudentV1> students = new List<StudentV1>{
         new StudentV1{
            Id = 1,
            Name = "Mark"
         },
         new StudentV1{
            Id = 2,
            Name = "John"
         }
      };
      [Route("api/v1/students")]
      public IEnumerable<StudentV1> Get(){
         return students;
      }
      [Route("api/v1/students/{id}")]
      public StudentV1 Get(int id){
         var studentForId = students.FirstOrDefault(x => x.Id == id);
         return studentForId;
      }
   }
}

在上面的示例中,我们使用了属性路由来实现版本控制。上面示例的输出如下所示:

现在假设在学生控制器中,业务仅为新用户提出了新的更改,而现有用户仍应使用版本 1。在这种情况下,我们必须引入版本 2 (V2)。

学生模型 V2

示例

namespace DemoWebApplication.Models{
   public class StudentV2{
      public int Id { get; set; }
      public string FirstName { get; set; }
      public string LastName { get; set; }
   }
}

学生控制器 V2

using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   public class StudentV2Controller : ApiController{
      List<StudentV2> students = new List<StudentV2>{
         new StudentV2{
            Id = 1,
            FirstName = "Roger",
            LastName = "Federer"
         },
         new StudentV2{
            Id = 2,
            FirstName = "Tom",
            LastName = "Bruce"
         }
      };
      [Route("api/v2/students")]
      public IEnumerable<StudentV2> Get(){
         return students;
      }
      [Route("api/v2/students/{id}")]
      public StudentV2 Get(int id){
         var studentForId = students.FirstOrDefault(x => x.Id == id);
         return studentForId;
      }
   }
}

输出

上面示例的输出如下所示。


更新于: 2020-08-19

656 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告

© . All rights reserved.