【问题标题】:Swagger not loading - Failed to load API definition: Fetch error undefinedSwagger 未加载 - 无法加载 API 定义:获取错误未定义
【发布时间】:2019-11-13 12:33:08
【问题描述】:

尝试将 swagger 与托管在 IIS express 上的 Web 应用程序一起设置。 API 是使用 ASP Net Core 构建的。我已按照相关 Microsoft 帮助页面上关于 Swashbuckle 和 ASP.NET Core 的说明进行操作。

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

“获取错误未定义./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();
    }
}

【问题讨论】:

  • 您能解释一下您在启动时为配置类分配接口的情况吗?
  • 使用c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
  • jPhizzle - 这是以前的故障排除尝试遗留下来的。我已经更新了代码。道歉
  • Akash KC - 我最初尝试过,不幸的是没有变化。
  • 浏览器开发工具的控制台选项卡上的错误信息是什么?

标签: c# asp.net-mvc swagger-ui swashbuckle


【解决方案1】:

就我而言,我有两个相同的内部类。 将它们提取到一个单一的重构命名空间和瞧,所有恢复正常工作。

【讨论】:

    【解决方案2】:

    我一直在使用 .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());
        });
    

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

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

    【讨论】:

      【解决方案3】:

      肯定是控制器的方法之一有问题。要获得该方法,有时您可能需要取出所有控制器,尝试将它们一个接一个地插入,然后您将测试找到有错误的控制器。

      例如。如果你喜欢 3Controllers 说

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

      从控制器中取出两个并通过在每次成功测试后添加一个控制器来测试控制器。这样你就可以知道哪个控制器有错误的方法。

      >Controller
      >>>AuthController
      如果 AuthenController 中的方法正常,它将运行,如果不检查方法。
      >Controller
      >>>AuthController
      >>>UserController

      并像 Authen 一样对控制器进行下一次检查。

      【讨论】:

        【解决方案4】:

        解决了 dotNet 6 中的问题!只需更改[ApiController]的属性顺序即可

        【讨论】:

          【解决方案5】:

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

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

          会尽快更新

          【讨论】:

            【解决方案6】:

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

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

            app.UseDeveloperExceptionPage();
            

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

            其次-现在对我来说,错误类似于

            '路径'some_path'和方法'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 在评论中提到了此信息

            希望这对将来的某人有所帮助。

            【讨论】:

            • 直接导航到 swagger/v1/swagger.json 解决了这个问题。未经修饰的动作。
            • 导航到 swagger/v1/swagger.json 也为我解决了我的问题 - 操作需要一个明确的 [HttpGet] 属性
            • 在浏览器中导航到应用程序的 swagger.json 已经清楚地显示了错误。 localhost:808/swagger/v1/swagger.json
            • 添加这一行 ResolveConflictingActions 解决了我的问题。
            • 我还将相同的端点路径更改为“./v1/swagger...”以使其在 Web 服务器上运行。很奇怪的要求。新路径在本地调试和服务器上运行良好。似乎这将是项目模板中的默认设置。
            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              <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

              【讨论】:

                【解决方案9】:

                对于 ASP.NET Core 3.1,我必须确保动词没有歧义,我通过首先在 VS2019 中运行不带 IIS 的 API 项目发现了这一点(绿色箭头 > 左键单击胡萝卜图标并选择项目名称这会导致在启动时出现一个控制台窗口,以便您检查正在发生的事情并查看错误)。

                [HttpGet("MyEndPointA")

                那么 Swagger 就可以正确生成文档了。

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                    【解决方案11】:

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

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

                    【讨论】:

                      【解决方案12】:

                      我只是忘了在我的控制器中添加 HTTP 属性,只要我添加了 HTTP 属性,它对我来说就像一个魅力。

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

                      【讨论】:

                      【解决方案13】:

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

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

                      [Consumes("application/json")]
                      

                      【讨论】:

                        【解决方案14】:

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

                        改变这个:

                        /block-content/{machine_name}:
                        

                        到这里

                        /block-content/{machineName}:
                        

                        帮我解决了

                        【讨论】:

                          【解决方案15】:

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

                          【讨论】:

                            【解决方案16】:

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

                            【讨论】:

                            • 谢谢!!!我的问题是一个带有下一个错误的 ODataController:No media types found in 'Microsoft.AspNet.OData.Formatter.ODataInputFormatter.SupportedMediaTypes
                            • 我遇到了路径冲突问题。这非常清楚地表明了这一点。谢谢!
                            • 这有效,并帮助我找到了异常
                            【解决方案17】:

                            我遇到了同样的问题,基本控制器没有用 Http 进行装饰,并且删除它使其工作。

                            【讨论】:

                            • 还有一个更好的解决方案是用 ApiExplorerSettings (IgnoreApi = true) 装饰已经释放错误的类/控制器]
                            【解决方案18】:

                            我之前遇到过同样的错误,在努力寻找原因之后,我发现我的一个控制器中的一个 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);
                                    } 
                            

                            【讨论】:

                              【解决方案19】:

                              我能够通过打开网络选项卡并查看 swagger.json 的响应来找到错误

                              【讨论】:

                              • 你是个天才。只是浪费了一个下午找不到错误谢谢。
                              • 谢谢你,对我的调试帮助很大。
                              【解决方案20】:

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

                              这个问题可能由许多不同的原因引起:

                              1. Swagger 配置错误

                              2. 同名但在不同命名空间中的类

                              3. 不带rest属性的公共方法(Get、Post等)

                              首先,看看下面的链接,看看你的设置是否正常:

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

                              那么,

                              找出问题的一个好技巧是在不使用 IISExpress 的情况下运行应用程序并检查控制台日志。生成文档时发现的任何错误都会显示在此处。

                              就我而言,问题在于我有一个公共方法(应该是私有的),没有任何休息属性:

                              将方法从公共更改为私有后,我解决了问题。

                              【讨论】:

                              • 对我来说是第三名。 “没有休息属性的公共方法”你帮了我很多。谢谢!
                              • 我刚刚遇到的另一个原因是,属性 [HttpPost("NAME_HERE") 的名称与操作名称不同。
                              • 对我来说,它是“同名但在不同命名空间中的类”。我有一个 .Net Core Api 并在两个不同的命名空间中有一个“用户”类。重命名第二个更正了问题
                              • 对我来说,它是 3 号。谢谢。
                              【解决方案21】:

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

                              这 2 个小时用于反复试验注释掉控制器和端点,最终找到 3 个违反端点的端点。所有 3 个端点都有不同的路由、不同的(或没有)自定义授权和不同的方法名称。事实证明,所有 3 个端点要么接受一个参数,要么返回一个对象,其中包含我的类的 API 版本。没有使用通用版本。 Swagger 分不清他们,吐了个遍。

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

                              【讨论】:

                                【解决方案22】:

                                我遇到了两个导致相同错误的问题。

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

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

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

                                【讨论】:

                                  【解决方案23】:

                                  在我的例子中,Controller 类中有 2 个方法,它们具有相同的注释和 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...
                                      }
                                  

                                  删除一种方法为我解决了这个问题。

                                  【讨论】:

                                    【解决方案24】:

                                    我遇到了类似的问题,我使用违规控制器方法上的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 可能会掩盖一个真正的问题。

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 2020-06-06
                                      • 2021-06-03
                                      • 2019-12-23
                                      • 2020-10-29
                                      • 2021-09-03
                                      • 2015-07-03
                                      • 2019-01-11
                                      • 2019-03-30
                                      相关资源
                                      最近更新 更多