C# 致命:所有操作都需要OperationId。请将其添加到';获取';路径操作

C# 致命:所有操作都需要OperationId。请将其添加到';获取';路径操作,c#,autorest,swashbuckle.aspnetcore,C#,Autorest,Swashbuckle.aspnetcore,我使用AutoRest从swagger.json生成api的客户端 输出是 AutoRest code generation utility [cli version: 3.0.6187; node: v10.16.3, max-memory: 8192 gb] (C) 2018 Microsoft Corporation. https://aka.ms/autorest NOTE: AutoRest core version selected from configuration: ~2.0.

我使用AutoRest从swagger.json生成api的客户端

输出是

AutoRest code generation utility [cli version: 3.0.6187; node: v10.16.3, max-memory: 8192 gb]
(C) 2018 Microsoft Corporation.
https://aka.ms/autorest
NOTE: AutoRest core version selected from configuration: ~2.0.4413.
   Loading AutoRest core      'C:\Users\kirst\.autorest\@microsoft.azure_autorest-core@2.0.4417\node_modules\@microsoft.azure\autorest-core\dist' (2.0.4417)
   Loading AutoRest extension '@microsoft.azure/autorest.csharp' (~2.3.79->2.3.82)
   Loading AutoRest extension '@microsoft.azure/autorest.modeler' (2.3.55->2.3.55)
FATAL: OperationId is required for all operations. Please add it for 'get' operation of '/api/Test' path.
FATAL: AutoRest.Core.Logging.CodeGenerationException: OperationId is required for all operations. Please add it for 'get' operation of '/api/Test' path.
   at AutoRest.Modeler.SwaggerModeler.Build(ServiceDefinition serviceDefinition) in /opt/vsts/work/1/s/src/SwaggerModeler.cs:line 96
   at AutoRest.Modeler.Program.<ProcessInternal>d__2.MoveNext() in /opt/vsts/work/1/s/src/Program.cs:line 60
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at NewPlugin.<Process>d__15.MoveNext()
FATAL: csharp/imodeler1 - FAILED
FATAL: Error: Plugin imodeler1 reported failure.
Process() cancelled due to exception : Plugin imodeler1 reported failure.
  Error: Plugin imodeler1 reported failure.
AutoRest code generation utility [cli version: 3.0.6187; node: v12.16.1, max-memory: 8192 gb]
(C) 2018 Microsoft Corporation.
https://aka.ms/autorest
   Loading AutoRest core      'C:\Users\kirst\.autorest\@autorest_core@3.0.6262\node_modules\@autorest\core\dist' (3.0.6262)
   Loading AutoRest extension '@microsoft.azure/autorest.csharp' (~2.3.79->2.3.84)
   Loading AutoRest extension '@microsoft.azure/autorest.modeler' (2.3.55->2.3.55)
FATAL: OperationId is required for all operations. Please add it for 'get' operation of '/api/Values' path.
FATAL: AutoRest.Core.Logging.CodeGenerationException: OperationId is required for all operations. Please add it for 'get' operation of '/api/Values' path.
   at AutoRest.Modeler.SwaggerModeler.Build(ServiceDefinition serviceDefinition) in /opt/vsts/work/1/s/src/SwaggerModeler.cs:line 96
   at AutoRest.Modeler.Program.<ProcessInternal>d__2.MoveNext() in /opt/vsts/work/1/s/src/Program.cs:line 60
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at NewPlugin.<Process>d__15.MoveNext()
  Error: Plugin imodeler1 reported failure.
[更新]

我在Swagger属性地狱里呆了两天,试图升级我的解决方案以使用netcore3.1和AutoRest 3

它将帮助我了解需要在values控制器上添加哪些属性才能生成客户机代码

[Route("api/[controller]")]
[Produces("application/json")]
public class ValuesController : Controller
{
    public ValuesController()
    {
    }

    [HttpGet()]
    [Produces("application/json")]
    public IEnumerable<string> Get()
    {
        return new string[] {"value1", "value2"};
    }

    [Produces("application/json")]
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }

    [HttpPost()]
    public void Post([FromBody] string value)
    {
    }

    // PUT api/values/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody] string value)
    {
    }

    // DELETE api/values/5
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
    }
}
输出是

AutoRest code generation utility [cli version: 3.0.6187; node: v10.16.3, max-memory: 8192 gb]
(C) 2018 Microsoft Corporation.
https://aka.ms/autorest
NOTE: AutoRest core version selected from configuration: ~2.0.4413.
   Loading AutoRest core      'C:\Users\kirst\.autorest\@microsoft.azure_autorest-core@2.0.4417\node_modules\@microsoft.azure\autorest-core\dist' (2.0.4417)
   Loading AutoRest extension '@microsoft.azure/autorest.csharp' (~2.3.79->2.3.82)
   Loading AutoRest extension '@microsoft.azure/autorest.modeler' (2.3.55->2.3.55)
