Swagger 未加载 - 无法加载 API 定义:获取错误未定义

Swagger not loading - Failed to load API definition: Fetch error undefined

尝试结合托管在 IIS Express 上的 Web 应用程序来设置 swagger。 API 是使用 ASP Net Core 构建的。我已按照有关 Swashbuckle 和 ASP.NET Core 的相关 Microsoft 帮助页面上规定的说明进行操作。

到目前为止,我已经加载了 swagger 页面,并且可以看到我定义的 SwaggerDoc 正在加载,但是 API 不存在。当前出现以下错误:

"Fetch error undefined ./swagger/v1/swagger.json"

public class Startup
{

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // services.AddDbContext<TodoContext>(opt =>
        // opt.UseInMemoryDatabase("TodoList"));
        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // Register the Swagger generator, defining 1 or more Swagger documents
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "API WSVAP (WebSmartView)", Version = "v1" });
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

        // Enable middleware to serve generated Swagger as a JSON endpoint.
        app.UseSwagger();

        // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
        // specifying the Swagger JSON endpoint.
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("./swagger/v1/swagger.json", "My API V1");
            c.RoutePrefix = string.Empty;
        });

        app.UseMvc();
    }
}

所以在进行了大量的故障排除之后,基本上可以归结为两件事,但我觉得总的来说这可能对将来的其他人有所帮助,所以我发布了一个答案。

首先 - 如果您遇到上述错误,实际查看发生了什么的最佳方法是将以下行添加到您的 Configure() 方法

app.UseDeveloperExceptionPage();

现在,如果您导航到 'swagger/v1/swagger.json' 页面,您应该会看到更多信息,这些信息将为您指明有用的方向。

其次-现在对我来说错误是

'Multiple operations with path 'some_path' and method 'GET' '

然而,这些 API 位于依赖库内部,因此我无法在定义点应用解决方案。作为一种解决方法,我发现将以下行添加到您的 ConfigureServices() 方法可以解决问题

services.AddSwaggerGen(c =>
{
     c.SwaggerDoc("v1", new Info { Title = "API WSVAP (WebSmartView)", Version = "v1" });
     c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); //This line
});

最后 - 毕竟我能够生成 JSON 文件,但我仍然无法提取 UI。为了使这项工作正常进行,我不得不更改 Configure()

中的终点
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("./v1/swagger.json", "My API V1"); //originally "./swagger/v1/swagger.json"
});

我不确定为什么这是必要的,尽管可能值得注意的是 Web 应用程序的虚拟目录托管在 IIS 上,这可能会产生影响。

注意:导航至 swagger/v1/swagger.json 将为您提供更多详细信息,对我来说,这是由于未修饰的操作引起的问题。 @MarkD

的评论中提到了此信息

希望这对以后的人有所帮助。

我有类似的问题,我在有问题的控制器方法上使用 Route 属性解决了它:

[HttpGet, Route("Throw")]
public ActionResult<string> Throw()
{
    _logger.LogInformation("I think I am going to throw up");
    throw new NotSupportedException("For testing unhandled exception logging.");
}

我觉得 ResolveConflictingActions 可能会掩盖真正的问题。

在我的例子中,控制器 class 和 URL 中有两个方法具有相同的注释。 (我们的团队使用 Entity Framework、ASP.NET 和 Swagger。)

    [HttpGet("GetMyGreatData/{patientId}")]
    [ValidatePatient]
    public async Task<ActionResult<ServiceResponse<IEnumerable<MyGreatModel>>>> GetMyGreatData(
    [FromRoute] int patientId, int offset = 0, int limit = 0)
    {
        //method details...
    }


    [HttpGet("GetMyGreatData/{patientId}")]
    [ValidatePatient]
    public async Task<ActionResult<ServiceResponse<IEnumerable<MyGreatModel>>>> GetMyGreatData( 
    [FromRoute] int patientId, 
    [FromQuery] DateTimeOffset? startdate = null,
    [FromQuery] DateTimeOffset? endDate = null,
    int offset = 0,
    int limit = 0)
    {
        //method details...
    }

删除一种方法解决了我的问题。

我有两个问题导致了同样的错误。

  1. 我在两个不同的命名空间下有两个同名的类。在生成 swagger 文档时,Swagger 无法协调这一点。为了修复它,我添加了行 options.CustomSchemaIds(x => x.FullName);

  2. 我有一个没有 [HttpGet] 注释的方法。 Swagger 需要显式定义 HTTP 端点。

