Application_EndRequest (отправитель объекта, EventArgs e) вызывается несколько раз в asp.net

#asp.net #web-applications

#asp.net #веб-приложения

Вопрос:

В моем приложении я определяю класс, который реализует ihttpmodule и содержит следующие методы

   public void Init(HttpApplication application)
    {
        application.EndRequest  = new EventHandler(Application_EndRequest);
    }


 private void Application_EndRequest(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;


        IObjectContainer objectClient = context.Items[KEY_DB4O_CLIENT] as IObjectContainer;

        if (objectClient != null)
        {
            objectClient.Close();
        }

        objectClient = null;
        context.Items[KEY_DB4O_CLIENT] = null;
    }
  

когда я пытаюсь запустить приложение и отладить его, я замечаю одну странную вещь:

в Chrome private void Application_EndRequest (отправитель объекта, EventArgs e) выполняется 3 раза при запуске приложения и еще 3 раза при завершении приложения.

в Internet Explorer private void Application_EndRequest (отправитель объекта, EventArgs e) выполняется 2 раза при запуске приложения и еще 2 раза при завершении приложения.

Почему Application_EndRequest выполняется несколько раз. Разве это не должно выполняться только один раз?

А также я хотел бы знать разницу между веб-сервером разработки Visual Studio и IIS?

В чем разница между обоими мной.

Пожалуйста, помогите мне

Спасибо в ожидании

Комментарии:

1. Я вижу одно и то же, вы когда-нибудь выясняли, почему? Я захожу на сайт с помощью curl , поэтому я сомневаюсь, что происходит что-то еще.

Ответ №1:

Application_EndRequest() будет вызываться столько раз, сколько запросов обрабатывается средой выполнения. С сервером VSDev это будет каждый запрос; включая запросы к изображениям и другим различным ресурсам, которые может искать браузер … например, изображение значка закладки.

Это также может объяснить разницу между браузерами; IE и Chrome могут отличаться в том, какие дополнительные функции они пытаются запросить, в частности, повторно: значок сайта.

Комментарии:

1. @Andrew является ли добавление методов Application_EndRequest и Init в приложении накладными расходами, поскольку они должны выполняться несколько раз перед каждым запросом? И есть ли явный способ вызывать их только один раз при запуске и завершении приложения?

2. Вы имеете в виду, Application_Start и Application_End , может быть?

3. @Andrew похоже, что они выполняются, когда в их выполнении нет необходимости? Почему они выполняются таким образом?

4. Нет, они вызываются именно тогда, когда они должны быть … в конце каждого запроса … вот почему это называется «EndRequest». То, что вы хотите, это Application_End … нет Application_EndRequest .

5. @Andrew я постараюсь вернуться к вам.