Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心API版本控制-所有版本的控制器相同_C#_Asp.net Core_Asp.net Core Webapi_Asp.net Core 3.1_Api Versioning - Fatal编程技术网

C# ASP.NET核心API版本控制-所有版本的控制器相同

C# ASP.NET核心API版本控制-所有版本的控制器相同,c#,asp.net-core,asp.net-core-webapi,asp.net-core-3.1,api-versioning,C#,Asp.net Core,Asp.net Core Webapi,Asp.net Core 3.1,Api Versioning,我有一个ASP.NET Core 3.1 API,我正在为我的一个控制器引入一个新版本。 我使用的是Microsoft.AspNetCore.Mvc.Versioning NuGet软件包,我已将新版本设置为默认版本。 我的所有其他控制器都应与旧版本(1.0)和新版本(1.1)一起使用 例如: [ApiVersion(“1.0”,弃用=真)] 公共类MySampleController { } [ApiVersion(“1.1”)] 公共类MyNewSampleController { } [A

我有一个ASP.NET Core 3.1 API,我正在为我的一个控制器引入一个新版本。 我使用的是Microsoft.AspNetCore.Mvc.Versioning NuGet软件包,我已将新版本设置为默认版本。 我的所有其他控制器都应与旧版本(1.0)和新版本(1.1)一起使用

例如:

[ApiVersion(“1.0”,弃用=真)]
公共类MySampleController
{
}
[ApiVersion(“1.1”)]
公共类MyNewSampleController
{
}
[ApiVersion(“1.0”,弃用=真)]
[ApiVersion(“1.1”)]
公共类分配控制器
{
}
问题:
我真的必须向所有控制器添加所有版本吗?
是否有更好/正确的处理方法

我曾尝试使用[ApiVersionNeutral],但这似乎不正确,而且根据,应该只在特殊情况下使用。 如果我不添加[ApiVersion]属性,它默认为新的1.1版本,1.0不再工作

由于这是我的第一个SO问题,我希望它符合指导原则:)

问:我真的必须向所有控制器添加所有版本吗

A:是。API版本是离散的。如果服务器不能满足请求,客户机应该得到他们所要求的和适当的错误响应

问:有没有更好/正确的处理方法

A:有几种可能的选择。更好或更正确的处理方式是非常主观的。有许多因素,最终的决定可能只取决于偏好

一个常见的误解是API版本控制使用属性。它真的不关心属性,它只是一种可能性,而且作为元数据往往会引起开发人员的共鸣。您可以选择使用开箱即用属性、自定义属性、开箱即用约定或您自己的自定义约定

如何应用版本元数据的选择通常是首选和实用的管理。一个常见的场景是按API版本在文件夹中组织控制器。在几种.NET语言中,文件夹名称转换为相应命名空间的一部分或全部。这种安排非常常见,因此它有一个现成的VersionByNamespaceConvention。有关详细信息,请参阅。还演示了如何端到端地启动这样一个项目

API版本中立意味着API接受任何和所有版本,包括所有版本。这可能意味着您不关心API版本,也可能意味着您接受自己将处理的整个范围。它实际上只用于永远不会随时间变化的API。例如,HTTP
DELETE
操作通常不会随时间或版本而改变

你说的是什么意思还不是100%清楚:

“如果我不添加[ApiVersion]属性,它默认为新的1.1版本,1.0不再工作。”


本质上没有默认值。此语句似乎暗示您已将未指定时的
AssumeDefaultVersionWhen设置为
true
。除非你有很好的理由这样做,否则你不应该那样做。这可能是API版本控制中最被滥用的特性之一。客户必须知道其要求的版本。允许客户机不指定版本,并将内容从
1.0
转换到
1.1
可能会破坏客户机。服务器不能假设它不会。此功能旨在在以前未定义明确版本的现有服务中使用。该场景仅在首次启用API版本控制时存在。如上所述,所有控制器必须有一个或多个离散API版本,但原始API集没有明确定义。如果此功能不存在,则不知道API版本的客户端基线集将中断。

我仅在发生中断更改时使用新控制器。在所有其他情况下,我只是将新版本添加到现有控制器中。因此,在我的情况下,
allochercontroller
将是多余的。在我的情况下,它破坏了更改。实际上是[Route]改变了。非常感谢您的详细回复,特别是最后一部分:)是的,我们正在“滥用”“AssumeDefaultVersion”选项。我一定会回去好好想想。非常感谢。