swagger:无法加载API定义未定义/swagger/v1/swagger. json

waxmsbnn  于 2023-10-18  发布在  其他
关注(0)|答案(6)|浏览(317)

我试图在我的www.example.com核心API中配置swaggerasp.net,并得到以下错误。无法加载API定义未定义/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();
        }
    }


}
t9eec4r0

t9eec4r01#

如果你在破碎的Swashbuckle页面,打开开发工具.看看斯瓦格发回的500条回复,你会得到一些很好的见解。
我做了件蠢事...在HTTPGet中有一个路由以及一个ROUTE路由。

[HttpGet("id")]
    [ProducesResponseType(typeof(string), 200)]
    [ProducesResponseType(500)]
    [Route("{employeeID:int}")]

lmvvr0a8

lmvvr0a82#

Swagger也不能处理两个同名的类(至少不能开箱即用)。所以如果你有两个命名空间,两个类有相同的名字,它将无法初始化。

zf9nrax1

zf9nrax13#

您正在得到一个错误。因为你的名字加倍了。看看这个例子。Swagger – Failed To Load API Definition,更改[Route("GetCustomers")]名称并重试。

1wnzp6jl

1wnzp6jl4#

这通常表示Swashbuckle由于某种原因不支持的控制器/操作。
你的项目中应该没有swagger.json文件。Swashbuckle使用ASP.NETCore的ApiExplorerAPI动态地创建和提供。这里可能发生的情况是Swashbuckle无法生成Swagger.json,因此UI无法显示。
很难确切地知道是什么导致了故障,所以最好的调试方法可能只是删除一半的控制器(只是将文件移动到临时位置),然后检查问题是否仍然存在。然后你就会知道你的控制器的哪一半包含了麻烦的动作。你可以“二进制搜索”删除控制器(然后是动作),直到你弄清楚是哪个动作方法导致Swashbuckle无法生成Swagger.json。一旦你知道了这一点,这是你的代码中的问题还是应该在Swashbuckle repo中归档的问题就应该很明显了。
您可以按F12键打开Chrome浏览器的开发者工具来检查失败的原因,然后输入失败的请求路径并单击错误文件来预览详细的错误。
这也可能是一个问题,模糊的路线或类似的绊倒Swashbuckle了。一旦你把失败的原因缩小到更具体的东西,它可以被修复或归档,如果合适的话。

d7v8vwbk

d7v8vwbk5#

我知道这个问题已经解决了,但我今天遇到了同样的问题。
在我的例子中,问题是我有一个基本的控制器类,我创建了其他控制器继承。当我在基类上创建一个公共函数时,问题开始出现。把它调成保护状态就成功了

fykwrbwg

fykwrbwg6#

如果你想通过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" });
    );
}

它应该能正常工作。

相关问题