swagger : 无法加载 API 定义 undefined /swagger/v1/swagger.json
Posted
技术标签:
【中文标题】swagger : 无法加载 API 定义 undefined /swagger/v1/swagger.json【英文标题】:swagger : Failed to load API definition undefined /swagger/v1/swagger.json 【发布时间】:2019-12-23 23:34:00 【问题描述】:我尝试在我的 asp.net 核心 api 中配置 swagger 并收到以下错误。未能加载 API 定义 undefined /swagger/v1/swagger.json
我不确定为什么会收到此错误。我已经在启动文件中添加了必要的配置
我尝试了以下路径,但没有任何区别
/swagger/v1/swagger.json
../swagger/v1/swagger.json
v1/swagger.json
startup.cs
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration get;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSwaggerGen(c =>
);
services.AddDbContext<NorthwindContext>(item => item.UseSqlServer(Configuration.GetConnectionString("NorthwindDBConnection")));
services.AddCors(option => option.AddPolicy("MyPolicy", builder =>
builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod();
));
var mappingConfig = new MapperConfiguration(mc =>
mc.AddProfile(new MappingProfile());
);
IMapper mapper = mappingConfig.CreateMapper();
services.AddSingleton(mapper);
services.AddScoped<ICustomerRepository, CustomerRepository>();
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
app.UseCors("MyPolicy");
app.UseHttpsRedirection();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API name"); );
app.UseMvc();
客户控制器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Customer.Repository;
using CustomerService.Models;
using CustomerService.ViewModel;
using Microsoft.AspNetCore.Mvc;
namespace CustomerService.Controllers
[Route("api/[controller]")]
[ApiController]
public class CustomersController : Controller
ICustomerRepository _customersRepository;
public CustomersController(ICustomerRepository customersRepository)
_customersRepository = customersRepository;
[HttpGet]
[Route("GetCustomers")]
//[NoCache]
[ProducesResponseType(typeof(List<CustomerViewModel>), 200)]
[ProducesResponseType(typeof(ApiResponse), 400)]
public async Task<IActionResult> Customers()
try
var customers = await _customersRepository.GetAllCustomers();
if (customers == null)
return NotFound();
return Ok(customers);
catch
return BadRequest();
[HttpGet]
[Route("GetCustomer")]
//[NoCache]
[ProducesResponseType(typeof(List<CustomerViewModel>), 200)]
[ProducesResponseType(typeof(ApiResponse), 400)]
public async Task<IActionResult> Customers(string customerId)
if (customerId == null)
return BadRequest();
try
var customer = await _customersRepository.GetCustomer(customerId);
if (customer == null)
return NotFound();
return Ok(customer);
catch
return BadRequest();
[HttpPost]
[Route("AddCustomer")]
public async Task<IActionResult> AddCustomer([FromBody] CustomerViewModel model)
if (ModelState.IsValid)
try
var customerId = await _customersRepository.Add(model);
if (customerId != null)
return Ok(customerId);
else
return NotFound();
catch(Exception ex)
return BadRequest();
return BadRequest();
[HttpPost]
[Route("DeleteCustomer")]
public async Task<IActionResult> DeleteCustomer(string customerId)
int result = 0;
if (customerId == null)
return BadRequest();
try
var customer = await _customersRepository.Delete(customerId);
if (customer == null)
return NotFound();
return Ok(customer);
catch
return BadRequest();
[HttpPost]
[Route("UpdateCustomer")]
public async Task<IActionResult> UpdateCustomer([FromBody] CustomerViewModel model)
if (ModelState.IsValid)
try
await _customersRepository.Update(model);
return Ok();
catch(Exception ex)
if (ex.GetType().FullName == "Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException")
return NotFound();
return BadRequest();
return BadRequest();
【问题讨论】:
希望这将帮助其他遇到同样错误的人。我收到此错误是因为我的控制器中有多个 HttpGet 方法,但我没有正确地将控制器方法归因于不同的路由模板。将路由模板添加到我的方法的 HttpGet 属性解决了我的问题,例如 [HttpGet("my-distinct-route")]。 【参考方案1】:您遇到了一个错误。因为你把你的动作名称加倍了。看看这个例子。
Swagger – Failed To Load API Definition ,更改 [Route("GetCustomers")]
名称并重试。
【讨论】:
我将路由和操作名分别更改为 [Route("GetCustomerById")] 和 GetCustomerById 但同样的错误 我在那个网站上展示了你如何理解这个问题。您能否提供可以在浏览器控制台中找到的错误屏幕截图@Tom 对于它的价值,这个答案确实帮助了我。我的控制器中有两个 Get 具有相同的路由(两个都没有定义路由参数)。当我将路由参数添加到第二个 Get 时,Swagger 错误得到了解决。【参考方案2】:Swagger 也不能处理两个具有相同名称的类(至少,不是开箱即用的)。因此,如果您有两个名称空间,并且有两个具有相同名称的类,它将无法初始化。
【讨论】:
【参考方案3】:如果您在损坏的 Swashbuckle 页面上,请打开开发工具...查看 Swagger 发回的 500 响应,您将获得一些深刻的见解。
这就是我正在做的愚蠢的事情......在 HTTPGet 中有一个路由以及一个 ROUTE 路由。
[HttpGet("id")]
[ProducesResponseType(typeof(string), 200)]
[ProducesResponseType(500)]
[Route("employeeID:int")]
【讨论】:
【参考方案4】:我知道这已解决,但我今天遇到了同样的问题。
在我的例子中,问题是我创建了一个基控制器类来继承其他控制器。 当我在基类上创建公共函数时,问题开始发生。把它变成受保护的就行了
【讨论】:
【参考方案5】:这通常表示 Swashbuckle 出于某种原因不支持的控制器/操作。
预计您的项目中没有 swagger.json 文件。 Swashbuckle 使用 ASP.NET Core 的 ApiExplorer API 动态创建和提供服务。这里可能发生的是 Swashbuckle 无法生成 Swagger.json,因此 UI 无法显示。
很难确切地知道是什么导致了失败,因此最好的调试方法可能只是删除一半的控制器(只需将文件移动到临时位置)并检查问题是否仍然存在。然后你就会知道你的哪一半控制器包含了麻烦的动作。您可以“二进制搜索”删除控制器(然后是操作),直到找出导致 Swashbuckle 无法生成 Swagger.json 的操作方法。一旦你知道了,这应该是你代码中的一些问题还是应该在 Swashbuckle 存储库中提交的问题。
你可以按F12打开chrome浏览器的开发者工具查看失败原因,然后输入失败的请求路径,点击错误文件预览详细错误。
这也可能是路线不明确或类似 Swashbuckle 绊倒的问题。一旦您将失败的原因缩小到更具体的原因,就可以根据需要修复或归档。
【讨论】:
【参考方案6】:如果你想通过host:port/swagger/v1/swagger.json
访问swagger,那么你应该在里面添加options: SwaggerGenOptions
public void ConfigureServices(IServiceCollection services)
services.AddSwaggerGen(c =>
c.SwaggerDoc("swagger/v1", new OpenApiInfo Version = "1.0", Title = "API" );
);
它应该可以正常工作。
【讨论】:
以上是关于swagger : 无法加载 API 定义 undefined /swagger/v1/swagger.json的主要内容,如果未能解决你的问题,请参考以下文章
Blazor Swagger:无法加载 API 定义。获取错误:未定义 /swagger/v1/swagger.json
加载 API 定义失败,获取错误:未定义 /swagger/v1/swagger.json