ASP.NET API 版本控制

2023-11-25

我是 ASP.NET 新手,但我希望为即将开始的新 API 实现一些版本控制。

我什至不确定我正在寻找的是否可能,但我正在寻找使用标头变量的非常干净的版本方法。

理想情况下,我希望能够在代码结构中拥有一个版本文件夹,并在其中包含包含不同 API 版本的不同文件夹。 每个版本文件夹都将包含核心 API 代码的完整副本,因此我知道永远不会有任何冲突等。我知道这会使代码膨胀,但值得保持它非常干净,并且只会超过 2-3 个激活的 API 版本。

我在互联网上找到了许多标头示例,但它们都要求类位于不同的命名空间中,如果我正在执行代码的完整副本,那么每次复制时都必须重命名所有类是不切实际的。

我想做的事情可能吗?或者在处理多个类时是否有更干净的解决方案?


有四种基本方法来版本化 RESTful 方式 -

  1. URI 路径 此方法采用以下形式:

    http://api/v2/任务/{TaskId}

  2. URI 参数 此方法采用以下形式:

    http://api/任务/{任务ID}?v=2

  3. 内容协商 这是在 HTTP 标头中完成的。

    内容类型:application/vnd.taskManagerApp.v2.param.json

  4. 请求标头 这也是在 HTTP 标头中完成的。

    x-taskManagerApp-版本:2

我个人喜欢第一种方法。你可以阅读Mike Wasson 的 ASP.NET Web API:使用命名空间对 Web API 进行版本控制.

许多人修改了 Mike Wasson 的原始来源。我喜欢其中使用的一个ASP.NET Web API 2 书籍,作者:Jamie Kurtz、Brian Wortman.

由于它有太多移动部件,我创建了GitHub 上的示例项目.

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

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

然后,你添加Api版本约束

public class ApiVersionConstraint : IHttpRouteConstraint
{
    public ApiVersionConstraint(string allowedVersion)
    {
        AllowedVersion = allowedVersion.ToLowerInvariant();
    }

    public string AllowedVersion { get; private set; }

    public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName,
        IDictionary<string, object> values, HttpRouteDirection routeDirection)
    {
        object value;
        if (values.TryGetValue(parameterName, out value) && value != null)
        {
            return AllowedVersion.Equals(value.ToString().ToLowerInvariant());
        }
        return false;
    }
}

Usage

你只需放置路由前缀在控制器上,你就完成了。

[RoutePrefix("api/{apiVersion:apiVersionConstraint(v1)}/values")]
public class ValuesController : ApiController
{
    // GET api/v1/values
    [Route("")]
    public IEnumerable<string> Get()
    {
        return new string[] { "v1-value1", "v1-value2" };
    }

