Как использовать Swagger в качестве страницы приветствия IAppBuilder в WebAPI

Я пытаюсь использовать чванство С Microsoft WebAPI 2.

на данный момент у меня есть следующий вызов в методе.

appBuilder
   .ConfigureOAuth()
   .UseWebApi(configuration)
   .UseWelcomePage();

Если я хочу использовать Swagger, я должен использовать этот url"https://localhost:44300/swagger " который работает очень хорошо.

Я хочу, чтобы моя домашняя страница перенаправлялась на url-адрес моего swagger, возможно, следующим образом, но этот образец не работает.

    appBuilder
       ...
       .UseWelcomePage("/swagger");

есть идеи ?

9 ответов


Я получил эту работу, как я хотел, добавив маршрут в 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


в автозагрузке.cs-файл в методе конфигурации (iappbuilder app) я использовал эту строку кода, чтобы перенаправить ее при загрузке на страницу приветствия swagger.

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

обратите внимание, что это вызовет зеленое предупреждение в visual studio. Я уверен, что есть способ имитировать это как асинхронный с вызовом await в функции.


для Asp.Net core используйте это:

app.Run(context => {
            context.Response.Redirect("swagger/ui");
            return Task.CompletedTask;
        });

хорошо, вот один из способов сделать это. Добавить новый контроллер MVC (не Web API) e.g HomeController и в действие индекса добавьте следующий код:

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

у меня была аналогичная проблема, и я решил ее, настроив 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 UI в качестве начальной страницы.


вы можете настроить некоторую маршрутизацию в своем объекте конфигурации. Трудно сказать полную информацию, поскольку фрагмент кода ограничен. Надеюсь, это укажет вам верное направление.


In ASP.NET Core, вы можете просто изменить RoutePrefix при регистрации SwaggerUI на пустую строку.

app.UseSwaggerUI(c =>
{
    c.RoutePrefix = "";
    ...
};

не требуется конфигурация перенаправления, если вы все еще не хотите /swagger или что-то подобное в путь.


для ASP.NET Core был создан следующий запрос 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;
    }

Ура


в .Net Core просто откройте свойства приложения, перейдите на вкладку отладка и напишите Swagger в текстовом поле "запустить браузер",

запуск браузера