我在 API 加载后通过检查 visual studio 中的输出发现了这两个问题。

我在这个问题上只花了两个小时,但我的原因完全不同,它与路由或注释无关。我有 2 个 class 同名(但命名空间不同):MyProject.Common.ClassNameMyProject.Api.ClassName。 Swagger/swashbuckle 无法分辨两者之间的区别,所以我得到了那个无用的错误。

这 2 个小时用于 trial-and-error 评论控制器和端点,最终找到 3 个端点违规端点。所有 3 个端点都有不同的路由、不同(或没有)自定义授权和不同的方法名称。事实证明,所有 3 个端点要么接受一个参数,要么返回一个对象,其中包含我的 class 的 API 版本。没有使用通用版本。 Swagger 无法区分它们,吐了一身。

为什么哦,为什么 Swagger 或 Swashbuckle 不能提供实际的错误消息?本来可以节省我几个小时...

我一直在使用 .Net Core 3.1,我花了一些时间来找出并理解发生了什么。

问题可能由多种不同原因引起:

  1. Swagger 配置错误

  2. 类 具有相同的名称但在不同的命名空间中

  3. Public 没有 rest 属性的方法(Get、Post 等)

首先,请看下面的 link 以检查您的设置是否正确:

Add Swagger(OpenAPI) API Documentation in ASP.NET Core 3.1

然后,

找出问题的一个好方法是 运行 不使用 IISExpress 的应用程序并检查控制台日志。生成文档时发现的任何错误都将显示在那里。

在我的例子中,问题是我有一个没有任何 rest 属性的 public 方法(应该是私有的):

将方法从 public 更改为 private 后我解决了问题。

我通过打开网络选项卡并查看 swagger.json

的响应找到了错误

我以前遇到过同样的错误,在努力寻找原因后,我发现我的一个控制器中的一个 API 没有 HTTP 动词作为属性,所以我修复了它通过将 [HttpGet] 放在我的 API 上。 所以这是我的建议,检查你的 API 控制器,也许你忘记了和我一样的东西!

看看我的代码,我意识到我应该改变这个:

   public async Task<Product> ProductDetail(int id)
    {
        return await _productQueries.GetProductDetail(id);
    } 

对此:

        [Route("ProductDetail")]
        [HttpPost]
        public async Task<Product> ProductDetail(int id)
        {
            return await _productQueries.GetProductDetail(id);
        } 

我遇到了同样的问题,基本控制器没有用 Http 装饰,删除它后它就可以工作了。

只需导航到 https://localhost:{PortNo}/swagger/v1/swagger.json 并获取有关错误消息的更多详细信息。

将应用服务部署到 Azure 时可能会发生此错误。我已将应用服务重新部署到 Azure,错误消失了。

当这件事发生在我身上时,我追踪到 URL 带有下划线的路径参数,它与 asp 生成器

兼容

改变这个:

/block-content/{machine_name}:

对此

/block-content/{machineName}:

帮我解决了

我在 .NET 5.0 中也遇到了类似的问题,我通过以下方式解决了:

我在控制器上添加了这一行作为属性:

[Consumes("application/json")]

我只是忘记在添加 HTTP 属性后立即在我的控制器中添加 HTTP 属性,这对我来说就像一个魅力。

来源:https://www.benday.com/2020/12/16/webapi-core-swagger-failed-to-load-api-definition-error/

我遇到了同样的问题,所以我在浏览器上使用 inspect element 检查了它。 “控制台”选项卡显示问题源自的文件 (v1/swagger/json:1)。通过单击打开它显示我在控制器中使用的辅助方法之一是“Public”。将其更改为“私人”解决了我的问题。

这个页面也有很好的提示: https://btrehberi.com/swagger-failed-to-load-api-definition-fetch-error-undefined-hatasi-cozumu/yazilim/

在我的案例中,Swagger 需要控制器中所有 public 成员的 [HttpAction]。不幸的是,我拼错了构造函数名称,因为它是 public,所以抛出了这个错误。

对于 ASP.NET Core 3.1,我必须确保动词没有歧义,我首先 运行 VS2019 中没有 IIS 的 API 项目发现了这一点(绿色箭头 > 左-单击胡萝卜图标和 select 项目名称,这会导致控制台 window 出现在启动时,以便您可以检查发生了什么并查看错误)。

