- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我继承了一个遗留的 WebAPI 系统,该系统目前在路由模式中使用下划线来表示版本。例如/api/1_0/account
, /api/1_1/account
等
我正在尝试更新自动生成的文档以使用 Swagger,但是使用包含下划线的 ApiVersion
属性的显式路由会导致异常。例如,这很好用:
[ApiVersion("1")]
但是这会引发异常:
[ApiVersion("1_0")] // < note '_0' here
[RoutePrefix("api/{version:apiVersion}/account")]
public class AccountController : ApiBaseController
{
// actions...
}
异常(exception)情况是:
FormatException: The specified API version status '_1' is invalid.
System.InvalidOperationException: 'Failed to compare two elements in the array.'
at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
at System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
at System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, IComparer`1 comparer)
at Microsoft.Web.Http.Dispatcher.ApiVersionControllerSelector.InitializeControllerInfoCache()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at System.Lazy`1.get_Value()
at Microsoft.Web.Http.Dispatcher.ApiVersionControllerSelector.GetControllerMapping()
at System.Web.Http.Routing.AttributeRoutingMapper.AddRouteEntries(SubRouteCollection collector, HttpConfiguration configuration, IInlineConstraintResolver constraintResolver, IDirectRouteProvider directRouteProvider)
at System.Web.Http.Routing.AttributeRoutingMapper.<>c__DisplayClass1_1.b__1()
at System.Web.Http.Routing.RouteCollectionRoute.EnsureInitialized(Func`1 initializer)
at System.Web.Http.Routing.AttributeRoutingMapper.<>c__DisplayClass1_0.b__0(HttpConfiguration config)
at System.Web.Http.HttpConfiguration.EnsureInitialized()
at ProjectName.Startup.Configuration(IAppBuilder app) in E:\ProjectPath\Foo.cs:line 25
问题很明显,但是如何在版本属性值中包含下划线呢?这个问题令人困惑,因为我假设类的内部(在某些时候)将值解析为整数,但属性本身接受一个字符串......?那为什么会这样呢?
最佳答案
关于为什么这不起作用的一些附加信息。 Microsoft.AspNet.WebApi.Versioning
包裹如下 semantic versioning要求主要部分和次要部分之间的分隔符是句号的规则。查看rules对于这个包。
通过一些技巧,可以获取 API 版本控制包来解析下划线。这是非常基本的代码,可能还没有准备好生产,但应该给你一个方向。您需要的第一件事是自定义路由约束(本质上是扯掉 the default one ):
public class CustomApiVersionRouteConstraint : IHttpRouteConstraint
{
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName,
IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
if (string.IsNullOrEmpty(parameterName))
{
return false;
}
var properties = request.ApiVersionProperties();
var versionString = "";
if (values.TryGetValue(parameterName, out object value))
{
//This is the real 'magic' here, just replacing the underscore with a period
versionString = ((string) value).Replace('_', '.');
properties.RawApiVersion = versionString;
}
else
{
return false;
}
if (ApiVersion.TryParse(versionString, out var requestedVersion))
{
properties.ApiVersion = requestedVersion;
return true;
}
return false;
}
}
并确保 Web API 使用新约束:
var constraintResolver = new DefaultInlineConstraintResolver()
{
ConstraintMap =
{
["apiVersion"] = typeof( CustomApiVersionRouteConstraint )
}
};
config.MapHttpAttributeRoutes(constraintResolver);
关于c# - 是否可以在 Controller 的 ApiVersion 属性中包含下划线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49904764/
尝试通过apiVersion更改部署的kubectl edit deployment example时,为什么会出现错误? 我必须删除并重新创建对象吗? 最佳答案 之所以会这样,是因为资源创建后只能更
我对中间件层次结构有疑问。我使用一个 Controller /操作创建了非常简单的 Web api [Route("api/v1/values")] public class ValuesCont
由于 Kubernetes 删除了已弃用的 API,我试图找出集群中资源的 apiVersion 并遇到以下行为。 在为特定部署请求定义时,它会报告旧的 api 版本: > kubectl get d
由于 kubectl convert 自 v1.14 起已弃用,并将在 v1.17 中删除,您如何转换 Kubernetes 对象的 API 版本? 还有其他简单安全的解决方案吗? 最佳答案 这正在
所以我确实更新了 list 并将 apiVersion: extensions/v1beta1 替换为 apiVersion: apps/v1 apiVersion: apps/v1 kind: De
我有一个带有默认值 Controller 的基本 WebApi 实现设置。 在 reading a blog about RESTful WebApi Versioning 之后我决定将该包集成到一个
我有一个关于.Capabilities.APIVersions.Has 的问题 - 我不确定它是如何工作的 我有以下功能: {{- define "fybrik.certManagerApiVersi
有没有一种简单的方法可以列出与 API 版本相关的所有 kubernetes 对象?比方说,API 版本 apps/v1beta1 即将弃用,我想知道我的集群中是否有任何对象使用此版本,我如何才能找到
我正在 ASP.NET Core 中构建一个 Web API,并且正在试验多个版本。我正在按照以下说明为每个版本创建 Swagger 文档:https://github.com/domaindrive
考虑这个资源声明: resource storageAccountFileSvc 'Microsoft.Storage/storageAccounts/fileServices@2021-09-01'
在 documentation ,提到应该使用 apiVersion 属性来指定资源的 REST API 版本。 然而,在这个101-automation-configuration模板,此处提到的资
在 documentation ,提到应该使用 apiVersion 属性来指定资源的 REST API 版本。 然而,在这个101-automation-configuration模板,此处提到的资
我继承了一个遗留的 WebAPI 系统,该系统目前在路由模式中使用下划线来表示版本。例如/api/1_0/account, /api/1_1/account等 我正在尝试更新自动生成的文档以使用 Sw
我正在尝试获取特定的 Microsoft Azure 网站资源,以便我可以更改其某些属性。要获取单个资源,Get-AzureResource 需要 ApiVersion 属性。我在哪里可以找到这个?
我正在尝试检查整个订阅过程中是否存在资源,但似乎 50% 的资源需要与其他资源不同的 apiVersion。 我觉得很奇怪,Azure 与其 apiVersions 不一致,但是有人拥有或知道当前准确
我已在我的 Core 2.1 API 项目中成功设置 API 版本控制。 http://localhost:8088/api/Camps/ATL2016/speakers?api-version=x.
我正在尝试创建一个 vulkan 实例。这是我的代码: vk::ApplicationInfo appInfo("Test", 1, nullptr, 0, 0); vk::InstanceCreat
尝试设置 Vulkan 应用程序,但是当我将 apiVersion 设置为 VK_VERSION_1_0 时,我从 vkCreateInstance 得到了 VK_ERROR_INCOMPATIBLE
需要您在执行 Kubernetes YAML 文件时就某个问题提供指导。 我的kubectl版本如下: Client Version: version.Info{Major:"1", Mino
我正在尝试使用 Microsoft.Azure.Management.Consumption 3.0.2 包来访问使用情况和消耗数据。 但是在调用 UsageDetails.List 时出现以下错误:
我是一名优秀的程序员,十分优秀!