    // GET api/v1/values/5
    [Route("{id}")]
    public string Get(int id)
    {
        return "v1-value-" + id;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET API 版本控制 的相关文章

  • 动态向表添加行

    目前 我正在尝试创建一个表 其内容应该由子类创建 查询 RESTful Web 服务的结果 我已经为此工作了相当长一段时间 但我似乎无法让它发挥作用 我尝试了很多不同的解决方案 在子类中创建表并将其添加到 Page Controls 中 这
  • 向 ASP.NET WebApi 2.2 添加身份验证

    我创建了一个 WebApi 2 2 项目 来自一个空的新 ASP NET 项目 来证明一些实现概念 现在我想向其中添加身份验证 我注意到在新的 WebApi 应用程序上添加身份验证的唯一方法是使用模板之一 在我的例子中是 VS 2013 是
  • 装载组件

    有很多讨论展示了如何从 BIN 和 GAC 加载程序集 我的问题更笼统 我很想知道程序集加载是如何工作的 举例来说 在BIN文件夹中我们可以有 A dll A dll config A dll config 文件可能如下所示
  • 将图像添加到 asp.net 中的链接按钮

  • 如何在浏览时检查客户端是否安装了 SQLNCLI10 提供程序?

    我有一个 C 网站 允许客户端从其 PC 直接连接到远程 SQL Server 数据库 通过使用第 3 方 ActiveX 控件绕过 Web 服务器 我最初使用的是SQLOLEDB提供商并且运行良好 客户端位于内部网络中 使用 Window
  • 有没有办法将复选框列表绑定到 asp.net mvc 中的模型

    我在这里寻找一种快速简便的方法来在模型中发生回发时绑定复选框列表项的列表 显然现在常见的做法似乎是这样的form GetValues checkboxList 0 Contains true 这看起来很痛苦而且不太安全 有没有一种方法可以绑
  • 没有 Duende 身份服务器的 Blazor

    我有一个小型 Blazor WASM 项目 最近将其迁移到 net 6 但现在我尝试运行已发布的项目 应用程序警告我 我没有 Duende Identity Server 的许可证 我的问题是 我可以不用 Duende Identity S
  • System.Linq.Dynamic 不支持 OrderByDescending("someColumn")?

    好的 在我们的项目中 我使用 System Linq Dynamic 库 但我刚刚注意到我无法执行以下操作 myDataSource OrderByDescending someColumnName 因为我收到以下错误 重载解析失败 因为无
  • Web.config 在 Azure 部署期间发生(大幅)更改

    部署到 Azure 后 我不断收到服务器错误 应用程序无法运行 所以我在实例中做了一个远程桌面 发现 web config 被彻底修改了 这是怎么回事 我以为 web config 是按原样打包的 相反 整个配置已被替换 当我用原始的 未改
  • 在 ServiceStack 中使用 ASP.NET 成员资格

    我该如何使用ASP NET 会员资格 in 服务栈 http www servicestack net ServiceStack OrmLite ServiceStack Host AspNet 等 您可以将 ServiceStack 托管
  • 将base64字符串转换为图像c#时出错

    我想在我的网页上显示图像 并单击应该下载的链接按钮 存储的图像文件以二进制格式存储在db中 将 base64 字符串转换为图像时显示错误 详细信息如下 帮助我找到合适的解决方案 谢谢 Error Code protected void Pa
  • Microsoft Graph API 调用无限期挂起

    我正在尝试使用 Microsoft Graph 查询 Azure Active Directory 用户信息 我可以很好地进行身份验证 但是当我尝试查询用户信息时client Users我的应用程序无限期挂起 没有超时 没有错误 只是挂起
  • ASP.NET 显示 SVN 修订号

    我在 Stack Overflow 页脚中看到显示了 SVN 修订号 这是自动化的吗 如果是的话 如何在 ASP NET 中实现它 其他语言的解决方案也是可以接受的 确保该文件有 svn keywords Rev Id 然后把 Rev 在那
  • 当前上下文中不存在名称“DefaultAuthenticationTypes”

    我正在尝试在我的 Web 应用程序中实现基于角色的授权 如下所示 HttpPost ActionName Login public ActionResult Login LoginViewModel model if ModelState
  • 我们可以将哪些类型的对象放置在视图状态中?

    我想知道为什么我们必须设置可序列化属性才能将对象保存在视图状态 另外 我们可以在视图状态中存储哪种类型的对象 ViewState使用二进制序列化进行序列化对象状态格式化程序 http msdn microsoft com en us lib
  • 无法使用 System.Net.Mail.SmtpClient 将电子邮件发送到其他域

    请看下面的代码 client Credentials new NetworkCredential SMTP SERVER USERNAME SMTP SERVER PASSWORD client EnableSsl false client
  • 如何获取 ASP.NET MVC 中当前的虚拟路径?

    如何从 ASP NET MVC 视图中获取当前路径 URL 如果没有办法将其获取到视图中 那么如何将其获取到控制器中以便将其传递到视图呢 EDIT 我不需要 url 的协议和主机部分 这将为您返回视图中的 url
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize

随机推荐

  • SQLite 长到宽格式?

    我想知道是否有一种规范的方法可以在 SQLite 中将数据从长格式转换为宽格式 该操作通常在关系数据库领域吗 我试着跟随这个例子对于 MySQL 但我猜 SQLite 没有相同的 IF 结构 谢谢 IF是一个非标准的 MySQL 扩展 最好
  • 带和不带箭头的 UML 聚合

    我一直认为 UML 聚合被定义为路径开头的黑色 实心 菱形 结尾处没有箭头 MyA lt gt MyB 今天我遇到了这样的符号 lt gt gt 右端有一个明确的箭头 所以我在 UML 2 4 规范中查找 实际上找到了两个版本的参考资料 我
  • 更改 R Shiny 中 selectInput 的背景颜色

    我的示例代码 library shiny server lt function input output ui lt fluidPage br selectInput select1 Choose c Alt1 1 Alt1 2 selec
  • 同步对易失性字段的写访问(廉价读写块)

    假设我有以下课程将被大量阅读 但只是偶尔写入 它将在多线程 Web 应用程序中使用 因此它需要是线程安全的 public class Foo private volatile String foo public String getFoo
  • 在Java中,如何同时遍历两个列表?

    E g for String str list1 for String str list2 假设我们确信list1 size equals list2 size 如何一次性遍历这两个列表for陈述 也许像for String str1 li
  • 类型错误:无法读取未定义的属性“push”,JavaScript

    我正在这个 Angular 项目中工作 用户提交评论表单 新评论将添加到已发布的评论中 这是我的代码 controller productCtrl function scope http routeParams Page scope pro
  • 是否可以在 Android 中将 Firebase Messaging 与 Google Analytics 结合使用?

    我开始在 Android 应用程序中使用 Firebase Cloud Messaging 现在我尝试将 Google Analytics 不是 Firebase 分析 添加到同一应用程序中 问题是 在为 Analytics 创建 goog
  • Elixir 中等号的确切含义是什么?

    我不明白 Elixir 中的等号到底意味着什么 不清楚的是它看起来像是赋值和模式匹配操作的混合 iex 1 gt x 4 4 iex 2 gt y 5 5 iex 3 gt 3 y MatchError no match of right
  • 使用 mmap 将文件读取为字符串

    我正在尝试使用 mmap 将文件读取为字符串 我正在遵循这个例子 http www lemoda net c mmap example index html 我的代码看起来像这样 unsigned char f int size int m
  • 如果文档中使用复数,而搜索文本中使用单数,则配置 SOLR 来查找文档?

    我正在使用 solr 设置为 localhost 8983 我基本上使用的是开箱即 用的示例 我输入了一份名为 Car 的文档 另一份名为 Cars 的文档 如果我访问 http localhost 8983 solr select q C
  • 如何在 C++ 中克隆为派生对象

    我在 C 中定义了两个类 一个是基类 一个是派生类 class CBaseClass class CDerivedClass public CBaseClass 并想实现一个克隆功能如下 CBaseClass Clone const CBa
  • 我可以在 JDBC 准备好的查询中使用多个语句吗?

    我想在我的 MySQL 服务器上执行类似的操作 SET id SELECT id FROM lookupTable WHERE field SELECT FROM table2 WHERE id id UNION SELECT FROM t
  • 正确使用 LabelValueBean

    我有一个变量 private ArrayList
  • PHPStorm 和魔法方法

    我正在使用 PHPStorm 并编写了一个利用 SimpleXML 类的类 一切都很好 除了当我遍历 XML 字符串时 我会收到 未定义的属性 警告 xml simplexml load string string Returns Simp
  • 什么是参考插座?

    我最近刚刚将 Xcode 3 的副本升级到 Xcode 3 1 并且我注意到界面生成器中的一些新内容 引用插座 谁能解释一下引用出口是什么 以及它们与 mac 开发有何关系 这些是设置到相关对象的插座 例如 如果您选择一个作为窗口委托的对象
  • 如果与上次不同则发出的 RxJava 运算符

    如果要发射的项目不等于最后发射的项目 是否有一个运算符可以发射项目 有distinctUntilChanged RxJava还实现了distinctUntilChanged运算符 它仅将源 Observable 发出的项目与它们的直接前辈进
  • 有人可以向我解释 ASP.NET 信任级别吗?

    我听说过很多有关信任级别的内容 有人试图向我解释 但仍然无法给出一个场景 在该场景中我将应用一个信任级别而不是另一个信任级别 我已读完MSDN 的文章但这对我没有多大作用 有人可以提供一个真实世界的示例 说明您何时想要使用各种级别 完全 高
  • Java中Integer.MAX_VALUE的乘法[重复]

    这个问题在这里已经有答案了 我只是在玩Java 写了这个小程序 public class MaxValue public static void main String args int i Integer MAX VALUE for in
  • AngularJS 指令在模板中使用原始元素类型

    我正在为 Angular 开发基于 UI 和排版的指令 在这种情况下 指令所应用的元素是未知的 从 div span h1 到 h5 的任何元素 使用模板的原因是这样我可以添加ng 指令 因此开发人员除了指令名称之外不需要记住任何内容 我在
  • ASP.NET API 版本控制

    我是 ASP NET 新手 但我希望为即将开始的新 API 实现一些版本控制 我什至不确定我正在寻找的是否可能 但我正在寻找使用标头变量的非常干净的版本方法 理想情况下 我希望能够在代码结构中拥有一个版本文件夹 并在其中包含包含不同 API