[HttpGet("MyEndPointA")

这样Swagger就可以正确生成文档了。

<b>make sure the name "v1" matches the path in the swagger endpoint</b>
    <p>
    services.AddSwaggerGen(c =>
       {
     c.SwaggerDoc("v1", new OpenApiInfo { 
Title = "ODAAPP",  
Version = "v1" });
                });
                </p>
                <br/>

app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json",
                             "ODAAPP v1"));

enter code here

我一直在使用 .NET 5,我花了一些时间试图了解发生了什么。

我收到如下错误:

然后我通过以下方式解决了这个问题:

打开startup.cs文件 在Configure方法

中添加如下代码
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger(c =>
        {
            c.RouteTemplate = "/swagger/{documentName}/swagger.json";
        });
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"));
    }

并在 ConfigureServices 方法中

    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
        c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
    });

感谢TheCodeBuzz for Resolved: Failed to load API definition (undefined /swagger/v1/swagger.json)

注意 RouteTemplate 字符串和 SwaggerEndpoint 字符串之间的区别。一个使用 {documentName},另一个使用“v1”作为文字。

如果您对多个操作方法使用相同的路由,也会发生这种情况(可以重载)

在我的例子中,项目被配置为在 startup.cs 使用 AddPolicy() 使用身份服务器 4 进行身份验证,并且有 [Authorize]

的用法

我删除了 startup.cs 的东西和 [Authorize]

的用法

会尽快更新

解决了 dotNet 6 中的问题!只需更改 [ApiController]

的属性顺序即可

肯定是Controller的某个方法出了问题。为了得到这个方法,有时你可能需要把你所有的控制器都拿出来,一个接一个地尝试插入,然后你会一起测试找到有错误的控制器。

例如。如果你喜欢 3Controllers 说

>Controller
>>>AuthController
>>>UserController
>>>HomeController

从控制器中取出两个,每次测试成功后,再添加一个控制器来测试控制器。有了它你就会知道控制器有错误的方法。

>Controller
>>>AuthController
如果 AuthenController 中的方法没问题,它会 运行,如果不检查方法。
>Controller
>>>AuthController
>>>UserController

然后像Authen一样对控制器进行下一步检查

在我的例子中,我有两个相同的内部 类。 将它们提取到一个重构命名空间和 voilá,所有恢复正常工作。

我在使用 Swagger 和 Microsoft.AspNetCore.OData 时遇到了同样的错误。我通常尝试使用最新版本 - 但将其降至 v 7.5.12 - 确实解决了我的问题。

还向控制器中的每个 Action 方法添加以下内容,使其也可以与 OData v8.x 一起使用:[HttpGet]、[HttpPost][ApiExplorerSettings(IgnoreApi = true)]

当我尝试将 Swagger 文档集成到 ASP.NET Core 3.1 Web API 项目。我尝试了几乎所有上述建议但都失败了。 hit-and-trial 一小时后,我决定使用 this reference 来尝试 NSwag,而不是 Swashbuckle,它只是工作起来很有魅力:)

我遇到了类似的问题 - 根本原因是我忘记添加注释了:-(

此错误的原因

我通过这种方式解决了这个问题 在 api 控制器方法上方使用 [HttpGet] 属性。

而且,由于swashbuckle的版本不同,可能会出现这些错误。

你应该使用正确的 swagger 端点url

v1/swagger.json   or swagger/v1/swagger.json

根据您使用的版本选择以上一项。

注:

用这个url参考https://myget.org/feed/domaindrivendev/package/nuget/Swashbuckle.AspNetCore.Swagger/6.2.3-preview-1963

参考官方swagger文档。 crystal 清晰的文件中有很多信息 https://swagger.io/docs/

'Multiple operations with path 'some_path' and method 'GET' '

[HttpGet]
public IActionResult Get()
{
    return Ok(_userService.Get());
}

[HttpGet]
public IActionResult Get(int Id)
{
    return Ok(_userService.Get(Id));
}

只需修改DataAnnotation:

[HttpGet]
public IActionResult Get()
{
    return Ok(_userService.Get());
}

[HttpGet("{Id}"] //HERE
public IActionResult Get(int Id)
{
    return Ok(_userService.Get(Id));
}

我遇到了同样的错误,解决方法是在我的控制器中添加 [HttpGet] 属性

开始吧:

我创建了 WEB 控制器而不是 WEB API 控制器。这就造成了这种错误。 在创建新控制器的过程中,确保您创建了正确的 WEB API 控制器。