如何在WebAPI中使用Swagger作为IAppBuilder的欢迎页面

时间:2015-05-04 11:14:52

标签: asp.net-web-api2 swagger katana

我尝试将Swagger与Microsoft WebAPI 2一起使用。

目前,我在方法中进行了以下调用。

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

如果我想使用Swagger,我必须使用这个网址“https://localhost:44300/swagger”哪个效果非常好。

我希望我的主页重定向到我招摇的网址,可能如下所示,但此示例不起作用。

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

有什么想法吗?

13 个答案:

答案 0 :(得分:48)

通过在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

答案 1 :(得分:16)

在Configuration(IAppBuilder app)方法的Startup.cs文件中,我使用这行代码使其在加载时重定向到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中引发绿色警告。我确信有一些方法可以模仿这与函数中的await调用异步。

答案 2 :(得分:9)

对于Asp.Net核心使用此:

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

答案 3 :(得分:4)

好的,这是一种方法。添加一个新的MVC控制器(非Web 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 }
        );
    }

答案 4 :(得分:2)

我有类似的问题,我通过自定义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作为启动页面。

答案 5 :(得分:2)

在ASP.NET Core中,只需在将SwaggerUI注册为空字符串时更改RoutePrefix即可。

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

不需要重定向配置,除非您仍然需要路径中的/swagger或类似内容。

答案 6 :(得分:1)

您可以在配置对象中设置一些路由。由于您的代码段有限,很难说清楚详细信息。 希望这能指出你正确的方向。

答案 7 :(得分:1)

在.Net Core中,只需打开应用程序的属性,转到“调试”选项卡,然后在“启动浏览器”文本框中编写Swagger,

launch browser

答案 8 :(得分:1)

如果您是来这里寻找asp.net核心2答案的,则可以通过将swagger的RoutePrefix设置为应用根来实现相同的目的

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

How to redirect root to swagger in Asp.Net Core 2.x?

答案 9 :(得分:1)

在RestFUL API中

Asp Net Core> 2.2,只需在“项目/属性/调试”设置中设置默认网址

ASP Net Core >2.2 RestFUL API

答案 10 :(得分:0)

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

干杯

答案 11 :(得分:0)

您可以做什么,只需将“主控制器和索引操作”设置为“默认”,然后按以下所示修改控制器操作:

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

解决此问题的快捷方法。

答案 12 :(得分:0)

下面是示例:

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.UseSwaggerUI()之后放置app.UseMvc()之前,我无法使其正常工作。