Я использую пошаговый метод из официальной документации для настройки пользовательского интерфейса Swagger и создания файла Swagger JSON в моем приложении API ядра ASP.NET.
Начните работу с Swashbuckle и ASP.NET Core
Если я посмотрю на свой сгенерированный файл swagger.json - в нем отсутствуют три важных свойства: host, basePath и schemes.
Пожалуйста, помогите мне понять, какой фрагмент кода я могу добавить, чтобы сгенерированный swagger.json имел следующие упомянутые свойства / значения.
Вот идеальный swagger.json - обратите внимание на значения host, basePath и schemes, которые отсутствуют, если я следую коду документации в своем приложении.
{
"swagger": "2.0",
"info": {
"version": "v1",
"title": "Demo API Title"
},
"host": "some-url-that-is-hosted-on-azure.azurewebsites.net",
"basePath": "/api",
"schemes": ["https"],
"paths": {
"/Account/Test": {
"post": {
"tags": [
"Admin"
],
"summary": "Account test method - POST",
"operationId": "AccountTest",
"consumes": [],
"produces": [
"text/plain",
"application/json",
"text/json"
],
"parameters": [],
"responses": {
"200": {
"description": "Success",
"schema": {
"type": "boolean"
}
}
}
}
}
},
"definitions": {
"NumberSearchResult": {
"type": "object",
"properties": {
"number": {
"type": "string"
},
"location": {
"type": "string"
}
}
}
},
"securityDefinitions": {
"Bearer": {
"name": "Authorization",
"in": "header",
"type": "apiKey",
"description": "Authorization. Example: \"Authorization: Bearer {token}\""
}
},
"security": [
{
"Bearer": []
}
]
}





