【问题标题】:Grouping Swagger by Project in .Net Core在 .Net Core 中按项目对 Swagger 进行分组
【发布时间】:2020-08-28 11:29:48
【问题描述】:

我正在开发一个名为“主项目”的项目。我在那里至少有 10 个不同的小项目,这个项目可能会增长。我对所有这些项目只有一个招摇,因为所有这些项目都只使用一个 dotnet 核心 Web 应用程序来进行泛化。

例如,假设我有名为 SchoolJob 的项目和名为 HospitalJob 的项目。 SchoolJob 有三个不同的端点,分别命名为 GetStudentsTakeStudentsGetPaymentHostpitalJob 有两个端点分别命名为 GetDoctorsGetNurses。这两个不同的项目将出现在一个像这样招摇的 UI 中:

 - ../schooljob/getstudents
 - ../schooljob/takestudents 
 - ../schooljob/getpayment
 - ../hospitaljob/getdoctors
 - ../hospitaljob/getnurses

我想要做的是在一个 dotnet core web 项目中设置多个不同的 swagger 页面,或者将一个 swagger 分组,以便它们可以在不同的页面/或同一页面上看到,但不是在同一时间。

../mainproject/swagger1/index.html 或 mainproject/swagger/schooljob UI 应该是这样的:

 - ../schooljob/getstudents
 - ../schooljob/takestudents 
 - ../schooljob/getpayment

../mainproject/swagger2/index.html 或 mainproject/swagger/hospitaljob UI 应该是这样的

 - ../hospitaljob/getdoctors
 - ../hospitaljob/getnurses
// Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    c.SwaggerDoc("schooljob", new OpenApiInfo
    {
        Version = "schooljob",
        Title = "School Job"
    });
    c.SwaggerDoc("hospitaljob", new OpenApiInfo
    {
        Version = "hospitaljob",
        Title = "Hospital Job"
    });
    // c.AddSecurityDefinition... and other swagger configurations
}   
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
{
    app.UseSwagger(c =>
    {
        c.RouteTemplate = "mainproject/swagger/{documentname}/swagger.json";
    });
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/mainproject/swagger/schooljob/swagger.json", "School Job");
        c.SwaggerEndpoint("/mainproject/swagger/hospitaljob/swagger.json", "Hospital Job");
        c.RoutePrefix = "mainproject/swagger";
        /c second prefix how?
    });
}
// SchoolController.cs

[HttpPost("schooljob/getstudents")]
[ApiExplorerSettings(GroupName = "schooljob")]
public JsonResult GetStudents([FromBody]OnaySayfasiId onaySayfasi)
{ ... }
// HospitalController.cs

[HttpPost("hospitaljob/getdoctors")]
[ApiExplorerSettings(GroupName = "hospitaljob")]
public JsonResult GetDoctors([FromBody]OnaySayfasiId onaySayfasi)
{ ... }

顺便说一句,我尝试使用 Api 版本分组,但我又看到了所有这些端点。有什么方法可以做到吗?

【问题讨论】:

  • 我认为使用 API 版本控制应该可以完成这项工作,您具体尝试了什么?
  • 您是否还尝试在Startup.cs 中多次调用app.UseSwaggerUI(options => { options.RoutePrefix = "swaggerXX" ... })?每次调用都会创建不同的 Swagger 页面?
  • 我该怎么做?喜欢mainproject/swagger/schooljobmainproject/swagger/hospitaljob?尝试了多个SwaggerEndpoint,但没有成功。
  • UI 右上角只有“选择定义”列表,我可以选择版本。但这两个版本具有相同的端点。我只有两个端点有[ApiExplorerSettings(GroupName = "projectName")],其他端点没有这个。
  • 您能否为您的问题添加更多代码,Startup.cs 和您的一些控制器?对调试有很大帮助

标签: .net-core swagger swashbuckle


【解决方案1】:

我知道你遗漏了什么,你使用了错误的控制器属性,在这里你可以做什么:

  • 在控制器中,您必须使用[ApiVersion] 而不是[ApiExplorerSettings(GroupName = ...)] 属性。组是不同的,我猜它们是关于在 Swagger 页面的同一部分下对端点进行分组。
  • 当方法参数需要版本时,保持一致。 OpenApiInfoSwaggerEndpointApiVersion 需要相同的字符串,例如 schooljob 而不是 School Job

我想如果你更新你的代码如下:

// Startup.cs

app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/mainproject/swagger/schooljob/swagger.json", "schooljob");
        c.SwaggerEndpoint("/mainproject/swagger/hospitaljob/swagger.json", "hospitaljob");
        c.RoutePrefix = "mainproject/swagger";
        // No need for 2nd route prefix as there is only one Swagger page,
        // the content of the page gets updated when selecting a different version in the combobox.
    });

/* This line may be required in ConfigureServices method, give it a try */
/* services.AddApiVersioning(); */
// SchoolController.cs

[HttpPost("schooljob/getstudents")]
[ApiVersion("schooljob")]
public JsonResult GetStudents([FromBody]OnaySayfasiId onaySayfasi)
{ ... }

希望它能解决你的问题!

【讨论】:

  • 当我使用 ApiVersion 时,我得到了“获取错误内部服务器错误 /bilgemuygulamalari/swagger/toplantiodasi/swagger.json”。可能是什么问题?
  • 您可以按照post中的说明进行调试
  • 很遗憾,我无法调试输出、浏览器控制台或浏览器网络上的错误。例如/mainproject/swagger/hospitaljob/swagger.json 的响应返回空。
  • 我正在尝试调试 swagger,但在 Chrome、Visual Studio 或 Postman 或任何其他浏览器等上没有错误消息。我的 json 始终为空
  • 哦,我忘了一件事,问题是您的 API 不知道从哪里选择版本。为此,您必须在路线中使用{version:apiVersion}。例如,在您的方法之上尝试[HttpPost("{version:apiVersion}/getstudents")],或在您的控制器之上尝试[Route("{version:apiVersion}")]
猜你喜欢
  • 2013-03-12
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2011-04-04
  • 1970-01-01
相关资源
最近更新 更多