Application_Start赢得';从供应商处继承Global.asax时不要激发';s Global

本文关键字:Global asax Start 赢得 Application 供应商 继承 | 更新日期: 2023-09-27 18:22:00

我正在尝试将代码添加到第三方ASP.NET web应用程序的application_start事件中,但我没有该应用程序的源代码。我是通过继承供应商的Global类来实现这一点的。以下是代码(注意"new"关键字和对事件基类版本的两个调用。这是因为基类方法不是抽象的、虚拟的或重写的,我没有更改这一点的源代码):

public class CustomGlobal : VendorNamespace.Global
{
    new protected void Application_Start(object sender, EventArgs e)
    {
        var logName = "SPPCustom";
        if (!System.Diagnostics.EventLog.SourceExists(logName))
        System.Diagnostics.EventLog.CreateEventSource(logName, "Application");
        var text = "Hello from Application Start!";
        System.Diagnostics.EventLog.WriteEntry(logName, "Application started!");
        File.WriteAllText(@"c:'ApplicationStart.txt", text);
        Debug.WriteLine(text);
        base.Application_Start(sender, e);
    }
    new protected void Session_Start(object sender, EventArgs e)
    {
        var logName = "SPPCustom";
        if (!System.Diagnostics.EventLog.SourceExists(logName))
            System.Diagnostics.EventLog.CreateEventSource(logName, "Application");
        System.Diagnostics.EventLog.WriteEntry(logName, "Session started!");
        base.Session_Start(sender, e);
    }
}

我在网站的global.asax文件中引用了我的代码,如下所示:

<%@ Application Codebehind="Global.asax.cs" Inherits="MyNamespace.CustomGlobal" Language="C#" %>

Application_Start代码不执行,但Session_Start代码执行。我可以从Session_Start,但Application_Start,nadda编写事件和文本文件。

有人知道这里发生了什么吗?

编辑:

以下是在执行Jan的建议后的代码:公共类CustomGlobal:HttpApplication{private只读全局(_Global);私有只读方法信息_appStartInfo;private只读MethodInfo _sessionStartInfo;

    public CustomGlobal()
    {
        _global = new Global();
        _appStartInfo = typeof(Global).GetMethod("Application_Start", BindingFlags.Instance | BindingFlags.NonPublic);
        _sessionStartInfo = typeof(Global).GetMethod("Session_Start", BindingFlags.Instance | BindingFlags.NonPublic);
    }
    protected void Application_Start(object sender, EventArgs e)
    {
        var logName = "SPPCustom";
        if (!System.Diagnostics.EventLog.SourceExists(logName))
            System.Diagnostics.EventLog.CreateEventSource(logName, "Application");
        var text = "Hello Patient Portal from Application Start!";
        System.Diagnostics.EventLog.WriteEntry(logName, "Application started!");
        File.WriteAllText(@"c:'PatientPortalApplicationStart.txt", text);
        Debug.WriteLine(text);
        //_sxaGlobal.ApplicationStart(sender, e);
        _appStartInfo.Invoke(_global, new[] {sender, e});
    }
}

现在它抛出以下错误:

[NullReferenceException: Object reference not set to an instance of an object.]

Global.Application_Start(对象发送器,EventArgs e)+28

[TargetInvocationException:调用的目标引发了异常。]System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo方法,Object目标,Object[]参数,SignatureStruct&sig,MethodAttributes方法属性,RuntimeType typeOwner)+0System.RuntimeMethodHandle.IInvokeMethodFast(IRuntimeMethodInfo方法,Object目标,Object[]参数,Signature sig,MethodAttributes方法属性,RuntimeType typeOwner)+72System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder Binder,Object[]参数,CultureInfo区域性,布尔skipVisibilityChecks)+251System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder Binder,Object[]参数,CultureInfo区域性)+28System.Reflection.MethodBase.Invoke(Object obj,Object[]parameters)+19CustomGlobal.Application_Start(对象发送器,EventArgs e)+231

[HttpException(0x80004005):调用的目标引发了异常。]System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext上下文,HttpApplication应用程序)+923941System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext、HttpContext上下文、MethodInfo[]处理程序)+131System.Web.HttpApplication.InitSpecial(HttpApplicationState状态,MethodInfo[]处理程序,IntPtr appContext,HttpContext上下文)+194System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext context)+339System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+253

[HttpException(0x80004005):调用的目标引发了异常。]System.Web.HttpRuntime.FirstRequestInit(HttpContext上下文)+9157968System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext上下文)+97System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext上下文)+256

Application_Start赢得';从供应商处继承Global.asax时不要激发';s Global

这是继承问题。当使用new关键字时,调用CustomGlobal.Application_Start()将执行您的代码,但调用((HttpApplication) CustomGlobal).Application_Start()将执行供应商的代码。

解决方案可以是具有私人成员的模式

public class CustomGlobal : HttpApplication
{
    private readonly VendorGlobal _global;
    private readonly MethodInfo _appStartInfo;
    public CustomGlobal()
    {
        _global = new VendorGlobal();
        _appStartInfo = typeof(VendorGlobal).GetMethod("Application_Start", BindingFlags.Instance | BindingFlags.NonPublic);
    }
    protected void Application_Start(object sender, EventArgs e)
    {
        _appStartInfo.Invoke(_global, new[] {sender, e});
        // your custom code
    }