2015-05-04 2 views
15

Я пытаюсь использовать Swagger с Microsoft WebAPI 2.Как пользоваться Swagger, как страница приветствия IAppBuilder в WebAPI

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

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

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

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

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

Есть идеи?

+0

я хочу подобную вещь, ты это, наконец, работать, я используя его точно, как вы его используете, но не работает ... – user1829319

ответ

32

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

+0

Работал отлично для меня при использовании ASP.Net WebRole. – HaveSpacesuit

+0

Это работает только с настройками по умолчанию. Если вы хотите настроить свои маршруты для разметки пользовательского интерфейса, не копируйте и не вставляйте. –

1

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

4

Хорошо, вот один из способов сделать это. Добавить новый контроллер MVC (не Web API) например 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 } 
     ); 
    } 
8

в файле Startup.cs в конфигурации (приложение метод IAppBuilder) Я использовал эту строку кода, чтобы вызвать его для перенаправления на нагрузку на развязность странице приветствия.

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. Я уверен, что есть какой-то способ имитировать это как асинхронный с ожидающим вызовом в функции.

+1

Это самый скудный вариант. Он не требует добавления 'System.Web.Mvc', в отличие от других ответов здесь. –

0

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

2

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

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

с последней версией, я просто перенаправляюсь на «swagger», а не «swagger/ui» - работает. –

0

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

Приветствий

Смежные вопросы