Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" Swashbuckle/Swagger与ASP.NET Core:API定义加载失败

129

我开发了一个ASP.NET Core 2应用程序,并包含Swagger。一切都很顺利,直到我引入了一个没有明确定义HTTP动作的方法:

public class ErrorController : Controller
{
    [Route("/error")]
    public IActionResult Index()
    {
        return StatusCode(500, new Error("Internal error."));
    }
}

使用这种方法启动应用程序时,会显示以下消息:

未能加载 API 定义。

错误
提取错误 内部服务器错误 /swagger/v1/swagger.json

只要显式设置例如 [HttpGet],错误就会消失。 但问题是,我需要此方法适用于所有可能的 HTTP 操作。 当然,我可以明确指定所有操作,但我觉得 Swagger 应该能够正确处理这个问题。

为什么 Swagger 会出现这种行为?

是否有任何配置可供使用?


1
我需要这个方法对所有可能的HTTP操作进行触发。为什么你需要支持所有方法,而不仅仅是GET? - Set
你能分享一下你的Swashbuckle配置吗? - Helder Sepulveda
在这种情况下,@Set将Error端点用作异常处理程序。根据请求的HTTP操作,调用Error端点上的相应操作。 - Ash
1
@HelderSepu 配置非常简单:services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = "My Service", Version = "v1" }); }); app.UseSwagger(c => { c.PreSerializeFilters.Add((swagger, httpReq) => swagger.Host = httpReq.Host.Value); }); app.UseSwaggerUI(c => { c.RoutePrefix = "swagger"; // 在根目录下提供UI c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs"); }); - Ash
在我的情况下,这是因为我在两个API中使用了相同的路由,所以我纠正了它,为每个API使用了唯一的路由,然后它就正常工作了。 - undefined
显示剩余2条评论
36个回答

1
我也遇到了这个问题。我检查并应用了所有Swagger配置的解决方案,但问题仍然存在。 最后,我检查了输出面板,发现问题是由于[DefaultValue("SYSDATETIMEOFFSET()")]引起的。
答案在这里:检查输出面板,你会找到答案

1
我遇到了在问题中提到的错误,但在答案中没有找到像这样简单的原因:
端点应该有唯一的路由,即按名称、动词等区分。
当两个端点路由看起来相同时,Swagger会出现问题。
请检查最近添加的端点是否从路由的角度重复(名称、动词等)。
在我的例子中,我进行了试验并进行了如下复制粘贴:
一旦我使它们成为不同的路由,Swagger就可以工作了。
解决方法很简单,只需指定一个唯一的路由即可。

1
我遇到这个错误的原因是在同一个控制器中有两个方法使用了相同的API名称。
我给另一个方法添加了后缀 _v2,然后Swagger正常打开了。

enter image description here

enter image description here

enter image description here

干杯, Tanjot

这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - Siddharth Seth

0

对于Core 3,我遇到了同样的问题,并且非常困惑,因为问题出在斜杠上。

配置如下:

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

这个 Swagger 端点抛出了 TS 的消息:

app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/v1/swagger.json", "my-API v1");
            });

最后,我通过在URL中删除第一个斜杠解决了它:
app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("v1/swagger.json", "my-API v1");
            });

0
对我来说,这是一个非常简单的问题,我有3个[HttpGet]方法,结果发现我需要将“createOrder”方法更改为[HttpPost]。
        [HttpGet]
        public async Task<ActionResult<List<Order>>> GetOrders()
        {
            return await _context.Orders.Include(o => o.OrderItems).Where(x => x.BuyerId == User.Identity.Name).ToListAsync();
        }

        [HttpGet("{id}", Name = "GetOrder")]
        public async Task<ActionResult<Order>> GetOrder(int id)
        {
            return await _context.Orders.Include(x => x.OrderItems).Where(x => x.BuyerId == User.Identity.Name && x.Id == id).FirstOrDefaultAsync();
        }

        [HttpPost]
        public async Task<ActionResult<int>> CreateOrder(CreateOrderDto orderDto)
        {
            var basket = await _context.Baskets.RetrieveBasketWithItems(User.Identity.Name).FirstOrDefaultAsync();
            var items = new List<OrderItem>();
}

0
对我来说,问题是由于懒惰/沮丧的重构引起的,我能够通过在调试器模式下运行API时阅读调试控制台来确定问题。
由于糟糕的重构,我最终得到了两个具有相同名称的模型,而Swagger则感到困惑。
我有类似以下的东西:
PROJECT
├───Auth
│       AutheController.cs
│       UserDto.cs
│
└───Controllers
    │   MyContrller.cs
    │
    └───Models
            UserDto.cs

有两个UserDto模型是导致Swagger混淆的原因。清理这个问题可以解决。


0
如果您的模型(请求或响应)中有继承/实现了 System.ComponentModel(或其他类型)的属性,则会引发错误。
"The JSON property 'item' is defined multiple times on type"...

尝试使用Newtonsoft.Json[JsonIgnore]属性忽略此属性。
在我的情况下,我有一个类型为DataTable的getter。

0
在启动文件中,您需要确保添加以下内容。
services.AddSwaggerDocument();

在你添加之前

app.UseOpenApi();
app.UseSwaggerUi3();

否则可能会导致以下错误

获取错误 undefined /swagger/{documentName}/swagger.json


0

这是由于 Newtonsoft.Json 导致的,但问题在于我并没有使用它。可能是其中一个包依赖于它,但我没有时间进行核实。

因此,请检查输出面板以解决相关问题。


0

我在删除一个未使用的类时遇到了TypeLoadException。在我的情况下,解决方法是删除bin/obj/Debug文件夹中的内容。清理解决方案+重新构建解决方案对我没有起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接