【问题标题】:ASP.NET Core 3.1 AWS Lambda Swagger definition not working when deployedASP.NET Core 3.1 AWS Lambda Swagger 定义在部署时不起作用
【发布时间】:2020-08-06 11:11:55
【问题描述】:

在 Startup.cs 中配置以下代码

变量。

private const string SwaggerDocumentVersionName = "v1";
private static string SwaggerDocumentServiceName => $"Users API({SwaggerDocumentVersionName})";

ConfigureServices 方法。

services.AddSwaggerGen(c =>
{
   c.SwaggerDoc(
         SwaggerDocumentVersionName, 
               new OpenApiInfo
               {
                   Title = SwaggerDocumentServiceName,
                   Version = $"{SwaggerDocumentVersionName}"
               });
});

Configure 方法。

app.UseSwagger(c =>
{
    c.RouteTemplate = "/swagger/{documentName}/swagger.json";
});

app.UseSwaggerUI(c =>
{
    c.RoutePrefix = "swagger/ui";
    c.SwaggerEndpoint($"/swagger/{SwaggerDocumentVersionName}/swagger.json", SwaggerDocumentServiceName);
});

在本地运行时(https://localhost:5001/swagger/ui 解析为 https://localhost:5001/swagger/ui/index.html)定义正确加载,一切看起来都很好。

将服务作为 ASP.NET Core REST API 部署到 AWS Lambda 并导航到 URL(https://DNS_URL/API_PREFIX/swagger/ui 解析为 https://DNS_URL/API_PREFIX/swagger/ui/index.html)显示以下加载 JSON 定义的错误。

有趣的是,如果您导航到 JSON 定义路由 (https://DNS_URL/API_PREFIX/swagger/v1/swagger.json),它会显示定义。

【问题讨论】:

  • 您托管在 Lambda 上的 swagger 最有可能调用 https://DNS_URL/swagger/v1/swagger.json(不带前缀) - 返回 404,因此它没有加载,您必须为 production 构建配置 swagger 前缀
  • @kebek 不确定我明白这意味着什么,您是否看到配置错误?

标签: c# asp.net-core swagger


【解决方案1】:

您在 lambda 上发布的 API 的主要 URL 是 https://DNS_URL/API_PREFIX/

Swagger UI 需要获取 swagger.json 文件才能使其工作,并且对于您的本地主机它可以正常工作,因为 https://localhost:5001/swagger/v1/swagger.json 是一个有效的端点

(*这里没有前缀)

而部署到 lambda 的版本正试图在

下获取这个 swagger.json 文件

https://DNS_URL/swagger/v1/swagger.json - 没有您的API_PREFIX,因此它返回 404,未找到,并且 swagger ui 正在显示错误消息。

快速修复,您可能会应用,我认为它会起作用:

app.UseSwaggerUI(c =>
{
    c.RoutePrefix = "swagger/ui";
    c.SwaggerEndpoint($"{env.IsDevelopment() ? "" : API_PREFIX}/swagger/{SwaggerDocumentVersionName}/swagger.json", SwaggerDocumentServiceName);
});

API_PREFIX 是一个以 '/' 开头的字符串

【讨论】:

  • 我昨天试过了,但看起来我很可能错过了“/”。现在可以正常使用了。
猜你喜欢
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多