1

我正在尝试使用 NSwag 和 Autorest 为 api 创建一个代码包装器。

以前我使用 Swashbuckle 生成 swagger 文件。它生成了带有 operationIds 格式的 swagger 文件actionMethod。这导致 Autorest 生成一个深度为 1 的代码客户端。所有的动作都在顶级级别。

由于各种原因,我需要将 swagger 生成更改为 NSwag。这会生成格式为 的 operationIds controller_actionMethod。这导致 AutoRest 创建一个复合类,该类公开具有每个控制器操作的单独类。

怎么可能

  • 更改 NSwag 生成 operationIds 的方式
  • 更改 Autorest 映射 operationId 的方式

注意:我知道我可以手动更改 swagger.json,但我想保持一致的自动化流程来生成代码客户端。

4

2 回答 2

5

似乎没有任何现成的设置,但您可以挂钩到 NSwag 的生成过程

https://github.com/RicoSuter/NSwag/wiki/Document-Processors-and-Operation-Processors#operation-processors

运算处理器

class FlattenOperationsProcessor: IOperationProcessor
{
    public async Task<bool> ProcessAsync(OperationProcessorContext context)
    {
        context.OperationDescription.Operation.OperationId = $"{context.MethodInfo.Name}";
        return true;
    }
}

然后在 Startup.cs 中添加

document.OperationProcessors.Add(new FlattenOperationsProcessor());
于 2019-05-17T17:48:30.450 回答
0

不确定在提出问题时这是否可用,但这是一种非常简单的方法:

services.AddSwaggerGen(c =>
{
    ...
    c.CustomOperationIds(d => d.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor ? controllerActionDescriptor.MethodInfo.Name : d.ActionDescriptor.AttributeRouteInfo?.Name);
});

同样也可以通过设置c.SwaggerGeneratorOptions.OperationIdSelector

请注意,这是我从这里ActionDescriptor.AttributeRouteInfo?.Name的源代码中使用的默认值

于 2021-02-09T02:37:40.797 回答