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

时间:2009-07-14 06:23:31

标签: asp.net asp.net-mvc

我听说过有关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应用程序并添加上面的代码来重现该问题。奇怪的是这个代码在我的旧主机上运行良好,它只在我的新(共享)主机上崩溃。如果我的代码中有这些事件处理程序,我会收到此错误:

  '/'应用程序中的服务器错误。   对象引用未设置为   对象的实例。描述:   在此期间发生了未处理的异常   当前网络的执行   请求。请查看堆栈跟踪   有关错误的更多信息   它起源于代码。

     

异常详细信息:   System.NullReferenceException:Object   引用未设置为的实例   对象

     

源错误:未处理的异常   是在执行期间生成的   当前的网络请求。信息   关于的起源和位置   可以使用标识来识别异常   下面的异常堆栈跟踪。

     

堆栈追踪:

     

[NullReferenceException:Object   引用未设置为的实例   宾语。]   System.Web.PipelineModuleStepContainer.GetStepArray(RequestNotification   notification,Boolean isPostEvent)+27   System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification   notification,Boolean isPostEvent)+11   System.Web.PipelineStepManager.ResumeSteps(例外   错误)+205   System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext的   context,AsyncCallback cb)+91   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest   wr,HttpContext context)+514

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

有人可以:

  1. 告诉我我是否编码错误
  2. 告诉我解决方法
  3. 向我解释为什么这个错误发生在一个主机而不是另一个主机上。

2 个答案:

答案 0 :(得分:16)

您需要在每个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);
    } 
}

答案 1 :(得分:7)

在我看来,您从IIS 6或IIS 7 Classic模式转到IIS 7集成模式。在IIS 7集成模式中,请求处理与应用程序启动分离。 This article解释了原因和原因。

要解决此问题,您需要将代码移至Application_BeginRequest。