ФАТАЛЬНО: OperationId требуется для всех операций. Пожалуйста, добавьте его для операции «get» пути - PullRequest
0 голосов
/ 23 марта 2020

Я использую AutoRest для создания клиентской части API из swagger. json

Вывод

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()
    {

[Обновление]

Я провел 2 дня в аду атрибутов Swagger, как я пытаюсь и обновить мое решение для использования netcore3.1 и AutoRest 3

. Это поможет мне узнать, какие атрибуты мне нужно установить на контроллере значений, чтобы иметь возможность генерировать код клиента.

[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 кажется неполным. Нет упоминания об Авторесте. Интересно, стоит ли мне пытаться использовать другой генератор кода?

[Обновить]

Образец json из ветви .netcore2.1 api test

Образец json из ветви .netcore3.1

netcore3.1 branch

Однако сравнение может быть несправедливым, поскольку я мог что-то изменить в netcore3.1 Разветвление.

Я создал образец репозитория для этого связанного вопроса и настрою для этого ветку netcore2.1.

1 Ответ

2 голосов
/ 26 марта 2020

Я думаю, что последний Swagger (5.2.1) по умолчанию не генерирует OperationId для операций, потому что это необязательный идентификатор согласно их документам .

operationId необязательная уникальная строка, используемая для идентификации операции. Если они указаны, эти идентификаторы должны быть уникальными среди всех операций, описанных в вашем API.

Однако AutoRest, похоже, использует это для идентификации каждого метода. Я нашел вопрос / проблему Github , где люди решили эту проблему, настроив AutoRest для использования тегов вместо идентификатора операции для идентификации метода.

AutoRest использует operationId для определения имени класса / имени метода для данного API.

Если вы не хотите использовать теги, или ваши теги недостаточно уникальны Вы можете попросить Swagger добавить идентификатор операции к сгенерированному 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);
...