webentwicklung-frage-antwort-db.com.de

So verwenden Sie Swagger als Begrüßungsseite von IAppBuilder in WebAPI

Ich versuche, Swagger mit Microsoft WebAPI 2 zu verwenden.

Im Moment habe ich den folgenden Aufruf in einer Methode.

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

Wenn ich Swagger verwenden möchte, muss ich diese URL " https: // localhost: 44300/swagger " verwenden, die sehr gut funktioniert.

Ich möchte, dass meine Homepage an die URL meines Swagger weiterleitet, vielleicht wie folgt, aber dieses Beispiel funktioniert nicht.

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

Irgendeine Idee ?

24
Philippe Matray

Ich habe diese Funktion wie gewünscht erstellt, indem ich eine Route in RouteConfig.cs hinzugefügt habe:

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

Sehen Sie diesen Code von swashbuckle, um zu sehen, was los ist: https://github.com/domaindrivendev/Swashbuckle/blob/master/Swashbuckle.Core/Application/RedirectHandler.cs

45
patrickbadley

In der Datei Startup.cs der Methode Configuration (IAppBuilder app) habe ich diese Codezeile verwendet, um zu veranlassen, dass sie beim Laden auf die Begrüßungsseite von swagger umgeleitet wird.

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

Die vollständige Methode, die ich verwende, ist wie folgt

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

Beachten Sie, dass dies in Visual Studio zu einer grünen Warnung führen wird. Ich bin sicher, dass es eine Möglichkeit gibt, dies asynchron mit einem waitit-Aufruf in der Funktion zu imitieren.

15
Brad LaPratt

Verwenden Sie für den Asp.Net-Kern Folgendes:

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

Ok, hier ist eine Möglichkeit, dies zu tun. Fügen Sie einen neuen MVC-Controller hinzu (nicht Web-API) z. B. HomeController, und fügen Sie in der Aktion Index den folgenden Code hinzu:

using System.Web.Mvc;

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


}

}

Stellen Sie außerdem sicher, dass Ihre Routenkonfiguration Folgendes enthält (Hinweis: Standardmäßig ist dies bereits der Fall).

        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

Ich hatte ein ähnliches Problem und habe es durch Anpassen der SwaggerUI-URL ... gelöst. Dies ist meine Konfigurationsmethode:

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

Auf diese Weise erhalten Sie unter localhost:44300 die Swagger-Benutzeroberfläche als Startseite.

2
Misiu

In ASP.NET Core können Sie einfach den RoutePrefix ändern, wenn Sie SwaggerUI als leere Zeichenfolge registrieren. 

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

Es ist keine Konfiguration für die Umleitung erforderlich, es sei denn, Sie möchten weiterhin /swagger oder etwas Ähnliches im Pfad.

1
Adrian

Sie könnten ein Routing in Ihrem Konfigurationsobjekt einrichten. Es ist schwer, die Details detailliert zu beschreiben, da Ihr Code-Snippet begrenzt ist. Hoffen Sie, dass Sie in die richtige Richtung weisen.

1
Frank Witte

Wenn Sie hierher gekommen sind, um nach der Antwort auf asp.net core 2 zu suchen, können Sie dasselbe erreichen, indem Sie RoutePrefix of swagger auf das Stammverzeichnis der Apps setzen

app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "My service");
                c.RoutePrefix = string.Empty;  // Set Swagger UI at apps root
            });

Wie leite ich root in Asp.Net Core 2.x auf swagger um?

1
Calvin V

Für ASP.NET Core wurde die folgende Pull-Anforderung erstellt: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/486

In der Zwischenzeit kann die folgende Problemumgehung verwendet werden:

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

Prost

0

Was Sie tun können, legen Sie einfach Home Controller & Index Action als Standard fest und ändern Sie Ihre Controller-Aktion wie folgt:

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

Kurze und schnelle Lösung für dieses Problem.

0
Abdul Mueed

Öffnen Sie in .Net Core einfach die Eigenschaften der Anwendung, rufen Sie die Registerkarte Debuggen auf und schreiben Sie Swagger in das Textfeld "Browser starten".

Browser starten

0
kristian aranda

Folgen Sie dem Beispiel von hier:

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

Ich konnte es nicht zum Laufen bringen, bis ich die app.UseMvc () nach dem Aufruf von app.UseSwaggerUI () platziert habe.

0
Ian