在Web API路由(和子端点)上强制404

时间:2014-07-14 17:24:27

标签: c# asp.net .net asp.net-mvc asp.net-web-api

我正在寻找一种简单的方法来对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

有关良好方法的任何建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以通过编写自己的自定义HTTP模块来执行此操作。

在您的HTTP模块中,您可以检查传入的网址请求,如果网址与您的路线匹配,则返回404.

检查这些(仅了解如何编写自定义http模块)

答案 1 :(得分:1)

我有类似的情况:

  1. 我希望为API文档安装Swashbuckle
  2. 我希望在不删除Nuget Package或重新部署API
  3. 的情况下控制对Swagger的访问

    这使我得到以下代码:

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