Вы можете реализовать и зарегистрировать свой собственный IDocumentFilter и установить там желаемые значения.
public class MyDocumentFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
swaggerDoc.Host = "some-url-that-is-hosted-on-azure.azurewebsites.net";
swaggerDoc.BasePath = "/api";
swaggerDoc.Schemes = new List<string> { "https" };
}
}
А затем зарегистрируйте его через
services.AddSwaggerGen(options =>
{
options.DocumentFilter<MyDocumentFilter>();
});
В последней версии Swashbuckle для .netcore внесены некоторые изменения.
Если вы хотите изменить URL-адрес запроса в Swashbuckle, возможно, вы находитесь за шлюзом API или у вашего веб-приложения есть собственный домен. Сделай это.
public class BasePathDocumentFilter : IDocumentFilter { public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { swaggerDoc.Servers = new List<OpenApiServer>() { new OpenApiServer() { Url = "hxxt://yoursite" } }; } }
services.AddSwaggerGen() добавьте фильтр документов наподобие этого c.DocumentFilter<BasePathDocumentFilter>();.Спасибо! Это мне очень помогло!
Что бы мы сделали, если бы я хотел опустить хост и схему? И просто измените базовый путь
Изменить (09SEP20) Вот несколько фрагментов кода, которые применяются к версии 4.x.x библиотеки asp.netcore Swashbuckle.
В будущем я мог бы сделать еще один пост на случай, если приведенное ниже будет более простым с новыми версиями (на момент написания это версия 5.x.x)
образец appsettings.Development.json
{
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft.Hosting.*": "Information"
}
},
"Swagger": {
"ApiVersion": "localhost",
"ApiName": "v1",
"SwaggerRelativeUrl": "/swagger/v1/swagger.json",
"Title": "SalesforceLocationApi"
}
}
пример кода C#
namespace My.Api.Settings
{
public class SwaggerSettings
{
public string? ApiName { get; set; }
public string? ApiVersion { get; set; }
public string? SwaggerRelativeUrl { get; set; }
public string? Title { get; set; }
}
}
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.SwaggerUI;
using System;
using System.Reflection;
namespace My.Api
{
public class Startup
{
private readonly IConfiguration _configuration;
public Startup(IConfiguration configuration)
{
_configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(ConfigureControllers);
services
.AddSingleton<IHttpContextAccessor, HttpContextAccessor>()
.AddSwaggerGen(SetupUpSwaggerGen);
}
public void Configure(IApplicationBuilder application, IWebHostEnvironment environment, ILoggerFactory loggerFactory, IMapper mapper)
{
if (environment.IsDevelopment())
{
application.UseDeveloperExceptionPage();
}
else
{
application.UseExceptionHandler();
}
application
.UseHttpsRedirection()
.UseSwagger()
.UseSwaggerUI(SetUpSwaggerUi)
.UseRouting()
.UseAuthorization()
.UseEndpoints(endpoints => endpoints.MapControllers());
}
#region Helpers
private void SetupUpSwaggerGen(SwaggerGenOptions options)
{
var swaggerSettings = _configuration.GetSection("Swagger").Get<SwaggerSettings>();
SwaggerConfig.SetUpSwaggerGen(options, swaggerSettings);
}
private void SetUpSwaggerUi(SwaggerUIOptions options)
{
var swaggerSettings = _configuration.GetSection("Swagger").Get<SwaggerSettings>();
SwaggerConfig.SetUpSwaggerUi(options, swaggerSettings.SwaggerRelativeUrl, swaggerSettings.ApiName);
}
#endregion
}
}
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.SwaggerUI;
using System;
using System.IO;
using System.Linq;
using System.Reflection;
namespace My.Api
{
public class SwaggerConfig
{
internal class SwaggerDocumentFilter : IDocumentFilter
{
private readonly string _swaggerDocHost;
public SwaggerDocumentFilter(IHttpContextAccessor httpContextAccessor)
{
var host = httpContextAccessor.HttpContext.Request.Host.Value;
var scheme = httpContextAccessor.HttpContext.Request.Scheme;
_swaggerDocHost = $"{scheme}://{host}";
}
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
swaggerDoc.Servers.Add(new OpenApiServer { Url = _swaggerDocHost });
}
}
internal static void SetUpSwaggerGen(SwaggerGenOptions options, SwaggerSettings swaggerSettings)
{
options.DocumentFilter<SwaggerDocumentFilter>();
options.SwaggerDoc(swaggerSettings.ApiName, new OpenApiInfo { Title = swaggerSettings.Title, Version = swaggerSettings.ApiVersion });
options.CustomSchemaIds(type => $"{type?.Namespace?.Split('.').Last()}.{type?.Name}"); //E.g. Acme.Dtos.Gas.Meter.cs --> Gas.Meter
AddXmlComments(options);
}
internal static void SetUpSwaggerUi(SwaggerUIOptions options, string? swaggerRelativeUrl, string? apiName)
{
options.SwaggerEndpoint(swaggerRelativeUrl, apiName);
}
private static void AddXmlComments(SwaggerGenOptions options)
{
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
}
}
}
Я использую Swashbuckle.AspNetCore Nuget версии 4.0.1
Мне нужно было динамически добавлять хост в зависимости от того, где размещено приложение.
Это было мое исправление
Это решение, которое подействовало на меня как шарм ... Спасибо, что разместили этот ответ. Я тоже использую версию 4.0.1.
Было бы здорово, если бы вы поделились и кодом, а не только скриншотом.
Swagger / open api 3.0 и выше требует объект сервера. Видеть: https://swagger.io/specification/#server-object
Чтобы установить это в своем стартапе вот так
app.UseSwagger(c =>
{
c.PreSerializeFilters.Add((swagger, httpReq) =>
{
swagger.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"{httpReq.Scheme}://{httpReq.Host.Value}" } };
});
});
Итак, в .net core 3 и Open Api - Nswag.AspNetCore версии 13.3.2 nuget.
app.UseOpenApi( configure => {
configure.PostProcess = (doc, httpReq) =>
{
doc.Servers.Clear(); //... remove local host, added via asp .net core
doc.Servers.Add(new OpenApiServer { Url = "[YOUR SERVER URL]" }); //... add server
};
});
вытащил из этого ответа github: https://github.com/RicoSuter/NSwag/issues/2441#issuecomment-583721522
упоминание: это для OpenAPI до V2.x