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

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

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

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

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

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

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

Есть идеи ?


person Philippe Matray    schedule 04.05.2015    source источник
comment
я хочу подобную вещь, у вас это наконец-то заработало, я использую его точно так, как вы его используете, но не работает ...   -  person user1829319    schedule 11.07.2015
comment
Измените файл launchSettings вместо того, чтобы пытаться взломать маршруты и местоположения по умолчанию. stackoverflow.com/a/30002051/706363   -  person Piotr Kula    schedule 28.11.2018


Ответы (12)


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

person patrickbadley    schedule 24.05.2016
comment
У меня отлично сработало при использовании ASP.Net WebRole. - person HaveSpacesuit; 20.03.2017
comment
Это работает только с настройками по умолчанию. Если вы хотите настроить свои маршруты для пользовательского интерфейса swagger, не копируйте/вставляйте. - person Sergey Shuvalov; 14.09.2017
comment
Для .NET Core 2.1 см. этот ответ ниже: stackoverflow.com/a/50127631/1128742 - person patrickbadley; 18.06.2018

В файле Startup.cs в методе Configuration (приложение IAppBuilder) я использовал эту строку кода, чтобы вызвать перенаправление при загрузке на страницу приветствия 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. Я уверен, что есть какой-то способ имитировать это как асинхронный с вызовом ожидания в функции.

person Brad LaPratt    schedule 29.03.2016
comment
Это самый нежирный вариант. Вам не нужно добавлять System.Web.Mvc в отличие от других ответов здесь. - person Rosdi Kasim; 16.06.2017

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

app.Run(context => {
            context.Response.Redirect("swagger/ui");
            return Task.CompletedTask;
        });
person Rui Eusebio    schedule 01.07.2017
comment
с последней версией я просто перенаправляюсь на swagger, а не на swagger/ui - хотя это работает. - person Ross Vernal; 26.10.2017
comment
Пока редирект работает, сервис не работает. Я получаю сообщение об ошибке «TypeError: Failed to fetch». Удалив это, верните мои приложения в рабочее состояние. Пожалуйста, проверьте свой ответ должным образом. - person Syaiful Nizam Yahya; 14.03.2018

Хорошо, вот один из способов сделать это. Добавьте новый контроллер 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 }
        );
    }
person user1829319    schedule 11.07.2015

Если вы пришли сюда в поисках ответа 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?

person Calvin V    schedule 12.06.2019

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

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

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

person Adrian Sanguineti    schedule 02.05.2018
comment
Это не работает с c.SwaggerEndpoint("/swagger/v1/swagger.json") или с c.SwaggerEndpoint("../swagger/v1/swagger.json") после развертывания... Он не может найти файл .json. Необходимо добавить базовый путь к строке конечной точки: stackoverflow.com/a/44937002/3216970 - person mc01; 13.07.2018
comment
Чтобы прояснить, что говорит @ mc01, этот ответ не будет работать, если вы размещаете веб-API в виртуальном каталоге. Если это не ваш вариант использования (т. е. вы выполняете развертывание на своем собственном веб-сайте в IIS или в собственной службе приложений в Azure), то этот ответ отлично работает. - person Adrian Sanguineti; 06.12.2018

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

person Misiu    schedule 07.04.2016

Что вы можете сделать, просто установите Home Controller & Index Action по умолчанию и измените действие контроллера, как показано ниже:

public class HomeController : Controller
{
    // GET: /<controller>/
    public IActionResult Index()
    {
        return new RedirectResult("~/swagger");
    }
}

Короткое и быстрое решение этой проблемы.

person Abdul Mueed Shahid    schedule 08.10.2018

В .Net Core просто откройте «Свойства приложения», перейдите на вкладку «Отладка» и напишите Swagger в текстовом поле «Запустить браузер»,

запустить браузер

person kristian aranda    schedule 26.06.2018
comment
Это работает только при локальной отладке. Цель состоит в том, чтобы использовать пользовательский интерфейс Swagger в качестве домашней страницы при развертывании. - person mc01; 13.07.2018

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

Ваше здоровье

person Guilherme Duarte    schedule 13.09.2017
comment
Как это использовать? Рабочая копировальная паста была бы полезна. - person Syaiful Nizam Yahya; 14.03.2018

По примеру отсюда:

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().

person Ian    schedule 18.05.2019

Asp Net Core> 2.2 в RestFUL API, просто установите URL-адрес по умолчанию в настройках проекта/свойств/отладки

ASP Net Core ›2.2 RestFUL API

person JimbobTheSailor    schedule 31.10.2019
comment
Это будет работать только при отладке. Это не будет работать при развертывании на сервере - person Kishan Vaishnav; 06.11.2019