Как использовать Swagger в качестве приветственной страницы IAppBuilder в WebAPI
Я пытаюсь использовать Swagger с помощью Microsoft WebAPI 2.
На данный момент у меня есть следующий вызов в методе.
appBuilder
.ConfigureOAuth()
.UseWebApi(configuration)
.UseWelcomePage();
Если я хочу использовать Swagger, я должен использовать этот url https://localhost:44300/swagger, который работает очень хорошо.
Я хочу, чтобы моя домашняя страница перенаправляла URL-адрес моего чванства, возможно, следующим образом, но этот образец не работает.
appBuilder
...
.UseWelcomePage("/swagger");
Любая идея?
Ответы
Ответ 1
Я получил эту работу, как хотел, добавив маршрут в RouteConfig.cs, например:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "swagger_root",
routeTemplate: "",
defaults: null,
constraints: null,
handler: new RedirectHandler((message => message.RequestUri.ToString()), "swagger"));
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
Смотрите этот код из swashbuckle, чтобы узнать, что происходит: https://github.com/domaindrivendev/Swashbuckle/blob/master/Swashbuckle.Core/Application/RedirectHandler.cs
Ответ 2
В файле Startup.cs в приложении Configuration (IAppBuilder) я использовал эту строку кода, чтобы вызвать ее перенаправление при загрузке на страницу приветствия.
app.Run(async context => {
context.Response.Redirect("swagger/ui/index");
});
Итак, полный метод, который я использую, выглядит следующим образом
[assembly: OwinStartup(typeof(AtlasAuthorizationServer.Startup))]
namespace AtlasAuthorizationServer
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
app.Run(async context => {
context.Response.Redirect("swagger/ui/index");
});
}
}
}
Обратите внимание, что это вызовет зеленое предупреждение в визуальной студии. Я уверен, что есть какой-то способ имитировать это как асинхронный с ожидающим вызовом в функции.
Ответ 3
Для ядра Asp.Net используйте это:
app.Run(context => {
context.Response.Redirect("swagger/ui");
return Task.CompletedTask;
});
Ответ 4
Хорошо, вот один из способов сделать это. Добавьте новый контроллер MVC (не веб-API), например, HomeController и в действии Index добавьте следующий код:
using System.Web.Mvc;
namespace Kids.Math.Api.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return new RedirectResult("~/swagger/ui/index");
}
}
}
Кроме того, убедитесь, что в вашем конфигураторе маршрута указано следующее (Примечание, по умолчанию оно уже есть)
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
Ответ 5
У меня была аналогичная проблема, и я решил ее, настроив URL-адрес SwaggerUI.
Это мой метод настройки:
public void Configuration(IAppBuilder app)
{
var thisAssembly = typeof (Startup).Assembly;
HttpConfiguration httpConfig = new HttpConfiguration();
app.MapHttpAttributeRoutes();
app.UseCors(CorsOptions.AllowAll);
app.UseWebApi(httpConfig);
httpConfig
.EnableSwagger("api/{apiVersion}",c =>
{
c.IncludeXmlComments(string.Format(@"{0}\bin\Docs.xml", AppDomain.CurrentDomain.BaseDirectory));
c.SingleApiVersion("v1", "My API");
})
.EnableSwaggerUi("{*assetPath}",c =>
{
c.CustomAsset("index", thisAssembly, "AspNetIdentity.WebApi.DocsAssets.index.html");
});
httpConfig.Routes.First(x => x.RouteTemplate == "{*assetPath}").Defaults["assetPath"] = "index";
}
Таким образом, когда вы перейдете к localhost:44300
, вы получите пользовательский интерфейс Swagger в качестве начальной страницы.
Ответ 6
В ASP.NET Core вы можете просто просто изменить RoutePrefix при регистрации SwaggerUI в пустую строку.
app.UseSwaggerUI(c =>
{
c.RoutePrefix = "";
...
};
Не требуется перенаправлять конфигурацию, если вы все еще не хотите /swagger
или что-то подобное в пути.
Ответ 7
Вы можете настроить некоторую маршрутизацию в своем объекте конфигурации. Трудно сказать полную информацию, поскольку ваш фрагмент кода ограничен.
Надеюсь, это указывает на то, что вы в правильном направлении.
Ответ 8
В.Net Core просто откройте "Свойства приложения", перейдите на вкладку "Отладка" и напишите "Swagger" в текстовом поле "Launch browser",
запустить браузер
Ответ 9
Для ядра ASP.NET был создан следующий запрос на pull:
https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/486
Тем временем может использоваться следующее обходное решение:
public static IApplicationBuilder UseSwaggerUI(
this IApplicationBuilder app,
Action<SwaggerUIOptions> setupAction)
{
var options = new SwaggerUIOptions();
setupAction?.Invoke(options);
// This method reads an internal property value
// http://dotnetfollower.com/wordpress/2012/12/c-how-to-set-or-get-value-of-a-private-or-internal-property-through-the-reflection/
var indexSettings = options.GetPropertyValue<IndexSettings>("IndexSettings");
// Serve swagger-ui assets with the FileServer middleware, using a custom FileProvider
// to inject parameters into "index.html"
var fileServerOptions = new FileServerOptions
{
RequestPath = string.IsNullOrWhiteSpace(options.RoutePrefix) ? string.Empty : $"/{options.RoutePrefix}",
FileProvider = new SwaggerUIFileProvider(indexSettings.ToTemplateParameters()),
EnableDefaultFiles = true,
StaticFileOptions =
{
ContentTypeProvider = new FileExtensionContentTypeProvider()
}
};
app.UseFileServer(fileServerOptions);
return app;
}
Приветствия
Ответ 10
Что вы можете сделать, просто установите Home Controller & Index Action как свое значение по умолчанию и измените действие вашего контроллера, как показано ниже:
public class HomeController : Controller
{
// GET: /<controller>/
public IActionResult Index()
{
return new RedirectResult("~/swagger");
}
}
Краткое и быстрое решение этой проблемы.
Ответ 11
Следуя примеру отсюда:
https://docs.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-2.2&tabs=visual-studio
public class Startup {
public void Configure(IApplicationBuilder app) {
...
app.UseSwaggerUI( c => {
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
c.RoutePrefix = string.Empty;
});
app.UseMvc(); // <-- must be after
}
}
Я не мог заставить его работать, пока я не поместил app.UseMvc() после вызова app.UseSwaggerUI().
Ответ 12
Если вы пришли сюда в поисках ответа на asp.net core 2, вы можете получить то же самое, установив RoutePrefix swagger в корневой каталог приложений.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My service");
c.RoutePrefix = string.Empty; // Set Swagger UI at apps root
});
Как перенаправить root на swagger в Asp.Net Core 2.x?