Почему мой хост (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)" в моей панели управления администратора.
Может кто-то:
- Скажите, если я что-то не так кодировал
- Покажите мне обходной путь
- Объясните мне, почему эта ошибка происходит на одном хосте, а не на другом.
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.