asp.net – 为什么我的主机(softsyshosting.com)不支持BeginRequest和EndRequest事件处理程序?

前端之家收集整理的这篇文章主要介绍了asp.net – 为什么我的主机(softsyshosting.com)不支持BeginRequest和EndRequest事件处理程序?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我听说过Softsys Hosting的好东西,所以我决定把我的ASP.NET MVC解决方案移交给他们.但它不会运行在他们身上.我能够将问题精确到我的BeginRequest事件处理程序.如果我有他们,我会得到一个错误.这是我的代码
protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    this.BeginRequest += new EventHandler(MvcApplication_BeginRequest);
    this.EndRequest += new EventHandler(MvcApplication_EndRequest);
} 

void MvcApplication_EndRequest(object sender,EventArgs e) 
{
}

void MvcApplication_BeginRequest(object sender,EventArgs e) 
{
}

我可以通过创建默认的ASP.NET MVC应用程序并添加上述代码来重现问题.奇怪的是,这个代码在我的旧主机上工作正常,它只会在我的新(共享)主机上崩溃.如果我的代码中有这些事件处理程序,我得到这个错误

Server Error in ‘/’ Application.  
Object reference not set to an
instance of an object. Description:
An unhandled exception occurred during
the execution of the current web
request. Please review the stack trace
for more information about the error
and where it originated in the code.

Exception Details:
System.NullReferenceException: Object
reference not set to an instance of an
object.

Source Error: An unhandled exception
was generated during the execution of
the current web request. Information
regarding the origin and location of
the exception can be identified using
the exception stack trace below.

Stack Trace:

[NullReferenceException: Object
reference not set to an instance of an
object.]
System.Web.PipelineModuleStepContainer.GetStepArray(RequestNotification
notification,Boolean isPostEvent) +27
System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification
notification,Boolean isPostEvent) +11
System.Web.PipelineStepManager.ResumeSteps(Exception
error) +205
System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext
context,AsyncCallback cb) +91
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest
wr,HttpContext context) +514

我尝试使用Softsys进行故障排除,但是它们并不是很有帮助,基本上他们只是确认我已经在我的管理控制面板中打开了“ASP.NET管道(MVC)”功能.

有人可以

告诉我,如果我编码错了
给我一个解决办法
>向我解释为什么这个错误发生在一个主机而不是其他主机上.

解决方法

您需要在每个HttpApplication实例中注册您的处理程序.可能有几个HttpApplication的池化实例. Application_Start只能在任何请求之前调用一次(对于IIS 6和IIS 7,在经典模式下 – 在第一个请求中为IIS 7集成模式 – 在Web应用程序启动时).所以为了让所有的工作,你需要添加事件处理程序在HttpApplication的重写Init方法或其构造函数.如果您在构造函数添加它们,那么这些处理程序将首先被调用,甚至在注册模块的处理程序之前被调用.
所以你的代码应该是这样的:
public class MySmartApp: HttpApplication{
    public override void Init(){
        this.BeginRequest += new EventHandler(MvcApplication_BeginRequest);
        this.EndRequest += new EventHandler(MvcApplication_EndRequest);
    }
    protected void Application_Start(){
        RegisterRoutes(RouteTable.Routes);
    } 
}

或者这样:

public class MySmartApp: HttpApplication{
    public MySmartApp(){
        this.BeginRequest += new EventHandler(MvcApplication_BeginRequest);
        this.EndRequest += new EventHandler(MvcApplication_EndRequest);
    }
    protected void Application_Start(){
        RegisterRoutes(RouteTable.Routes);
    } 
}

猜你在找的asp.Net相关文章