【问题标题】:Force a 404 on Web API routes (and sub endpoints)在 Web API 路由(和子端点)上强制 404
【发布时间】:2014-07-14 17:24:27
【问题描述】:

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

有什么好的方法可以做到这一点吗?

谢谢!

【问题讨论】:

  • 类似的东西必须来自 Swagger/Swashbuckle。如果路由存在,它将被返回。服务器就是这样工作的。您需要从本质上禁用此插件的路由表中的挂钩,以便无法匹配任何内容,这意味着使用它们提供的某些方法,或者直接禁用整个机器。
  • @ChrisPratt 感谢您的评论。很有意思。您是否知道是否有一种方法可以定义具有更高优先级的 /swagger 路由,它本质上会做同样的事情?或者这只会导致其他问题?谢谢!
  • 是的,如果这在您的 RouteConfig 中,您可以在该路由之前添加一个路由。由于路由是自上而下处理的,它总是会先捕获。然后你可以从那里返回一个 404。
  • 谢谢@ChrisPratt。会试一试!

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


【解决方案1】:

您可以通过编写自己的自定义 HTTP 模块来做到这一点。

在您的 HTTP 模块中,您可以检查传入的 url 请求,如果 url 与您的路由匹配,则返回 404。

查看这些(只是为了了解如何编写自定义 http 模块)

【讨论】:

    【解决方案2】:

    我有一个类似的场景:

    1. 我想为 API 文档安装 Swashbuckle
    2. 我想在不删除 Nuget 包或重新部署 API 的情况下控制对 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 部分中有一个名为 AllowSwaggerAccessBool.Parse'able 值为 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());
        }
    }
    

    【讨论】:

    • 非常酷。像这样的东西正是我需要的。鉴于默认情况下启用 Swashbuckle,您是否需要代码来禁用它?在您的 if 声明中,您允许它,但它通常不是只是启用了吗?希望我说得通!
    • 你把我弄糊涂了,哈!
    • 哈抱歉!我的意思是:当你安装 Swashbuckle 时,它​​会在/swagger 自动启用。但是我在您的代码中没有看到任何明确禁用它的地方。我只看到会显式启用它的代码,但不是吗?
    • “Swashbuckle.Bootstrapper.Init(GlobalConfiguration.Configuration);”这行代码实际上添加了路由(除其他外)——if 块可以防止这种情况发生。
    • 有道理。我一定要试一试!
    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多