使用c.CustomOperationIds时检查OperationId的唯一性?

问题描述 投票:0回答:1

目前,如果您使用以下

c.CustomOperationIds(apiDesc =>
{
    return apiDesc.TryGetMethodInfo(out MethodInfo methodInfo) ? methodInfo.Name : null;
});

而且,由于程序员的错误,你有两个同名的方法,你没有被警告说你违反了OpenAPI规范。

有什么方法可以添加一个检查?

我在想,要么

  • 在生成结束时,如 "2个id为{0}的操作"
  • 当swashbuckle调用CustomOperationId "selector "时,有一个钩子来访问已经定义的操作。

谢谢你的时间

P.S : 使用Swashbuckle.AspNetCore.SwaggerGen 5.3.1。

swashbuckle
1个回答
0
投票

经过多次尝试,我找到了一个变通方法:使用一个操作过滤器,如果OperationId已经被使用,它将抛出一个异常。

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;

namespace Service.Utils
{
    /// <summary>
    /// Guarantee that OperationId is not already used
    /// </summary>
    public class SwaggerUniqueOperationId : IOperationFilter
    {
        private readonly HashSet<string> ids = new HashSet<string>();

        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            if (operation.OperationId != null)
            {
                if (ids.Contains(operation.OperationId))
                    throw new NotSupportedException($"There are 2 operations with same OperationId {operation.OperationId}");
                ids.Add(operation.OperationId);
            }
        }
    }
}

这一点也不理想,因为错误信息非常模糊,而且是一个运行时错误,但这比提供一个违反这个唯一OperationId约束的OpenApi规范要好......。

© www.soinside.com 2019 - 2024. All rights reserved.