Подтвердить что ты не робот

IE double postback зависает 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

  • 7.5.7600.16385 на Windows Server 2008 R2 с установленной .Net 4.5
  • 7.5.7600.16385 на Windows 7 Pro с установленной .Net 4.5

Проверена версия IE

  • 9.0.8112.16421 на Windows 7 Pro
  • 8.0.7600.16385 на Windows Server 2008 R2
  • 6.0.3790.3959 на Windows Server 2003 с пакетом обновления 2

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

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

Stuck Requests Теперь мы нашли несколько способов обойти эту проблему, но в нашей ситуации это не приемлемо:

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

У меня была аналогичная проблема на моем сайте. В моем случае у меня была страница с несколькими сетками, каждая из которых называлась веб-службой 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), и это решение проблемы разрешило для меня.

Ответ 4

Обратите внимание, что это то же самое, что и сообщение Stackoverflow post → 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)