Вот моя среда: IIS7.5 на Win 7, .NET 4, App Pool IntegratedIE двойной постбэк висит IIS 7 в интегрированном режиме Managed трубопровода, когда сеанс доступен
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 Installed
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 на удаленном или локальном.
Вот скриншот того, как выглядел повешенный запрос в списке запросов для рабочего процесса.
Теперь мы нашли несколько способов, чтобы обойти эту проблему, но ни один не являются приемлемыми в нашей ситуации:
- Remove/Закомментируйте использование сеанса.
- Изменение пула приложений в классическом режиме.
ПРИМЕЧАНИЕ. Мы также обнаружили, что даже если мы не используем непосредственно сеанс, как показано в примере, проблема все еще возникает. IE: если мы добавим файл Global.asax.cs и добавим пустой обработчик событий Session_Start, запрос все равно будет зависать в RequestAcquireState.
Кто-нибудь знает, почему это происходит и как мы можем решить эту проблему, которая, по-видимому, происходит только в режиме интегрированного управляемого конвейера?
Я не могу воспроизвести это на IIS7.5 на Win7 x64. Является ли apppool пулом приложений по умолчанию? Веб-сайт веб-сайта по умолчанию? – rene
Этот пример кода, который вы предоставили, позволяет воспроизвести проблему? Я спрашиваю, потому что это сработало для меня. Фактически, используя сетевой мониторинг в инструментах разработчика IE, он ясно показывает, что второй запрос прерывается, что, вероятно, не происходит в вашем случае, следовательно, проблема. Кроме того, не должен ли это быть IIS 7.5 - я не думаю, что вы можете получить IIS 7 для Windows 7. –
Что я наблюдаю в сетевом мониторинге инструментов IE dev, заключается в том, что первый запрос будет прерван, второй запрос будет продолжен, но он не вернется. Проблема может не возникнуть при первой попытке, поэтому продолжайте нажимать кнопку, чтобы наблюдать за проблемой, я обновлю исходный вопрос. – BlueFox