C# 继承的Global.asax和应用程序启动问题
我试图继承一个基本的global.asax类来创建我的自定义global.asax类。但是我的custome继承的全局类不能正常工作。它的应用程序不会被调用 有人知道乳清吗C# 继承的Global.asax和应用程序启动问题,c#,asp.net,global-asax,C#,Asp.net,Global Asax,我试图继承一个基本的global.asax类来创建我的自定义global.asax类。但是我的custome继承的全局类不能正常工作。它的应用程序不会被调用 有人知道乳清吗 public class BaseGlobal : HttpApplication { protected void Application_Start(Object sender, EventArgs e) { log4net.Config.XmlConfigurator.Configure
public class BaseGlobal : HttpApplication
{
protected void Application_Start(Object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure();
Logger.Warn("Portal Started"); //I can find it log file
}
......
}
public class MyGlobal : BaseGlobal
{
new protected void Application_Start(Object sender, EventArgs e)
{
base.Application_Start(sender,e);
Logger.Warn("Portal Started 2"); // Can not find it in log file
}
}
<%@ Application Codebehind="Global.asax.cs" Inherits="Membership_ABC.MyGlobal" Language="C#" %>
public类BaseGlobal:HttpApplication
{
受保护的无效应用程序\u启动(对象发送方,事件参数e)
{
log4net.Config.XmlConfigurator.Configure();
Logger.Warn(“门户已启动”);//我可以找到它的日志文件
}
......
}
公共类MyGlobal:BaseGlobal
{
新的受保护的无效应用程序\u启动(对象发送方,事件参数e)
{
基本应用程序启动(发送方,e);
Logger.Warn(“门户已启动2”);//在日志文件中找不到它
}
}
在日志文件中,我找不到“门户已启动2”,只找到了“门户已启动”
有什么想法吗?解决方案是在基类中声明虚函数,然后在子类中重写它 但是,由于无法编辑基类来声明应用程序\u Start方法为虚拟,因此无法工作:
接受的答案给出了一个与您的情况相匹配的示例。在应用程序启动时,运行时将获取由
Global.asax
文件指出的HttpApplication
子体,并创建其实例。运行时不知道或不关心类是如何从HttpApplication
派生的,它只关心它实际上是一个后代
之后,它开始对其调用方法,将其视为常规的HttpApplication
对象。由于new
修饰符有效地打断了继承链(它只是一个恰好共享旧方法名称的新方法),因此不会调用它,而是调用父类的方法。基本上您有这种情况(伪代码):
这是脆性基类问题的一个例子和结果,Eric Lippert对此进行了编译。?“newprotected”看起来很奇怪,我认为override关键字应该是welcomdeIt,因为看起来好像有人用
new
关键字来关闭编译器。嗯,这就是问题所在。亚历克斯-你说得对。完全正确。“new修饰符”隐藏子类中的父代码。usr不认为“新”是原因。使用“new”只是让VS.@ValidfroM静音,这正是我所说的!您使VS静音,从而引入了一个bug。在应用“新”之前,请仔细阅读“新”的功能!我知道你的解决方案可以工作,但我不能改变基类。关于“如果基本实现是隐藏的;运行时使用的HttpApplication实例必须是BaseGlobal类型而不是MyGlobal类型”,您能否给出一个链接或其他描述。我认为一旦BaseGlobal被隐藏,运行时将调用“new”应用程序\u StartNo,在这种情况下,它不会调用用new关键字覆盖的方法
HttpApplication httpApp = new MyGlobal();
httpApp.Application_Start(..)
// ^^^ calls BaseGlobal.Application_Start(..)
//because the is not an unbroken chain from HttpApplication to MyGlobal