asp.net-web-api2 - studio - swashbuckle
Cómo usar Swagger como página de bienvenida de IAppBuilder en WebAPI (10)
Conseguí que funcionara como quería agregando una ruta en RouteConfig.cs así:
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 }
);
}
Vea este código de swashbuckle para ver qué está pasando: https://github.com/domaindrivendev/Swashbuckle/blob/master/Swashbuckle.Core/Application/RedirectHandler.cs
Intento usar Swagger con Microsoft WebAPI 2.
Por el momento, tengo la siguiente llamada en un método.
appBuilder
.ConfigureOAuth()
.UseWebApi(configuration)
.UseWelcomePage();
Si quiero usar Swagger, debo usar esta URL " https://localhost:44300/swagger ", que funciona muy bien.
Quiero que mi página de inicio redirija a la url de mi swagger, quizás de la siguiente manera, pero esta muestra no funciona.
appBuilder
...
.UseWelcomePage("/swagger");
Alguna idea ?
En .Net Core, simplemente abra las Propiedades de la aplicación, vaya a la pestaña Depurar y escriba Swagger en el cuadro de texto "Iniciar navegador",
En ASP.NET Core, simplemente puede cambiar el RoutePrefix al registrar SwaggerUI en una cadena vacía.
app.UseSwaggerUI(c =>
{
c.RoutePrefix = "";
...
};
No se requiere configuración de redireccionamiento, a menos que aún desee /swagger
o algo similar en la ruta.
En el archivo Startup.cs en el método de Configuración (aplicación IAppBuilder) usé esta línea de código para hacer que redirigiera la carga a la página de bienvenida de Swagger.
app.Run(async context => {
context.Response.Redirect("swagger/ui/index");
});
Así que el método completo que estoy usando es el siguiente
[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");
});
}
}
}
Tenga en cuenta que esto va a causar una advertencia verde en el estudio visual. Estoy seguro de que hay una manera de imitar esto como asíncrono con una llamada en espera en la función.
Lo que puede hacer, simplemente configure Home Controller & Index Action como su Predeterminado, y modifique la acción de su controlador de la siguiente manera:
public class HomeController : Controller
{
// GET: /<controller>/
public IActionResult Index()
{
return new RedirectResult("~/swagger");
}
}
Solución corta y rápida a este problema.
Ok, aquí hay una forma de hacerlo. Agregue un nuevo controlador MVC (no API web), por ejemplo, HomeController y en la acción de índice agregue el siguiente código:
using System.Web.Mvc;
namespace Kids.Math.Api.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return new RedirectResult("~/swagger/ui/index");
}
}
}
Además, asegúrese de que su configuración de ruta tenga el seguimiento (Nota, de manera predeterminada ya lo tiene)
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 }
);
}
Para ASP.NET Core se creó la siguiente solicitud de extracción: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/486
Mientras tanto, se puede utilizar la siguiente solución:
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;
}
Aclamaciones
Para el núcleo Asp.Net use esto:
app.Run(context => {
context.Response.Redirect("swagger/ui");
return Task.CompletedTask;
});
Podría configurar algún enrutamiento en su objeto de configuración. Es difícil decir el detalle completo ya que su fragmento de código es limitado. Espero que esto te apunte en la dirección correcta.
Tuve un problema similar y lo resolví personalizando SwaggerUI url. Este es mi método de configuración:
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";
}
De esta manera, cuando vaya a localhost:44300
obtendrá una interfaz de usuario Swagger como página de inicio.