Почему мой хост (softsyshosting.com) не поддерживает обработчики событий BeginRequest и EndRequest? - PullRequest
9 голосов
/ 14 июля 2009

Я слышал хорошие отзывы о 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: объект ссылка не установлена ​​на экземпляр объект.

Ошибка источника: необработанное исключение был создан во время выполнения текущий веб-запрос. Информация относительно происхождения и местоположения исключение можно определить с помощью трассировка стека исключений ниже.

Трассировка стека:

[NullReferenceException: объект ссылка не установлена ​​на экземпляр объект.] System.Web.PipelineModuleStepContainer.GetStepArray (RequestNotification уведомление, Boolean isPostEvent) +27 System.Web.PipelineModuleStepContainer.GetEventCount (RequestNotification уведомление, логическое isPostEvent) +11 System.Web.PipelineStepManager.ResumeSteps (Exception ошибка) +205 System.Web.HttpApplication.BeginProcessRequestNotification (HttpContext контекст, AsyncCallback cb) +91 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, контекст HttpContext) + 514

Я пытался решить эту проблему с помощью Softsys, но они не очень помогли, в основном они только подтвердили, что я включил функцию «ASP.NET Pipeline (MVC)» в панели управления администратора.

Может кто-нибудь:

  1. Скажите, если я что-то не так кодировал
  2. Покажите мне обходной путь
  3. Объясните мне, почему эта ошибка происходит на одном хосте, а не на другом.

Ответы [ 2 ]

16 голосов
/ 08 августа 2009

Вам необходимо зарегистрировать свои обработчики в каждом экземпляре HttpApplication. Может быть несколько объединенных экземпляров HttpApplication. Application_Start вызывается только один раз (для IIS 6 и IIS 7 в классическом режиме - по первому запросу, для интегрированного режима IIS 7 - при запуске веб-приложения, перед любым запросом). Итак, чтобы все заработало, вам нужно добавить обработчики событий в переопределенный метод Init HttpApplication или в его конструктор. Если вы добавите их в конструктор - эти обработчики будут вызваны первыми, даже до обработчиков зарегистрированных модулей.
Итак, ваш код должен выглядеть так:

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);
    } 
}
7 голосов
/ 14 июля 2009

Похоже, вы перешли из режима IIS 6 или IIS 7 Classic в режим IIS 7 Integrated. В интегрированном режиме IIS 7 обработка запросов была отделена от запуска приложения. Эта статья объясняет, почему и почему.

Чтобы исправить это, вам нужно вместо этого переместить код в Application_BeginRequest.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...