Microsoft WebAPI 2で Swagger を使用しようとしました。
とりあえず、メソッドで次の呼び出しを行いました。
appBuilder
.ConfigureOAuth()
.UseWebApi(configuration)
.UseWelcomePage();
Swaggerを使用する場合は、このURL " https:// localhost:44300/swagger "を使用する必要があります。
おそらく次のように、ホームページをswaggerのURLにリダイレクトしたいのですが、このサンプルは機能しません。
appBuilder
...
.UseWelcomePage("/swagger");
何か案が ?
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
Configuration(IAppBuilderアプリ)メソッドの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で緑色の警告が発生することに注意してください。これを、関数内の待機呼び出しで非同期として模倣する方法があると確信しています。
Asp.Netコアの場合、これを使用します。
app.Run(context => {
context.Response.Redirect("swagger/ui");
return Task.CompletedTask;
});
わかりました、ここにそれをする1つの方法があります。新しいMVCコントローラーを追加します(Not Web API) e.g. 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 }
);
}
ASP.NET Coreでは、SwaggerUIを空の文字列に登録するときに、単にRoutePrefixを変更するだけです。
app.UseSwaggerUI(c =>
{
c.RoutePrefix = "";
...
};
/swagger
またはパスに類似したもの。
同様の問題があり、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がスタートアップページとして表示されます。
.Net Coreで、アプリケーションの[プロパティ]を開き、[デバッグ]タブに移動して、[ブラウザーの起動]テキストボックスにSwaggerを書き込むだけで、
構成オブジェクトにルーティングを設定できます。コードスニペットが限られているため、完全な詳細を伝えるのは困難です。これがあなたを正しい方向に向けることを願っています。
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の場合、次のプルリクエストが作成されました。 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;
}
乾杯
できることは、Home Controller&Index Actionをデフォルトとして設定し、コントローラーアクションを以下のように変更するだけです。
public class HomeController : Controller
{
// GET: /<controller>/
public IActionResult Index()
{
return new RedirectResult("~/swagger");
}
}
この問題に対する短くて迅速な解決策。
ここから例に従ってください:
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()を配置するまで、動作させることができませんでした。