首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从供应商的Global.asax继承Global.asax时,Application_Start不会触发

从供应商的Global.asax继承Global.asax时,Application_Start不会触发
EN

Stack Overflow用户
提问于 2014-09-16 23:43:48
回答 1查看 2.3K关注 0票数 4

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

代码语言:javascript
运行
复制
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文件中引用代码,如下所示:

代码语言:javascript
运行
复制
<%@ Application Codebehind="Global.asax.cs" Inherits="MyNamespace.CustomGlobal" Language="C#" %>

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

有人知道这是怎么回事吗?

编辑:

以下是实现Jan的建议后的代码:公共类CustomGlobal : HttpApplication {私有只读全局_global;私有只读MethodInfo _appStartInfo;私有只读MethodInfo _sessionStartInfo;

代码语言:javascript
运行
复制
    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});
    }
}

现在它抛出以下错误:

代码语言:javascript
运行
复制
[NullReferenceException: Object reference not set to an instance of an object.]

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

TargetInvocationException:调用的目标引发了异常。System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo方法,对象目标,区域性参数,SignatureStruct& sig,签名结构,签名typeOwner) +0 System.Reflection.RuntimeMethodInfo.Invoke(Object方法,对象目标,签名参数,签名签名,MethodAttributes methodAttributes,布尔值) +72 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,typeOwner Object[],MethodAttributes methodAttributes,RuntimeType typeOwner) +251 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,,绑定器绑定器,参数,RuntimeType ) +28 ( Object obj,对象对象,CultureInfo skipVisibilityChecks,Boolean skipVisibilityChecks)Object[]参数) +19 CustomGlobal.Application_Start(对象发送者,EventArgs e) +231

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-09-17 02:11:17

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

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

代码语言:javascript
运行
复制
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
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25873108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档