如何将Swagger用作WebAPI中IAppBuilder的欢迎页面

33

我尝试在Microsoft WebAPI 2中使用Swagger

目前,在一个方法中进行如下调用。

appBuilder
   .ConfigureOAuth()
   .UseWebApi(configuration)
   .UseWelcomePage();
如果我想使用Swagger,我必须使用此网址 "https://localhost:44300/swagger",这个非常有效。
我希望我的主页重定向到我的Swagger网址,可能如下所示,但是此示例不可用。
    appBuilder
       ...
       .UseWelcomePage("/swagger");

有什么想法吗?


我想要类似的东西,你最终搞定了吗?我使用的方式和你一样,但是不起作用... - user1829319
1
改变 launchSettings 文件,而不是试图绕过路由和默认位置。https://dev59.com/2F0a5IYBdhLWcg3wuKw7#30002051 - Piotr Kula
13个回答

61

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


在使用ASP.Net WebRole时,对我非常有效。 - HaveSpacesuit
这仅适用于默认设置。如果您想自定义路由到Swagger UI,请勿复制/粘贴。 - Sergey Shuvalov
1
对于.NET Core 2.1,请参见下面的答案:https://dev59.com/fF0a5IYBdhLWcg3wt6mK#50127631 - patrickbadley
这对我有效..在Swagger之前我需要显示登录页面,有任何想法吗? - SHEKHAR SHETE

20
Startup.cs文件中的Configuration(IAppBuilder app)方法中,我使用了以下代码行来使其在加载时重定向到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
这是最简洁的选项。与其他答案不同,它不需要您添加 System.Web.Mvc - Rosdi Kasim

13

对于Asp.Net Core,请使用以下内容:

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

2
使用最新版本,我只需重定向到“swagger”而不是“swagger/ui” - 虽然效果很好。 - Ross Vernal
重定向虽然起作用,但服务并没有正常工作。我遇到了“TypeError: Failed to fetch”的错误。请删除此内容,使我的应用程序恢复正常状态。请确保充分测试您的答案。 - Syaiful Nizam Yahya

8
在ASP.NET Core中,您只需要将SwaggerUI注册的RoutePrefix更改为空字符串即可。
app.UseSwaggerUI(c =>
{
    c.RoutePrefix = "";
    ...
};

不需要进行重定向配置,除非您仍然希望在路径中包含/swagger或类似的内容。

这个无法与c.SwaggerEndpoint("/swagger/v1/swagger.json")c.SwaggerEndpoint("../swagger/v1/swagger.json")一起工作,一旦部署就找不到.json文件。需要将基本路径添加到端点字符串中:https://dev59.com/JZ3ha4cB1Zd3GeqPOAgh#44937002 - mc01
3
为了澄清@mc01所说的,如果您正在虚拟目录中托管Web API,则此答案将无法起作用。 如果这不是您的情况(即您要部署到 IIS 中的自己的网站或 Azure 中的自己的应用程序服务),则此答案完全有效。 - Adrian Sanguineti
有没有办法在不设置重定向的情况下,保留默认路由的同时将“base”路由指向Swagger? - undefined

6

好的,这里有一种方法可以做到。添加一个新的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 }
        );
    }

.NET6解决方案:请参考https://dev59.com/cVUM5IYBdhLWcg3wINak#49298014 - wknauf

6

如果你来到这里是想找asp.net core 2的答案,那么你可以通过将swagger的RoutePrefix设置为应用程序根来实现相同的效果。

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

如何在Asp.Net Core 2.x中将根目录重定向到Swagger?


2
你可以这样做,将HomeController和Index Action设置为默认值,并将控制器操作修改为以下内容:
public class HomeController : Controller
{
    // GET: /<controller>/
    public IActionResult Index()
    {
        return new RedirectResult("~/swagger");
    }
}

这个问题的解决方案简单又快速。


2

我曾经遇到类似的问题,通过自定义SwaggerUI url解决了它。这是我的配置方法:

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启动页面。

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

干杯


如何使用这个?提供一个可工作的复制粘贴将会很有帮助。 - Syaiful Nizam Yahya

0

对于 .Net Core 3.1,需要在 launchSettings.json 文件中更改配置。

搜索 launchSettings.json 文件,将 "launchUrl" 属性的值更改为 "swagger"。请参考以下内容:

    "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "AfterPayAPI": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接