簡體   English   中英

如何讓Swagger + Swashbuckle顯示端點?

[英]How do I get Swagger+Swashbuckle to show endpoints?

我試圖將swagger + swashbuckle添加到我的ASP.NET Core項目中。 我可以啟動並運行Swagger UI,但是它完全是空的。 我嘗試四處尋找,並在https://github.com/domaindrivendev/Swashbuckle/issues/1058找到了類似的問題。 這使我認為可能是路由問題,因此我嘗試通過方法而非類使用[Route("testroute")]給控制器提供顯式路由。 這使端點添加了一條路由,沒有問題。

由於向每個端點添加顯式路由並非最佳選擇,我在做什么錯,以及如何解決該問題以大張旗鼓地顯示所有端點?

我的初創公司集成了搖搖欲墜

    public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
                        .SetBasePath(env.ContentRootPath)
                        .AddJsonFile("appsettings.json", optional: true , reloadOnChange: true);

        Configuration = builder.Build();
    }

    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().AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

        // Register the Swagger generator, defining one or more Swagger documents
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
        });

        services.AddDbContext<PromotionContext>(options => options.UseSqlServer(Configuration["ConnectionStrings:Jasmine"]));
        services.AddTransient<PromotionDbInitializer>();
        services.AddTransient<IComponentHelper, ComponentHelper>();
        services.AddTransient<IComponentFileHelper, ComponentFileHelper>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, PromotionDbInitializer promotionSeeder)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        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");
        });



        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Promotion}/{action=Index}/{id?}");
        });

       //Because there is not a seed method built into the EF migrations pipeline in EFCore this seeding method will interfere with the migrations when attempting to deploy the database
       //uncomment if you need to seed

       //promotionSeeder.Seed().Wait();
    }
}

我的控制器的GetAll和Post方法顯示在swroute ui頁面上的testroute和testFormRoute下,但是Get和Delete方法沒有顯示

public class PromotionController : Controller
{
    private PromotionContext context;
    public PromotionController(PromotionContext _context)
    {
        context = _context;
    }

    public IActionResult Index()
    {
        return View();
    }

    [HttpGet]
    [Route("testroute")]
    public IActionResult GetAll()
    {
        try
        {
            var result = context.Promotions
                            .Include(promotion => promotion.CombinabilityType)
                            .Include(promotion => promotion.ValueType)
                            .Include(promotion => promotion.Currency)
                            .Include(promotion => promotion.Components)
                                .ThenInclude(component => component.TargetType)
                            .ToList();
            return Ok(result);
        }
        catch(Exception ex)
        {
            return StatusCode(500);
        }
    }


    public IActionResult Get(string promoCode)
    {
        try
        {
            var result = context.Promotions
                                .Include(promotion => promotion.CombinabilityType)
                                .Include(promotion => promotion.ValueType)
                                .Include(promotion => promotion.Currency)
                                .Include(promotion => promotion.Components)
                                    .ThenInclude(component => component.TargetType)
                                .FirstOrDefault(x => x.PromoCode == promoCode);
            return Ok(result);
        }
        catch(Exception ex)
        {
            return StatusCode(500);
        }
    }

    [HttpPost]
    [Route("testFormRoute")]
    public IActionResult Post([FromForm] Promotion newPromotion)
    {
        try
        {
            context.Promotions.Add(newPromotion);
            context.SaveChanges();
        }
        catch(DbUpdateException ex)
        {
            return StatusCode(500);
        }

        return Ok();
    }

    [HttpDelete]
    public IActionResult Delete(string promoCode)
    {
        try
        {
            var promotion = context.Promotions.FirstOrDefault(x => x.PromoCode == promoCode);

            if(promotion != null)
            {
                context.Promotions.Remove(promotion);
                context.SaveChanges();
            }
        }
        catch(DbUpdateException ex)
        {
            return StatusCode(500);
        }

        return Ok();
    }
}

向您的控制器添加一個路由屬性:

[Route("[controller]/[action]")]
public class PromotionController : Controller
{
...

並在您的操作上設置HttpGet屬性:

[HttpGet]
public IActionResult GetAll()
{
...

[HttpGet("{promoCode}")]
public IActionResult Get(string promoCode)
{
...

您必須注意如何混合和匹配靜態和動態路由。 請查看本文以獲取有關asp.net核心中基於屬性的路由的更多詳細信息。

嘗試改變

public class PromotionController : Controller

public class PromotionController : ApiController

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM