Почему мой хост (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 по умолчанию и добавив приведенный выше код. Странно то, что этот код отлично работал на моем старом хосте, и он зависал только на моем новом (общем) хосте. Если у меня есть эти обработчики событий в моем коде, я получаю эту ошибку:

Ошибка сервера в приложении '/' В экземпляре объекта не задана ссылка на объект. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

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

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

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

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

Может кто-то:

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

2 ответа

Вам нужно зарегистрировать свои обработчики в каждом экземпляре 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);
    } 
}

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

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

Другие вопросы по тегам