swagger Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0报错处理

有时候我们使用swagger会出现如下报错问题:

Failed to load API definition.
Errors

Hide

Fetch error

Internal Server Error /swagger/v1/swagger.json

swagger Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0报错处理_第1张图片

控制台抛出如下异常:

Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0

swagger Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0报错处理_第2张图片

其大概意思是Swagger/OpenAPI 3.0要求Action上必须绑定HttpMethod相关Attribute,否则就报这一大堆错误。这里的HttpMethod其实就是咱们常用HttpGetHttpPostHttpPutHttpDelete相关的Attribute。正常逻辑来说那就给每个Action添加HttpMethod呗,但是往往情况就出现在不正常的时候。因为项目是迁移的老项目,先不说私自改了别人代码带来的甩锅问题,公司的WebApi项目很多,这意味着Action很多,如果一个项目一个项目的去找Action添加HttpMethod可是一个不小的工作量,而且开发人员工作繁忙,基本上不会抽出来时间去修改这些的,因为这种只是Swagger不行,但是对于WebApi本身来说这种写法没有任何的问题,也不会报错,只是看起来不规范。那该怎么办呢?

直接上解决方案:

action没有httpmethod attribute的情况下根据action的开头名称给与默认值:

app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Hero.Api v1"));
//给没有配置httpmethod的action添加默认操作
//从容器中获取IApiDescriptionGroupCollectionProvider实例
var apiDescriptionGroupCollectionProvider = app.ApplicationServices.GetRequiredService();
var apiDescriptionGroupsItems = apiDescriptionGroupCollectionProvider.ApiDescriptionGroups.Items;
//遍历ApiDescriptionGroups
foreach (var apiDescriptionGroup in apiDescriptionGroupsItems)
{
    foreach (var apiDescription in apiDescriptionGroup.Items)
    {
        if (string.IsNullOrEmpty(apiDescription.HttpMethod))
        {
            //获取Action名称
            var actionName = apiDescription.ActionDescriptor.RouteValues["action"];
            //默认给定POST
            var methodName = "POST";
            //根据Action开头单词给定HttpMethod默认值
            if (actionName.StartsWith("get", StringComparison.OrdinalIgnoreCase))
            {
                methodName = "GET";
            }
            else if (actionName.StartsWith("put", StringComparison.OrdinalIgnoreCase))
            {
                methodName = "PUT";
            }
            else if (actionName.StartsWith("delete", StringComparison.OrdinalIgnoreCase))
            {
                methodName = "DELETE";
            }
            apiDescription.HttpMethod = methodName;
        }
    }
}

直接在Configure里面写就行了:

swagger Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0报错处理_第3张图片

你可能感兴趣的:(c#,swagger,c#)