调试 Swashbuckle 错误 - 无法加载 API 定义

Debugging Swashbuckle Error - Failed to load API Definition

有什么方法可以获取有关 Swashbuckle/Swagger 错误的堆栈跟踪或内部异常?在某个时候,它停止了工作。我不确定是不是我从 .Net Core 2.0 升级到 2.1 时发生的,但我很确定在那之后它仍然在工作。当我导航到 myapidomain/swagger/index.html 时出现此错误:

这不是很有帮助。它在大约 2 周前工作......我没有更改任何 Swagger 配置。与以往一样:

public void ConfigureServices(IServiceCollection services)
{
    ...
     services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info
            {
                Version = "v1",
                Title = "My.API",
                Description = "Test"
            });
        });   
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
        app.UseDeveloperExceptionPage();
    else
        app.UseHsts();

    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "PropWorx API V1");
    });
    ...
}

我在 ASP.Net Core 2.1 Web API.

上使用 Swashbuckle.AspNetCore 3.0.0

同意 UI 调试并不是很有用,但是可以通过打开浏览器的调试工具(例如 Chrome 上的 F12)来抓取完整的异常跟踪,刷新您的 /swagger 端点,然后检查 swagger.json 有效载荷 - 这是一个 XHR 请求,它将失败并显示 500 状态代码。

(我建议您在大型项目中为 link 添加书签,这样以后您就可以直接转到 json 文件,例如 https://MyHost/swagger/v1/swagger.json

例如在下面的人为错误中,我在两种方法之间复制了相同的路线:

[HttpGet]
[Route("parseenum")]
public ActionResult CheckEnum([FromQuery] MyEnum someEnum)
...

[HttpGet]
[Route("parseenum")]
public ActionResult CheckEnum2([FromQuery] MyEnum someEnum)
...

产生错误:

您现在应该能够找到并修复它。

我今天遇到了这个问题并尝试了很多来解决它,你应该像这段代码一样在 C# 控制器代码中删除 [http] 标记之前的所有 [Route] 例如:

[Route("~/api/getAll")]
[HttpGet]
public ActionResult<List<asteriksModel>>GetAll()
{
    return _context.asterList.ToList();
}

你的路由代码必须是这样的

[HttpGet]
public ActionResult<List<asteriksModel>>GetAll()
{
    return _context.asterList.ToList();
}

在我的项目中它运行良好

如果您的 api 有相同的两个或更多 [HttpGet] 它不会招摇。 您应该指定 [HttpGet] , [HttpGet ("{id}")]

  [HttpGet]
`[HttpGet ("{id}")]`

我发现 SwaggerFunctions 需要通过 Anonymous 才能完成 Swagger/UI。

public static class SwaggerFunctions
{
    [SwaggerIgnore]
    [FunctionName("Swagger")]
    public static Task<HttpResponseMessage> Swagger(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "swagger/json")]
    HttpRequestMessage req,
        [SwashBuckleClient] ISwashBuckleClient swashBuckleClient)
    {
        return Task.FromResult(swashBuckleClient.CreateSwaggerDocumentResponse(req));
    }

    [SwaggerIgnore]
    [FunctionName("SwaggerUi")]
    public static Task<HttpResponseMessage> SwaggerUi(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "swagger/ui")]
    HttpRequestMessage req,
        [SwashBuckleClient] ISwashBuckleClient swashBuckleClient)
    {
        return Task.FromResult(swashBuckleClient.CreateSwaggerUIResponse(req, "swagger/json"));
    }
}