Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.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时不会触发&x27;s Global.asax_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# 应用程序启动赢得';从供应商处继承Global.asax时不会触发&x27;s Global.asax

C# 应用程序启动赢得';从供应商处继承Global.asax时不会触发&x27;s Global.asax,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我正在尝试向没有源代码的第三方ASP.NET web应用程序的应用程序启动事件添加代码。我通过从供应商的全局类继承来实现这一点。下面是代码(注意“new”关键字和对事件基类版本的两个调用。这是因为基类方法不是抽象的、虚拟的或重写的,我没有更改它的源代码): 我在global.asax文件中引用我的代码,如下所示: <%@ Application Codebehind="Global.asax.cs" Inherits="MyNamespace.CustomGlobal" Language=

我正在尝试向没有源代码的第三方ASP.NET web应用程序的应用程序启动事件添加代码。我通过从供应商的全局类继承来实现这一点。下面是代码(注意“new”关键字和对事件基类版本的两个调用。这是因为基类方法不是抽象的、虚拟的或重写的,我没有更改它的源代码):

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

<%@ Application Codebehind="Global.asax.cs" Inherits="MyNamespace.CustomGlobal" Language="C#" %>
现在它抛出以下错误:

[NullReferenceException: Object reference not set to an instance of an object.]
全局应用程序启动(对象发送方,事件参数)+28

[TargetInvocationException:调用的目标已引发异常。] System.RuntimeMethodHandle.\u InvokeMethodFast(IRuntimeMethodInfo方法、对象目标、对象[]参数、SignatureStruct&sig、MethodAttributes方法属性、RuntimeType类型所有者)+0 System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo方法、对象目标、对象[]参数、签名sig、MethodAttributes、MethodAttributes、RuntimeType typeOwner)+72 System.Reflection.RuntimeMethodInfo.Invoke(对象obj、BindingFlags invokeAttr、绑定绑定器、对象[]参数、CultureInfo区域性、布尔skipVisibilityChecks)+251 System.Reflection.RuntimeMethodInfo.Invoke(对象obj、BindingFlags invokeAttr、绑定绑定器、对象[]参数、CultureInfo区域性)+28 System.Reflection.MethodBase.Invoke(对象obj,对象[]参数)+19 CustomGlobal.Application_Start(对象发送方,事件参数)+231

[HttpException(0x80004005):调用目标已引发异常。] System.Web.HttpApplicationFactory.confureStartCalledForIntegratedMode(HttpContext上下文,httpapplicationapp)+9239341 System.Web.HttpApplication.registereventsubscriptionswithis(IntPtr-appContext,HttpContext-context,MethodInfo[]handlers)+131 System.Web.HttpApplication.InitSpecial(HttpApplicationState,MethodInfo[]处理程序,IntPtr-appContext,HttpContext-context)+194 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr-appContext,HttpContext-context)+339 System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+253

[HttpException(0x80004005):调用目标已引发异常。] System.Web.HttpRuntime.FirstRequestInit(HttpContext上下文)+9157968 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext上下文)+97
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequestWR,HttpContext上下文)+256这是继承问题。当使用
new
关键字时,调用
CustomGlobal.Application\u Start()
将执行您的代码,但调用
((HttpApplication)CustomGlobal.Application\u 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
    }

还有一件事,我正在IIS中重新启动网站,在检查事件日志之前请求Asp.net页面,以查看是否执行了应用程序\u Start()。您如何确定应用程序\u Start没有运行,如果您只是在其中放置一个断点并开始调试,它将不会被命中,因为调试器会在应用程序启动后附加。我根据消息未写入上面的事件日志这一事实来确定它。此外,File.WriteAllText()调用不会写入该文件。但是,这两个函数调用都在Session_Start内部工作。我没有试过调试它。这种方法的问题是供应商的应用程序_Start()是“受保护的”而不是“公共的”。我无法在没有继承的情况下调用VendorGlobal中的方法。为什么您认为继承是我的代码的问题?您将注意到,我的代码中的Session_Start()方法是通过继承(base.SessionStart())工作的,并且它还使用“new”。为什么应用程序启动有什么不同?很难说,应用程序启动是由HttpApplication对象上的HttpApplicationFactory调用的(所以使用了VendorGlobal),但我无法跟踪会话启动调用。无论如何,你可以通过反射或子类调用受保护的方法。我现在明白你的意思了,谢谢!我已经实现了你的代码。我觉得我们很接近。不过,现在它抛出以下错误:NullReferenceException:对象引用未设置为对象的实例。]VendorGlobal.Application\u Start(对象发送方,EventArgs e)+28[TargetInvocationException:调用目标已引发异常。]System.RuntimeMethodHandle.\u InvokeMethodFast(IRuntimeMethodInfo…CustomGlobal.Application\u启动(Object sender,EventArgs e我当然不能发布全部内容。我刚刚在上面放置了作为编辑抛出的新代码和异常。谢谢!Jan,我现在意识到这几乎不足以解决上述错误。自从我上次发布以来,我已经在dotPeak中反编译了供应商源代码。我已经将其全局类添加到了一个tes中t project并调用了Application_Start with Reflection。它们在Application_Start中有一条语句:(this.Application[“failureCount”]=(object)0;)其中,this.Application为null。这必须是null引用异常的源。我现在的问题是,为什么在从MethodInfo.Invoke调用其dll时,this.Application为null,但在继承它时却可以工作?
[NullReferenceException: Object reference not set to an instance of an object.]
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
    }