FATAL: OperationId is required for all operations. Please add it for 'get' operation of '/api/Test' path.
FATAL: AutoRest.Core.Logging.CodeGenerationException: OperationId is required for all operations. Please add it for 'get' operation of '/api/Test' path.
   at AutoRest.Modeler.SwaggerModeler.Build(ServiceDefinition serviceDefinition) in /opt/vsts/work/1/s/src/SwaggerModeler.cs:line 96
   at AutoRest.Modeler.Program.<ProcessInternal>d__2.MoveNext() in /opt/vsts/work/1/s/src/Program.cs:line 60
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at NewPlugin.<Process>d__15.MoveNext()
FATAL: csharp/imodeler1 - FAILED
FATAL: Error: Plugin imodeler1 reported failure.
Process() cancelled due to exception : Plugin imodeler1 reported failure.
  Error: Plugin imodeler1 reported failure.
AutoRest code generation utility [cli version: 3.0.6187; node: v12.16.1, max-memory: 8192 gb]
(C) 2018 Microsoft Corporation.
https://aka.ms/autorest
   Loading AutoRest core      'C:\Users\kirst\.autorest\@autorest_core@3.0.6262\node_modules\@autorest\core\dist' (3.0.6262)
   Loading AutoRest extension '@microsoft.azure/autorest.csharp' (~2.3.79->2.3.84)
   Loading AutoRest extension '@microsoft.azure/autorest.modeler' (2.3.55->2.3.55)
FATAL: OperationId is required for all operations. Please add it for 'get' operation of '/api/Values' path.
FATAL: AutoRest.Core.Logging.CodeGenerationException: OperationId is required for all operations. Please add it for 'get' operation of '/api/Values' path.
   at AutoRest.Modeler.SwaggerModeler.Build(ServiceDefinition serviceDefinition) in /opt/vsts/work/1/s/src/SwaggerModeler.cs:line 96
   at AutoRest.Modeler.Program.<ProcessInternal>d__2.MoveNext() in /opt/vsts/work/1/s/src/Program.cs:line 60
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at NewPlugin.<Process>d__15.MoveNext()
  Error: Plugin imodeler1 reported failure.
AutoRest代码生成实用程序[cli版本:3.0.6187;节点:v12.16.1,最大内存:8192 gb]
(C) 2018年微软公司。
https://aka.ms/autorest
正在加载自动测试核心'C:\Users\kirst\.AutoRest\@AutoRest_core@3.0.6262\节点模块\@autorest\core\dist'(3.0.6262)
正在加载自动测试扩展“@microsoft.azure/AutoRest.csharp”(~2.3.79->2.3.84)
正在加载自动测试扩展“@microsoft.azure/AutoRest.modeler”(2.3.55->2.3.55)
致命:所有操作都需要OperationId。请为“/api/Values”路径的“get”操作添加它。
致命:AutoRest.Core.Logging.CodeGenerationException:所有操作都需要OperationId。请为“/api/Values”路径的“get”操作添加它。
在/opt/vsts/work/1/s/src/SwaggerModeler.cs中的AutoRest.Modeler.SwaggerModeler.Build(ServiceDefinition-ServiceDefinition)处:第96行
在/opt/vsts/work/1/s/src/Program.cs中的AutoRest.Modeler.Program.d_uu2.MoveNext()处:第60行
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在NewPlugin.d_uu15.MoveNext()上
错误:插件imodeler1报告失败。
在api代码中,我有TargetFramework netcoreapp3.1、Swashback.AspNetCore 5.2.0、FluentValidation 8.6.2

当我的api在.NETCore2.1中时,一切都正常工作 然而,我想调用.netstandard2库,所以我将api升级到netcore3.1

这份报告似乎不完整。没有提到自动测试。我想知道我是否应该尝试另一种代码生成器

[更新]

来自.netcore2.1分支的json示例

来自.netcore3.1分支的json示例

然而,这种比较可能不公平,因为我可能已经改变了netcore3.1分支中的内容

我已经为设置了一个示例存储库,并将为此设置一个netcore2.1分支。

我认为最新的Swagger(5.2.1)默认情况下不会为操作生成
操作ID
,因为它是一个

operationId是用于标识操作的可选唯一字符串。如果提供,这些ID在API中描述的所有操作中必须是唯一的

然而,AutoRest似乎使用它来识别每种方法。我发现了一个解决方法,人们通过配置AutoRest来使用标记而不是操作ID来标识方法,从而解决了这个问题

AutoRest使用operationId确定给定API的类名/方法名

如果您不想使用标记,或者您的标记不够唯一,您可以要求Swagger通过以下方式向生成的JSON添加操作ID:

options.SwaggerDoc(...);

// Tell Swagger where to find operation ID.
// In this example, use the controller action name.
options.CustomOperationIds(
    d => (d.ActionDescriptor as ControllerActionDescriptor)?.ActionName);

虽然这对OP来说可能有点太晚了,但下面是CustomOperationIds()的另一个用法,可以解决这个问题:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo {Title = "Your API", Version = "v1"});
    c.CustomOperationIds(apiDesc => apiDesc.TryGetMethodInfo(out MethodInfo methodInfo) ? methodInfo.Name : null);
});

我想知道我是否应该尝试不同于Autorest的生成器您介意发布一个您的
swagger.json
?如果您正在寻找替代工具,请尝试NSwag-Autorest对我来说非常有效。谷歌搜索“Autrest vs”打开了一个调查的兔子洞。我从来没有尝试过自动测试,因为我的主要编程语言是C#,所以我使用NSwag,它也是一个nuget包,我可以用流体模板编写自己的代码。谢谢你解决了这个问题。错误现在是根据