【问题标题】:WebAPI Help Pages: disable for Production releaseWebAPI 帮助页面:禁用生产版本
【发布时间】:2014-06-11 16:51:40
【问题描述】:

我在 VS 2010 中使用较旧的 WCF 框架开发了许多内部 REST 接口。它生成帮助页面的能力对于 DEV 和 QA 平台来说很方便,但对于生产版本,很容易禁用生成web.config 文件中的这些帮助页面:

<standardEndpoint name="" helpEnabled="false" automaticFormatSelectionEnabled="true"/>

我现在转而使用 WebAPI 框架(目前是 VS 2012 上的版本 1),但关闭此功能似乎并不简单(即我找不到任何有关如何在 web.config 文件中执行此操作)。

当然,我可以继续在代码中手动执行此操作,但肯定有更简单的方法;类似于上面描述的 WCF 是如何做到的。我想使用 web.config 文件方法,因为我已经为其他设置准备好了 web.release.config 转换文件。

任何关于这方面最佳实践的想法都将不胜感激。

【问题讨论】:

    标签: c# rest asp.net-web-api asp.net-web-api-helppages


    【解决方案1】:

    打开 Global.asax.cs,修改你的代码如下 sn-p 代码:

    #if DEBUG
       AreaRegistration.RegisterAllAreas();
    #endif
    

    因为帮助页面在名为'HelpPage'的区域中,所以在发布或生产环境中我们可以通过上面的代码忽略它。

    【讨论】:

    • 这本身不是一个安全的解决方案。如果您在浏览器中输入 url,您会得到一个未处理的异常,其中包含 .NET Framework 和 ASP.NET 的堆栈跟踪和版本信息
    • @Chris 只有当您从服务器本身访问 Web API 站点时,这才是正确的。如果您远程点击它,它只会显示“处理您的请求时发生错误”
    【解决方案2】:

    Web API 没有针对基于 web.config 启用或禁用帮助页面的开箱即用支持。

    您可以考虑的一些选项:

    • 由于 HelpPage 是作为 MVC 区域安装的,因此在部署到 您可以排除这个HelpPage 文件夹。

    • 按照此处的建议创建一个返回 404 的操作过滤器:Conditionally disable ASP.NET MVC Controller

    注意:对于上述情况,如果您使用默认的 Web API 模板,那么您需要额外的步骤来显示/不显示导航栏中的 Help 链接。

    【讨论】:

    • 是的,看起来就是这样。在这种情况下,我使用的是默认模板,但我认为解决这个问题不会有太大的工作量。我当然可以在 web.config 文件中放置一个指示器以供我在代码中使用,或者添加一个 RELEASE 预处理器指令并使用良好的 #if #endif 来阻止代码...
    • 我刚刚删除了区域文件夹。无论如何,Swagger API 比默认的要好得多。
    【解决方案3】:

    你可以使用指令#if DEBUG 来隐藏你的代码

    【讨论】:

    • DEBUG 标志在大多数情况下没有用,因为暂存和/或测试环境在没有 DEBUG 的情况下运行。
    【解决方案4】:

    我禁用ApiController控制器的解决方案:

    • 使用 WebConfig AppSettings 配置标志而不是 (#if DEBUG)
    • 在调用方法之前ExecuteAsync 拦截调用并检查功能切换(功能标志);
    • 如果功能被禁用,返回HTTP 410 GONE
    • 如果很多控制器都通用,请将代码移至控制器的基类

    代码:

    public class TestController : ApiController
    {
        public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
        {
            var featureFlag = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["EnableTest"]);
    
            if (featureFlag == false)
            {
                return Task.FromResult(new HttpResponseMessage(HttpStatusCode.Gone));
            }
    
            return base.ExecuteAsync(controllerContext, cancellationToken);
        }
    

    【讨论】:

      【解决方案5】:

      结合 Farb 和 Soeholm 的答案,您获得的帮助页面将不会显示并且它会抛出 404 而不是 500。

      在 Global.asax.cs 中

      #if DEBUG // Make help page unavailable on release builds
          AreaRegistration.RegisterAllAreas(); 
      #endif
      

      然后在 WebApiConfig.Register 中

      #if !DEBUG 
          config.Routes.IgnoreRoute("help", "help"); // Make help page, which is now unavailable on release builds, throw a 404 instead of a 500.
      #endif
      

      只是我没有使用 DEBUG,我做了一个设置,并根据它的部署位置使用 xml 转换对其进行更改。

      【讨论】:

        【解决方案6】:

        如果有人偶然发现这个问题,这就是我设法做到的。

        我在基本 Web.config 文件中添加了以下应用设置:

        <add key="ExcludeHelpPage" value="false" />
        

        然后我在我的 LIVE 或 RELEASE 配置文件中转换了这个值,如下所示:

        <add key="ExcludeHelpPage" value="true" xdt:Transform="Replace" xdt:Locator="Match(key)"  />
        

        然后我将以下代码添加到我的 WebApiConfig.Register 方法的末尾:

        if (Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["ExcludeHelpPage"]))
        {
            config.Routes.IgnoreRoute("help", "help");
        }
        

        这将使 ExcludeHelpPage 设置为 true 的配置无法使用帮助页面。

        【讨论】:

        • 您的想法似乎非常棒,但对我不起作用。在我的注册上我有这个config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );然后我添加你的代码。但是在“HelpPageAreaRegistration.cs”上我有new { controller = "Help", action = "Index", apiId = UrlParameter.Optional }); 知道为什么没有忽略帮助吗?
        • 这对我不起作用,除非我将它与 Farb 的答案结合起来(注释掉 RegisterAllAreas)。
        猜你喜欢
        • 1970-01-01
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        • 1970-01-01
        • 1970-01-01
        • 2014-11-12
        相关资源
        最近更新 更多