web-dev-qa-db-fra.com

Comment utiliser Swagger comme page d'accueil de IAppBuilder dans WebAPI

J'essaie d'utiliser Swagger avec Microsoft WebAPI 2.

Pour le moment, j'ai l'appel suivant dans une méthode.

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

Si je veux utiliser Swagger, je dois utiliser cette URL " https: // localhost: 44300/swagger " lequel fonctionne très bien.

Je veux que ma page d'accueil redirige vers l'URL de mon swagger, peut-être comme suit, mais cet exemple ne fonctionne pas.

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

Une idée ?

24
Philippe Matray

J'ai obtenu ce que je voulais en ajoutant un itinéraire dans RouteConfig.cs comme ceci:

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

Voir ce code de swashbuckle pour voir ce qui se passe: https://github.com/domaindrivendev/Swashbuckle/blob/master/Swashbuckle.Core/Application/RedirectHandler.cs

45
patrickbadley

Dans le fichier Startup.cs de la méthode Configuration (IAppBuilder app), j'ai utilisé cette ligne de code pour le rediriger au chargement sur la page d'accueil swagger.

app.Run(async context => { 
    context.Response.Redirect("swagger/ui/index"); 
}); 

Donc, la méthode complète que j'utilise est la suivante

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

Notez que cela va provoquer un avertissement vert dans Visual Studio. Je suis sûr qu'il existe un moyen d'imiter cela comme étant asynchrone avec un appel en attente dans la fonction.

15
Brad LaPratt

Pour le noyau Asp.Net, utilisez ceci:

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

Ok, voici une façon de le faire. Ajoutez un nouveau contrôleur MVC (pas Web API) e.g HomeController et dans l'action Index, ajoutez le code suivant:

using System.Web.Mvc;

namespace Kids.Math.Api.Controllers
{
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return new RedirectResult("~/swagger/ui/index");
    }


}

}

Aussi, assurez-vous que votre configuration de route a le suivi (Remarque, par défaut, elle le fait déjà)

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

J'avais un problème similaire et je l'ai résolu en personnalisant l'URL de SwaggerUI . C'est ma méthode de configuration:

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

Ainsi, lorsque vous accédez à localhost:44300, vous obtenez la page de démarrage de l'interface utilisateur Swagger.

2
Misiu

Dans ASP.NET Core, vous pouvez simplement changer le préfixe de route lors de l’inscription de SwaggerUI en chaîne vide. 

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

Aucune configuration de redirection requise, sauf si vous voulez toujours /swagger ou quelque chose de similaire dans le chemin.

1
Adrian

Vous pouvez configurer un routage dans votre objet de configuration. Difficile de donner tous les détails, car votre extrait de code est limité… .. Nous espérons que cela vous orientera dans la bonne direction.

1
Frank Witte

La demande d'extraction suivante a été créée pour ASP.NET Core: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/486

En attendant, la solution de contournement suivante peut être utilisée:

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

À votre santé

0
Guilherme Duarte

Pour ce que vous pouvez faire, définissez simplement le contrôleur domestique et l'action d'indexation comme votre valeur par défaut, puis modifiez l'action de votre contrôleur comme indiqué ci-dessous:

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

Solution courte et rapide à ce problème.

0
Abdul Mueed

Dans .Net Core, il suffit d’ouvrir les propriétés de l’application, d’ouvrir l’onglet Débogage et d’écrire Swagger dans la zone de texte "Lancer le navigateur"

navigateur de lancement

0
kristian aranda