Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承的Global.asax和应用程序启动问题_C#_Asp.net_Global Asax - Fatal编程技术网

C# 继承的Global.asax和应用程序启动问题

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

我试图继承一个基本的global.asax类来创建我的自定义global.asax类。但是我的custome继承的全局类不能正常工作。它的应用程序不会被调用

有人知道乳清吗

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