ASP.NET MVC如何在生产中禁用调试路由/视图?

时间:2013-08-19 08:56:09

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我需要创建一些辅助控制器操作和相关视图,我希望能够(有条件地?)在生产中禁用。

#ifdef DEBUG身体中的特定路线周围有RegisterRoutes()个pragma,但这根本不灵活。

web.config中的设置也一样好,但我不知道如何解决这个问题。

已建立的“插件”项目如 Glimpse 或Phil Haack的旧版Route Debugger如何做到这一点?

我宁愿做一些比YAGNI更简单的事......

2 个答案:

答案 0 :(得分:9)

您也可以使用过滤器,例如将此类放在某处:

    public class DebugOnlyAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(
                                           ActionExecutingContext filterContext)
        {
             #if DEBUG
             #else
                 filterContext.Result = new HttpNotFoundResult();
             #endif
        }
    }

然后你就可以直接进入控制器并装饰你不需要在[DebugOnly]生产中显示的动作方法(或整个控制器)。

你也可以使用filterContext.HttpContext.IsDebuggingEnabled而不是uglier #if DEBUG我只是倾向于使用预编译器指令,因为决定肯定不会占用任何CPU这样循环。

如果您希望全局过滤器针对几个URL检查所有内容,请将其注册为Global.asax中的全局过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {

    filters.Add(new DebugActionFilter());
}

然后你可以检查URL或你想要的任何列表(这里显示的应用程序相对路径):

public class DebugActionFilter : IActionFilter
{
    private List<string> DebugUrls = new List<string> {"~/Home/",
                                                        "~/Debug/"}; 
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.IsDebuggingEnabled 
            && DebugUrls.Contains(
                      filterContext
                     .HttpContext
                     .Request
                     .AppRelativeCurrentExecutionFilePath))
        {
            filterContext.Result = new HttpNotFoundResult();
        }
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }
}

答案 1 :(得分:2)

@if (HttpContext.Current.IsDebuggingEnabled)
{
}

<强>类

public class UrlInformation
{
    [XmlElement(ElementName = "ActionName")]
    public string ActionName { get; set; }

    [XmlElement(ElementName = "ControllerName")]
    public string ControllerName { get; set; }

    [XmlElement(ElementName = "AreaName")]
    public string AreaName { get; set; }
}

XML序列化类

[XmlTypeAttribute(AnonymousType = true)]
public class clsUrlInformation
{
    [XmlElement("Files")]
    public List<UrlInformation> Url { get; set; }

    public clsUrlInformation()
    {
        Url = new List<UrlInformation>();
    }
}

示例XML(在此处定义调试操作方法/控制器/区域名称)

<?xml version="1.0" ?>
<Url>
    <Files>
    <AreaName></AreaName>
    <ControllerName>Home</ControllerName>
    <ActionName>Index</ActionName>
    </Files>
    <Files>
    <AreaName></AreaName>
    <ControllerName></ControllerName>
    <ActionName></ActionName>
    </Files>                      
</Url>

操作过滤器

public class MyActionClass : ActionFilterAttribute
{
    public override void OnActionExecuting(
                                       ActionExecutingContext filterContext)
    {

假设你有XML。 XML包含有关区域,操作方法名称和控制器名称的信息

var xml =
@"<?xml version=""1.0"" ?>
<Url>
    <Files>
    <AreaName></AreaName>
    <ControllerName>Home</ControllerName>
    <ActionName>Index</ActionName>
    </Files>
    <Files>
    <AreaName></AreaName>
    <ControllerName></ControllerName>
    <ActionName></ActionName>
    </Files>                      
</Url>";

执行XML序列化并将XML转换为类列表。

        var serializer = new XmlSerializer(typeof(clsUrlInformation),
                                 new XmlRootAttribute("Url"));
        using (var stringReader = new StringReader(xml))
        using (var reader = XmlReader.Create(stringReader))
        {
            clsUrlInformation result =
                     (clsUrlInformation)serializer.Deserialize(reader);
            RouteData Route = 
                  filterContext.Controller.ControllerContext.RouteData;
            String controller = Convert.ToString(Route.Values["controller"]);
            String action = Convert.ToString(Route.Values["action"]);
            String area = Convert.ToString(Route.DataTokens["area"]);

将当前操作与xml进行比较以显示404

            foreach (var item in result.Url)
            {
                if (HttpContext.Current.IsDebuggingEnabled    &&
                            controller == item.ControllerName &&
                                action == item.ActionName     &&
                                  area == item.AreaName)
                {
                    filterContext.Result = new HttpNotFoundResult();
                    return;
                }
            }
        }

        base.OnActionExecuting(filterContext);
    }
}

@CristiDiaconescu:提及XML文件中的调试URL将更加灵活。为什么?因为,稍后您可以在XML中进行修改以增加/减少/更新URL信息,而无需更改代码并且无需部署dll。不是吗?