Wie

2015-05-04 7 views
15

Swagger als Begrüßungs-Seite von IAppBuilder in WebAPI verwenden Ich versuche Swagger mit Microsoft WebAPI Im Moment 2.Wie

zu verwenden, habe ich die folgenden Aufruf in einem Verfahren.

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

Wenn ich Swagger verwenden will, muss ich diese URL „https://localhost:44300/swagger“ benutzen, die man sehr gut funktioniert.

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

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

Irgendeine Idee?

+0

Ich möchte ähnliche Sache, hast du das endlich arbeiten, ich bin Verwenden Sie es genau so wie Sie es verwenden, aber nicht funktioniert ... – user1829319

Antwort

32

habe ich diese Arbeit, wie ich durch das Hinzufügen einer Route in RouteConfig.cs wie so wollte:

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

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

+0

Arbeitete gut für mich bei der Verwendung von ASP.Net WebRole. – HaveSpacesuit

+0

Dies funktioniert nur mit Standardeinstellungen. Wenn Sie Ihre Routen zur Swagger-Benutzeroberfläche anpassen möchten, kopieren Sie nicht. –

1

Sie könnten ein Routing in Ihrem Konfigurationsobjekt einrichten. Schwer zu sagen, wie detailliert das Code-Snippet ist. Hoffe das zeigt Ihnen in die richtige Richtung.

4

Ok, hier ist eine Möglichkeit, es zu tun. Fügen Sie einen neuen MVC-Controller (nicht Web API) zB Homecontroller und im Index Aktion fügen Sie den folgenden Code ein:

using System.Web.Mvc; 

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


} 

}

Also, stellen Sie sicher, dass Ihre Route Config hat die folgen (Beachten Sie, durch Standard es schon tut)

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

in der Startup.cs Datei in der Konfiguration (IAppBuilder app) Methode verwenden ich diese Codezeile, um zu bewirken auf Last auf die Prahlerei Begrüßungsseite umleiten.

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

So ist die vollständige Methode, die ich verwende ist als

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

Hinweis folgt, dass dies eine grüne Warnung in Visual Studio verursachen wird. Ich bin mir sicher, dass es eine Möglichkeit gibt, dies asynchron mit einem Warteaufruf in der Funktion zu imitieren.

+1

Dies ist die einfachste Option. Sie müssen 'System.Web.Mvc' nicht im Gegensatz zu den anderen Antworten hier hinzufügen. –

0

Ich hatte ähnliches Problem und ich löste es, indem ich SwaggerUI URL anpasste. Das 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"; 
} 

diese Weise, wenn Sie zu localhost:44300 gehen Sie werden als Start Seite Swagger UI erhalten.

2

Für Asp.Net Verwenden Sie dies:

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

mit der neuesten Version, ich Redirect nur auf "Swagger" und nicht "Swagger/Ui" - funktioniert ein Vergnügen, obwohl. –

0

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

In der Zwischenzeit die folgende Problemumgehung verwendet werden können:

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