问题标签 [aspnet-api-versioning]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
196 浏览

api - 我无法使用 ApiVersioning .net Core 在响应标头中显示 API 版本

我按照使用 ASP.NET Core 的 REST API 版本控制说明在响应标头中显示我的 API 版本。

这是我的配置代码

这是我的控制器

当我用邮递员测试我的 API 时,我得到了这个结果:

在此处输入图像描述

我不知道为什么opt.ReportApiVersions = true;不起作用。

0 投票
1 回答
116 浏览

c# - ASP.net Core - 在 Swagger 中评论特定版本

我有一个存在版本 1 到 3 的 API。我正在创建一个特定控制器的 v4,我需要标题描述(见下文“负责...的 Api”)。

有没有办法对版本进行具体描述?我想把“草稿”这个词放到我的新 v4 中。

在此处输入图像描述

我的启动配置如下...

服务集合

配置

感谢您的任何指点!

0 投票
1 回答
288 浏览

asp.net-mvc - 使用 Microsoft 的 Web API 2 和 ODATA 的 ASP.NET API 版本控制在 api 版本之间更改 JSON 属性的大小写?

我正在向现有 API 引入 API 版本控制。现有的 JSON 对其属性名称使用 Pascal 大小写,例如“FooBar”:“foo”。对于 API 的 v2,我想使用常见的驼峰式大小写,“fooBar”:“foo”。我需要保留 v1 Pascal 大小写,这样它就不会影响任何已经在提取该 API 版本的客户端。

我的项目是

  • ASP.NET MVC 5.2.7
  • ASP.NET 网页 API 5.2.7
  • ASP.NET ODATA 7.4.0
  • ASP.NET WEB API 版本控制 4.0.0

我的配置如下

在阅读了文档,特别是版本化的ODataModelBuilder 之后,我还没有找到一种方法来根据构建模型的 API 版本来更改大小写。我可以让它成为所有帕斯卡套管或所有骆驼套管,但不是 v1 帕斯卡套管和 v2 骆驼套管。

调整上述配置

将使用驼峰式外壳(是的,我知道显式调用是不必要的,因为它是默认设置)。然后我构建了自己的扩展方法ODataConventialModelBuilder().EnablePascalCase(),该方法模仿EnableLowerCamelCase()了让 Pascal 套管工作的方法。

但是,我永远无法知道我正在为哪个版本的 API 构建模型。

有一次,我以为我可以用它OnModelCreating来添加

到每个 v1IModelConfiguration类,但是一旦我构建了多个模型,它就不起作用了。

有没有办法根据模型的 API 版本更改 JSON 属性命名?

0 投票
1 回答
1470 浏览

asp.net-core - NSwag 和多个 api 版本

考虑以下控制器:

以及课堂上的 Swagger 文档Startup

现在,在使用NSwag测试 API 浏览器后,它会忽略版本并显示 v1 和 v2 文档中的所有 API。

如何告诉 NSwag 将它们分开?

0 投票
1 回答
359 浏览

api - 使用 SwashBuckle 为版本化 API 生成 swagger JSON 文件时删除部分 URL 路径

我有一个带有版本控制的 .NET Core Web API。目前有2个版本,2个swagger文件中的操作路径如下:

Azure DevOps 中有一个构建管道,它使用 PowerShell 生成 2 个 swagger 文件:

并将它们存储在工件中。在发布管道中,我使用Create or Update Versioned APIAPI 管理任务在 Azure API 管理中创建/更新我的 API,使用这些生成的 swagger 文件。

到目前为止一切顺利,一切都按预期工作。但是,正如预期的那样,发布步骤将另一个版本部分添加到 URL。所以在我在 API 管理中的最终 API 操作中,URL 看起来像这样:

我试图通过使用 IDocumentFilter 来编辑 swagger 文件中生成的操作路径并且可以工作,但它也破坏了 Swagger UI。有什么方法可以修改这些操作路径,但只能在生成实际的 Swagger 文件时修改?

所以在我的 IDocumentFilter 中,我可以有这样的东西:

0 投票
1 回答
171 浏览

asp.net-core - 有没有办法要求 URL 路径段中存在次要版本?

我正在使用该aspnet-api-versioning库创建一个相当简单的版本控制策略,使用名称空间/文件夹来指定路由。我的启动代码如下所示:

我的控制器通常如下所示:

不要关注GetApiVersionString(),它只是格式化版本字符串的私有方法。

此设置允许我将以下路由发送到此控制器的“特定路由”方法:

  • /Message/specific-route(这是为不知道版本控制的客户准备的)
  • /v1/Message/specific-route(匹配 1.0)
  • /v1.0/Message/specific-route

