有没有办法为在调试模式下运行的网页设置一些默认设置?
例如,我想在调试模式下设置默认会话用户ID,但在Application_Start()中尝试此操作会导致错误:
protected void Application_Start()
{
#if DEBUG
Session["User"] = "1"
#endif
}
我可以选择将它放在控制器中,但这需要大量的代码重复。
答案 0 :(得分:3)
您可以使用Conditional
属性并将其放在基本控制器中的方法上。像这样:
public class BaseController : Controller {
public BaseController() {
SetupDebugData();
}
[Conditional("DEBUG")]
public void SetupDebugData() {
Session["User"] = "1";
}
}
对SetupDebugData
的调用将针对发布版本进行优化。然后,您只需从其他控制器中的此控制器继承:
public class AdminController : BaseController {
// ...
}
答案 1 :(得分:3)
抛出错误的原因是因为Session对象与请求相关联。 Application_Start
活动中没有请求。您可以将此逻辑移动到Application_AcquireRequestState
事件处理程序,它可以正常工作。
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
if (HttpContext.Current.IsDebuggingEnabled)
{
HttpContext.Current.Session["user"] = "1";
}
else
{
HttpContext.Current.Session["user"] = "0";
}
}
修改强>
经过进一步的研究,我错了。在.NET管道中,上面的事件处理程序是您可以访问会话对象的第一个位置。尚未从Application_BeginRequest
中的服务器检索它,这就是为什么您仍然获得NullReferenceException
的原因。我在MVC 5中测试了上面的代码并且没有问题。
此外,您不必依赖编译器常量,而是可以使用HttpContext.Current.IsDebuggingEnabled
的上述语法轻松判断您是否处于调试模式。这基本上是一个包装器,用于检查compilation
标记上的web.config属性并查看是否debug="true"
注意 - 您必须使用HttpContext.Current.Session的完全限定名称(如上所述),因为全局事件处理程序没有当前HttpContext的直接继承。
答案 2 :(得分:2)
是的,偏离正轨。
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
#if(DEBUG)
Console.WriteLine("This is debug mode");
#else
Console.WriteLine("This is release mode");
#endif
base.OnActionExecuting(filterContext);
}
此代码将在MVC中工作(我从MVC3开始使用它)。请记住,在服务器上部署asp.net应用程序时,需要在web.config中设置发布版本和调试错误。