我需要创建一些辅助控制器操作和相关视图,我希望能够(有条件地?)在生产中禁用。
#ifdef DEBUG
身体中的特定路线周围有RegisterRoutes()
个pragma,但这根本不灵活。
web.config中的设置也一样好,但我不知道如何解决这个问题。
已建立的“插件”项目如 Glimpse 或Phil Haack的旧版Route Debugger如何做到这一点?
我宁愿做一些比YAGNI更简单的事......
答案 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。不是吗?