6

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

一种方法是#ifdef DEBUG围绕RegisterRoutes()身体中的特定路线进行编译指示,但这根本不灵活。

web.config 中的设置也一样好,但我不确定如何连接。

Glimpse或 Phil Haack 的旧Route Debugger等已建立的“插件”项目如何

我宁愿做一些简单的事情而不是 YAGNI 的事情......

4

2 回答 2

10

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

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

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

您也可以使用filterContext.HttpContext.IsDebuggingEnabled而不是更丑的,#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)
    {
    }
}
于 2013-08-21T22:36:22.097 回答
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。不是吗?

于 2013-08-21T15:57:38.427 回答