IE с двойной обратной передачей зависает IIS 7 в режиме интегрированного управляемого конвейера при доступе к сеансу

Вот моя среда: IIS7.5 на Win 7, .NET 4, интегрированный пул приложений

web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>

Test.aspx

<%@ Page Language="C#" %>

<!DOCTYPE html>
<script runat="server">
    protected void OnAction(object sender, EventArgs e)
    {
        int count;
        status.Text = (int.TryParse(status.Text, out count) ? count + 1 : 0).ToString();

        Session["test"] = count;
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>IIS Session Hang Test</title>
    <script>
        var mutiPostback = function () {
            var e = document.getElementById('LinkButton1');
            e.click();
            e.click();
        };
    </script>
</head>
<body>
    <form id="Form1" method="post" runat="server">
        <asp:ScriptManager runat="server" ID="SM">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="LinkButton1"/>
            </Triggers>
            <ContentTemplate>
                <asp:Label runat="server" ID="status" />
            </ContentTemplate>
        </asp:UpdatePanel>
        <input type="button" id="button1" onclick="mutiPostback();" value="MultiPostback"/>
        <div style="display: none">
            <asp:Button ID="LinkButton1" runat="server" OnClick="OnAction" Text="Click" />
        </div>
    </form>
</body>
</html>

Да, множественная обратная передача является преднамеренной, мы замечаем, что такое поведение приведет к зависанию многих запросов в RequestAcquireState и, в конечном итоге, предотвратит прием любых новых запросов сервером. Однако эта проблема наблюдается только в IE, а не в Chrome или FF.

Чтобы проверить, постоянно нажимайте кнопку множественной обратной передачи. Это обновит номер статуса. Затем вы сможете наблюдать, как это число перестает расти при использовании IE, что указывает на проблему зависания запроса.

Мне удалось создать эту проблему со следующими версиями IIS и IE:

Версии IIS протестированы

  1. 7.5.7600.16385 на Windows Server 2008 R2 с установленным .Net 4.5
  2. 7.5.7600.16385 в Windows 7 Pro с установленным .Net 4.5

Версия IE протестирована

  1. 9.0.8112.16421 в Windows 7 Pro
  2. 8.0.7600.16385 в Windows Server 2008 R2
  3. 6.0.3790.3959 в Windows Server 2003 SP2

Я заметил аномалию, заключающуюся в том, что при доступе к локальному IIS 8.0.7600.16385 в Windows Server 2008 R2 НЕ вызывает эту проблему с блокировкой. Но если я использую браузер для доступа к удаленному IIS, проблема может быть воспроизведена. В IE 9 я могу воспроизвести проблему независимо от того, находится ли IIS удаленно или локально.

Вот снимок экрана, на котором показано, как зависший запрос выглядит в списке запросов для рабочего процесса.

Застрявшие запросыТеперь мы нашли несколько способов обойти эту проблему, но ни один из них не является приемлемым в нашей ситуации:

  1. Удалить / закомментировать использование сеанса.
  2. Измените пул приложений на классический режим.

ПРИМЕЧАНИЕ: мы также обнаружили, что даже если мы не используем сеанс напрямую, как показано в примере, проблема все равно возникает. IE: если мы добавим Global.asax.cs и пустой обработчик событий Session_Start, запрос все равно будет зависать в RequestAcquireState.

Кто-нибудь знает, почему это происходит и как решить эту проблему, которая, похоже, возникает только в режиме интегрированного управляемого конвейера?


person BlueFox    schedule 19.02.2013    source источник
comment
Я не могу воспроизвести это на IIS7.5 на Win7 x64. Пул приложений - это пул приложений по умолчанию? Веб-сайт веб-сайт по умолчанию?   -  person rene    schedule 23.02.2013
comment
Позволяет ли предоставленный вами образец кода воспроизвести проблему? Я спрашиваю, потому что у меня это сработало. Фактически, используя мониторинг сети в инструментах разработчика IE, он ясно показывает, что второй запрос прерывается, что, вероятно, не происходит в вашем случае, отсюда и проблема. Кроме того, не должно быть IIS 7.5 - я не думаю, что вы можете получить IIS 7 для Windows 7.   -  person nick_w    schedule 23.02.2013
comment
Что я наблюдаю при мониторинге сети инструмента IE dev, так это то, что первый запрос будет прерван, второй запрос будет продолжен, но не вернется. Проблема может не появиться при первой попытке, поэтому продолжайте нажимать кнопку, чтобы наблюдать за проблемой, я обновлю исходный вопрос.   -  person BlueFox    schedule 24.02.2013
comment
Я нашел дополнительную информацию с комментарием Рене. Я устал тестировать его с IE8 напрямую (не используя переключение движка dev tool в IE9), и он работает ПРЕКРАСНО !! Я немного добавлю / обновлю определенные версии браузеров.   -  person BlueFox    schedule 24.02.2013
comment
@BlueFox Если у вас есть возможность, не могли бы вы ответить на этот вопрос тем, что вы сделали? Было бы очень признательно. Я решил проблему, переключившись в классический режим, как предлагает Алон Катц ниже, но это далеко не идеально.   -  person Soldarnal    schedule 07.03.2013
comment
К сожалению, это тоже мое текущее решение (переход в классический режим). Я все еще жду, чтобы узнать, сможет ли Microsoft или кто-нибудь лучше понять, как это исправить.   -  person BlueFox    schedule 08.03.2013


Ответы (4)


Из вашего описания похоже, что IIS заходит в тупик, когда пытается получить объект сеанса для вашего запроса. Я бы не стал искать причину в браузерах, потому что это может быть проблемой только на стороне сервера. И, вероятно, с этим ничего не поделаешь. Если это тупик, то это многопоточная проблема, зависящая от времени. Поэтому, если разные браузеры отправляют запросы с немного разным временем, вы получите разные результаты. Кроме того, если вы запускаете браузеры локально или удаленно, вы получаете немного разные тайминги. Очистка сеанса не помогает, потому что проблема связана с получением сеанса. Полное отключение сеанса действительно помогает, потому что сеанс вообще не регистрируется. Изменение пула приложений на классический помогает, потому что он имеет другую реализацию управления сеансом, в которой нет тупика. Чтобы проверить гипотезу, вы можете попробовать вставить искусственную задержку между обратными передачами на стороне клиента. Это создаст другие временные условия и должно повлиять на проблему.

Я должен сказать, что это всего лишь предположения, основанные на вашем описании и моем опыте работы с IIS. Я бы посоветовал вам изменить AppPool на Classic, потому что потери производительности не так уж велики.

person Alon Catz    schedule 01.03.2013
comment
У меня была проблема с тупиком, похожая на эту. Я изменил пул приложений по умолчанию на ASP.NET v4.0, и он исчез. - person Zoidberg; 02.04.2013

У меня была аналогичная проблема на моем сайте. В моем случае у меня была страница, содержащая несколько сеток, каждая из которых вызвала веб-сервис asmx для получения своих данных. Если пользователь ушел со страницы до того, как все веб-запросы были завершены, то сеанс этого пользователя может стать очень медленным (по крайней мере, пара минут для загрузки страницы), но на сеансы других пользователей эта медленность не повлияет. Для меня проблема началась, когда я установил .NET 4.5 на сервер.

Я нашел здесь страницу: http://forums.asp.net/t/1888889.aspx/1?Question+regarding+a+possible+bug+within+NET+4+5, в котором говорится об известной проблеме с .NET 4.5. Ошибка может быть вызвана, если сайт использует интегрированный режим и браузер отключается в ожидании страницы, использующей сеанс ASP.NET. (См. Сообщение для более подробной информации).

Я считаю, что ваш случай двойной обратной передачи может привести к тому, что браузер откажется от одного из запросов, поэтому похоже, что это применимо. Кроме того, я и другие заметили, что ошибка, похоже, чаще встречается при использовании IE (хотя это просто совпадение - это не ошибка IE).

В сообщении также описывается обходной путь (настройка параметра uploadReadAheadSize в файле web.config), и этот способ решил проблему для меня.

person Wesley Smith    schedule 11.04.2013
comment
Ага; звучит как проблема, которая у нас была (stackoverflow.com/questions/11250167/). Похоже на ошибку ASP.NET; возможно, здесь упоминается проблема 6: support.microsoft.com/kb/2828841/en-us < / а> - person Danny Tuppeny; 27.06.2013

Хорошие новости! Похоже, что проблема блокировки сеанса была решена после установки .Net 4.5.1.

Я обновил свою тестовую машину 7.5.7600.16385 на Windows Server 2008 R2 с установленным .Net 4.5 до 4.5.1, и проблема исчезла!

person BlueFox    schedule 04.03.2014

Обратите внимание, что это то же самое, что и сообщение Stackoverflow -> ManagedPipelineHandler для AJAX POST дает сбой, если пользователь IE9 уходит со страницы во время выполнения этого вызова.

Похоже, это регресс в ASP.NET 4.5. Команда ASP.NET работает над исправлением, но есть временное решение (см. Сообщение, указанное выше).

Если вы не можете дождаться общедоступного широкого обновления, вы можете обратиться в службу поддержки клиентов Microsoft за запросами на исправления. Просто следуйте обычному процессу открытия заявки в службу поддержки. Например, файл в Интернете https://support.microsoft.com/oas/default.aspx?&gprid=548&&st=1&wfxredirect=1&sd=gn или позвоните в службу поддержки http://support.microsoft.com/default.aspx?id=fh;en-us;offerprophone. Возможно, вам потребуется внести минимальную сумму аванса, но вы можете получить возмещение в соответствии с политикой поддержки клиентов. Просто попросите специалиста службы поддержки связаться с netfx45compat в Microsoft dot com, чтобы получить быстрый контекст по этой проблеме.

Спасибо, Варун Гупта (совместимость с .NET Framework)

person Varun    schedule 14.04.2013