理想情况下,我想消除其中的第二个,并要求所有指定版本的调用都指定主要版本次要版本。换句话说,我希望对“v1”调用的响应与对任何未定义版本的调用相同。这个库是否提供任何技术来实现这一点?

注意:我所有的命名空间/文件夹都将遵循该V_x格式,因此我的方案中总会有一个次要版本。

0 投票
1 回答
361 浏览

.net-core - 使用 VersionByNamespaceConvention 对 Webapi .net-core 进行版本化,而不是被迫在控制器上使用 RouteAttribute

这个想法是通过 URL 拥有一个版本化的 API,如下所示:

  • /api/v1/天气预报
  • /api/v2/天气预报
  • /api/v3/天气预报

我的命名空间如下:

命名空间版本控制

在启动时我有这个代码来注册版本控制:

所以我想删除每个控制器中的“[Route("api/v{version:apiVersion}/[controller]")]"属性这可能吗?

我试图使用这样的东西来映射控制器:

但是当我运行代码时,它给出了以下错误:

操作“ApiVersioning.Api.V3.Controllers.WeatherForecastController.Get (ApiVersioning)”没有属性路由。使用 ApiControllerAttribute 注释的控制器上的操作方法必须是属性路由。

那么我可以为所有控制器添加一个隐式路由约定,从而消除对每个控制器顶部的 RouteAttribute 的需要吗?

0 投票
2 回答
3405 浏览

asp.net-core - 在 ASPNET Core 的路由中使用 ApiExplorerSettings GroupName

在 ASP.NET Core - Web API 项目中

[ApiExplorerSettings(GroupName = "<group-name>")]在 ApiController 和属性中使用装饰[Route]我想参考上面的GroupName属性值。

另请注意,我确实[ApiVersion("<some-version>")]在同一个控制器上进行了进一步分类。

以下是一些示例来解释:

示例 1:

LeadController 上的属性:[ApiVersion("1.0"), ApiExplorerSettings(GroupName = "sales"), [Route("api/{groupName}/v{version:apiVersion}/leads"]

预期的翻译路线格式:/api/sales/v1/leads

AccountsController 上的属性:[ApiVersion("2.1"), ApiExplorerSettings(GroupName = "finance"), [Route("api/{groupName}/v{version:apiVersion}/accounts"]

预期的翻译路线格式:/api/finance/v2.1/leads

上面{version:apiVersion}给了我ApiVersion价值(我假设是因为该属性已将 ToString 设置为版本值)。但是当我尝试{groupName}or{grp:groupName}{grp:ApiExplorerSettings.GroupName}- 它们都不起作用。如何在路由属性中访问该组名?

0 投票
1 回答
186 浏览

asp.net - 在确保 api 在有和没有 api 版本的情况下都可以工作时,如何摆脱路由名称冲突?

我想将 asp.net api-versioning 应用到我的网络应用程序(没有版本控制)。然而,棘手的问题是我必须确保 API 可以在有和没有 api-version 的情况下工作。

我有一个具有多个操作的控制器,每个操作都定义了一个唯一的路由名称。当我向控制器添加两条路由(有版本和无版本)时,会出现路由名称冲突错误:

具有相同名称“GET Products/GetLatestAsync”的属性路由必须具有相同的模板:

操作:'Service.Controllers.ProductController.GetLatestAsync (ProductFD)' - 模板:'api/products/{productId}/Product'

操作:'Service.Controllers.ProductController.GetLatestAsync (ProductFD)' - 模板:'api/v{version:apiVersion}/products/{productId}/Product'

StackOverflow 上有几个答案说可以通过删除为操作方法定义的路由名称来解决该问题。但是,在我的场景中,路由名称用于在项目的多个位置创建 URL 链接。

有没有一种方法可以解决这个问题?我想知道是否可以将版本附加到路由名称变量或将非版本 api 映射到 version/1.0 ...?另一方面,在极少数情况下,我会更新控制器中的所有方法。那么我是否有可能只在控制器的顶层定义一个路由前缀,而只在方法级别应用 api-version?

0 投票
1 回答
138 浏览

.net-core - 不同名称的 API 版本

我正在为我的项目使用 asp dotnet core 3.1。目前,我正在按照建议的方式对我的1.0操作进行版本控制。2.1但是我想通过例如schooljob或其他一些随机字符串值来对我的操作进行版本控制。我研究了很多,一些网站声称可以这样做1_0,但1.0 没有说明如何做。另外,我不知道是否可以将版本控制更改为schooljob.

对于我的 URL,我真正想做的是将它们从 更改为...someUrl/1.0/getTeachers...someUrl/schooljob/getTeachers以便我最终可以在 Swagger 中更好地对它们进行分组。