【问题标题】:Debugging Swashbuckle Error - Failed to load API Definition调试 Swashbuckle 错误 - 无法加载 API 定义
【发布时间】:2019-01-11 03:07:43
【问题描述】:

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

这不是很有帮助。大约两周前它还在工作……我没有更改任何 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。

【问题讨论】:

  • 打开swagger/v1/swagger.json会得到什么
  • 感谢 Helder,抱歉现在才看到您的评论。是的,打开该文件帮助我解决了问题。
  • 我有一个similar problem,但使用的是 ASP.Net Swashbuckle 5.6.0(最新)。失败看起来完全不同,我没有从请求中获得任何有用的调试信息。我想知道为什么你的 Swashbuckle 的行为如此不同。

标签: swagger asp.net-core-webapi swashbuckle asp.net-core-2.1 .net-core-2.1


【解决方案1】:

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

(我建议在一个大型项目中将链接添加为书签,以便将来您可以直接转到 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)
...

产生错误的原因:

您现在应该能够追踪和修复。

【讨论】:

  • 谢谢斯图尔特!我按照您的指示找到了问题的根源:“System.InvalidOperationException:冲突的 schemaIds:为 PropWorx.API.ModelsShared.User 和 PropWorx.API.Models.User 类型检测到相同的 schemaIds。请参阅配置设置 - “CustomSchemaIds”一种解决方法”
  • 这不适用于 Swagger 8.3.20.403。不再有 swagger.json。有一个 V1 条目已下载,但在预览选项卡中未提供任何信息。
  • 这就像一个魅力,我一直在寻找一种快速简单的方法来调试非类型安全问题。
【解决方案2】:

如果您的 api 具有相同的两个或多个 [HttpGet],则它无法正常工作。 您应该指定 [HttpGet] ,[HttpGet ("{id}")]

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

【讨论】:

    【解决方案3】:

    我发现 SwaggerFunctions 需要匿名才能完成 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"));
        }
    }
    

    【讨论】:

      【解决方案4】:

      我今天遇到了这个问题并尝试解决它,你应该像这个代码一样在 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();
      }
      

      在我的项目中效果很好

      【讨论】:

      • 是的,swagger使用Controller制定的默认路由,所有Programmer自己路由API,所以swagger找不到我们的路由,使用默认,使用它们,所以我们必须从 [http..] 顶部或在它们旁边删除所有 [Route],例如 [httpget,[Route("...")]] 没有它们也可以正常工作
      • 不幸的是我忘了告诉你这一点,你必须像这样设置你的 API 路由:[Route("api/[controller]")]
      猜你喜欢
      • 1970-01-01
      • 2019-11-19
      • 2019-11-13
      • 1970-01-01
      • 2018-10-16
      • 2020-06-06
      • 2019-11-18
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多