c# - FATAL : OperationId is required for all operations. 请为路径的 'get'操作添加它

标签 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.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.

我注意到 swagger.json 没有提到 operationId

但我确实在 api 中提到了它

    [AllowAnonymous]
    [HttpGet("Test")]
    [SwaggerOperation(OperationId = "Test")]

    public IActionResult Test()
    {

[更新]

我在 Swagger Attribute Hell 中度过了 2 天,因为我尝试升级我的解决方案以使用 netcore3.1 和 AutoRest 3

这将帮助我了解我需要将哪些属性放在值 Controller 上才能生成客户端代码。

[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 --v3 --input-file=https://mywebsite/myapi/v1/swagger.json --output-folder=generated --csharp --namespace=myconnector

输出是

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.

在 api 代码中,我有 TargetFramework netcoreapp3.1、Swashbuckle.AspNetCore 5.2.0、FluentValidation 8.6.2

当我的 api 在 .net core 2.1 中时,我一切正常 但是我想调用 .netstandard2 库所以我将我的 api 升级到 netcore3.1

docs似乎不完整。没有提到自动休息。我想知道我是否应该尝试不同的代码生成器。

[更新]

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

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

netcore3.1 branch

但是比较可能不公平,因为我可能已经更改了 netcore3.1 分支中的内容。

我已经为 this related question 设置了一个示例存储库并将为此建立一个 netcore2.1 分支。

最佳答案

我认为最新的 Swagger (5.2.1) 默认情况下不会为操作生成 OperationId,因为它是一个 optional identifier as per their docs .

operationId is an optional unique string used to identify an operation. If provided, these IDs must be unique among all operations described in your API.

但是,AutoRest 似乎使用它来识别每个方法。我找到了一个 Github question / issue人们通过将 AutoRest 配置为使用标签而不是操作 ID 来识别方法来解决这个问题。

AutoRest uses operationId to determine the class name/method name for a given API.

如果您不想使用标签,或者您的标签不够独特,您可以要求 Swagger 将操作 ID 添加到生成的 JSON 中,方法是:

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);

关于c# - FATAL : OperationId is required for all operations. 请为路径的 'get'操作添加它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60819169/

相关文章:

c# - 如何更新链接到 List<string> 的数组

c# - 带有 SqlTransaction 的 ExecuteScalar()

c# - bundle 的 css 链接出现 404 错误

npm - ExperimentalWarning : The fs. promise API 是实验性的

时间:2019-04-01 标签:c#swagger openapi erronous refs when nested classes

c# - 使用 AT COMMANDS 接收短信

visual-studio-2017 - 为什么 Visual Studio 2017 无法为 Swagger Petstore 生成 REST API 客户端?

c# - Microsoft.OpenApi.Models.OpenApiDocument.SerializeAsV2 无效的 URI : The format of the URI could not be determined

asp.net-core - 仅针对 MVC 核心应用程序中的 API Controller 生成 Swagger/Swashbuckle 文档

.net - 如何使用 Swashbuckle 在生成的 Swagger 文件中生成全局参数?