我正在寻找一种简单的方法来对Web API中的给定路由的所有请求以及该路由中的所有端点返回404错误。在我的场景中,我将有一个配置标志来打开和关闭它。它是使用Swagger / Swashbuckle的文档端点,并希望能够将其打开和关闭作为各种功能切换。
<add key="EnableDocumentation" value="true|false" />
理想情况下,对于以/ swagger开头的所有路线(包括/swagger/ui/index.html),如果上述值为 false
,我想返回404我在HttpConfiguration.Routes中尝试过IgnoreRoute,但这对于比指定级别更深的路由不起作用。如果我忽略/ swagger,它仍然可以访问/swagger/ui/index.html
有关良好方法的任何建议吗?
谢谢!
答案 0 :(得分:1)
您可以通过编写自己的自定义HTTP模块来执行此操作。
在您的HTTP模块中,您可以检查传入的网址请求,如果网址与您的路线匹配,则返回404.
检查这些(仅了解如何编写自定义http模块)
答案 1 :(得分:1)
我有类似的情况:
这使我得到以下代码:
public class SwaggerConfig
{
private const string AllowSwaggerUsageAppSetting = "AllowSwaggerAccess";
public static void Register()
{
if (AllowSwaggerAccess)
{
Swashbuckle.Bootstrapper.Init(GlobalConfiguration.Configuration);
}
// NOTE: If you want to customize the generated swagger or UI, use SwaggerSpecConfig and/or SwaggerUiConfig here ...
}
private static bool AllowSwaggerAccess
{
get
{
bool _parsedValue;
return bool.TryParse(ConfigurationManager.AppSettings[AllowSwaggerUsageAppSetting] ?? "false", out _parsedValue) && _parsedValue;
}
}
}
除非web.config的appSettings部分中有一个键,其名称为 AllowSwaggerAccess ,且 Bool.Parse 的值为true ,Swashbuckle引导程序被忽略,意味着无法访问swagger文档,并且对API的请求返回404.
以上代码基于Swashbuckle Nuget Package的v4。
如果从github下载代码,您可以看到Init方法负责设置路由:
public static class Bootstrapper
{
public static void Init(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
"swagger_root",
"swagger",
null,
null,
new RedirectHandler("swagger/ui/index.html"));
config.Routes.MapHttpRoute(
"swagger_ui",
"swagger/ui/{*uiPath}",
null,
new { uiPath = @".+" },
new SwaggerUiHandler());
config.Routes.MapHttpRoute(
"swagger_versioned_api_docs",
"swagger/{apiVersion}/api-docs/{resourceName}",
new { resourceName = RouteParameter.Optional },
null,
new SwaggerSpecHandler());
config.Routes.MapHttpRoute(
"swagger_api_docs",
"swagger/api-docs/{resourceName}",
new { resourceName = RouteParameter.Optional },
null,
new SwaggerSpecHandler());
}
}