Comment utiliser Swagger comme page D'accueil de IAppBuilder dans WebAPI
j'essaie d'utiliser Swagger avec Microsoft WebAPI 2.
pour le moment, j'ai l'appel suivant dans une méthode.
appBuilder
.ConfigureOAuth()
.UseWebApi(configuration)
.UseWelcomePage();
Si je veux utiliser Swagger, je dois utiliser cette url "https://localhost:44300/swagger " lequel fonctionne très bien.
je veux que ma page d'accueil redirige vers l'url de mon arrogance, peut-être comme suit, mais cet exemple ne fonctionne pas.
appBuilder
...
.UseWelcomePage("/swagger");
une idée ?
9 réponses
j'ai obtenu ce fonctionnement comme je voulais en ajoutant une route dans RouteConfig.cs comme suit:
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 }
);
}
voir ce code de swashbuckle pour voir ce qui se passe: https://github.com/domaindrivendev/Swashbuckle/blob/master/Swashbuckle.Core/Application/RedirectHandler.cs
au Démarrage.fichier cs dans la méthode de Configuration (application IAppBuilder) j'ai utilisé cette ligne de code pour la rediriger vers la page d'accueil de swagger.
app.Run(async context => {
context.Response.Redirect("swagger/ui/index");
});
donc la méthode complète que j'utilise est la suivante
[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");
});
}
}
}
notez que cela va causer un avertissement vert dans visual studio. Je suis sûr qu'il y a un moyen d'imiter ceci comme asynchrone avec un appel d'attente dans la fonction.
Pour Asp.Net utilisation principale:
app.Run(context => {
context.Response.Redirect("swagger/ui");
return Task.CompletedTask;
});
Ok, voici une façon de le faire. Ajouter un nouveau contrôleur MVC (Not Web API) e.g HomeController et dans l'action Index ajoutez le code suivant:
using System.Web.Mvc;
namespace Kids.Math.Api.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return new RedirectResult("~/swagger/ui/index");
}
}
}
aussi, assurez-vous que votre config route a le suivant (Notez, par défaut il le fait déjà)
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 }
);
}
j'ai eu le même problème et je l'ai résolu en personnalisant l'url de SwaggerUI. Voici ma méthode de Configuration:
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 Cette façon, lorsque Vous accédez à localhost:44300
Vous obtiendrez Swagger UI comme page de démarrage.
vous pouvez configurer un routage dans votre objet de configuration. Difficile de donner tous les détails car votre code est limité. Espérons que cela vous mènera dans la bonne direction.
dans ASP.NET Core, vous pouvez simplement changer le RoutePrefix lors de L'enregistrement de SwaggerUI en chaîne vide.
app.UseSwaggerUI(c =>
{
c.RoutePrefix = "";
...
};
aucune configuration de redirection REQUISE, sauf si vous voulez toujours /swagger
ou quelque chose de semblable dans le chemin.
pour ASP.NET noyau la requête pull suivante a été créée: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/486
En attendant, la solution de contournement suivante peut être utilisée:
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;
}
Cheers
.Net de Base, il suffit d'ouvrir les Propriétés de l'application, accédez à l'onglet Débogage, et écrire Swagger dans le "Lancer le navigateur" zone de texte