Estou tentando rastrear um bug muito estranho com o IIS 7.5 no Windows 7. Primeiro, aqui está um pouco de contexto.
Eu tenho um aplicativo da web ASP.NET muito simples com o seguinte código:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<customErrors mode="Off"/>
</system.web>
</configuration>
<%@ Page Language="C#" Inherits="_Default" CodeFile="default.aspx.cs" %>
<html>
<body>
<h1><asp:literal runat="server" id="litHeading1" /></h1>
<form runat="server">
<asp:TextBox id="tbInput" runat="server" />
<asp:Button id="btnSubmit" Text="Submit" runat="server" />
</form>
</body>
</html>
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if( IsPostBack ) {
litHeading1.Text = "Posted! Hi, " + tbInput.Text;
} else {
litHeading1.Text = "Get";
}
}
}
Eu também tenho um script Python muito simples para acessar essa página e postar nela:
import requests as reqm
url = 'http://localhost/testapp4.0/default.aspx'
post_payload = {
# post values don't seem to matter, having them or not having them
# doesn't seem to affect the problem
'__VIEWSTATE': r"/wEPDwUKMTU1MDMxMzU0MQ9kFgICAQ8WAh4EVGV4dAUDR2V0ZGShYB/fzaT/YSTSt7FPGhIQcCrp1GbI+eD2bLFl1qUxWA==",
'__EVENTVALIDATION': r"/wEWAwLT5c/kDALpouS8DQLCi9reA+DdtetcF6QuZcTZOdNPIJzwWkvX+ITpSzlbXCsWVizl",
'tbInput': 'fred',
'btnSubmit': 'Submit',
}
def doit():
req = reqm.post(url, data=post_payload)
print(req.text)
# if it doesn't show up in one run, bump value to
# 500 or so
for x in range(1):
doit()
Então, qual é o problema?
O problema é que o IIS está perdendo a conexão com freqüência, mas somente quando a ação POST é executada. Se alterar o script para usar a ação GET, não vejo nenhum problema.
Exemplo de arquivo de log do IIS:
2012-11-28 00:48:57 ::1 POST /testapp4.0/default.aspx - 80 - ::1 python-requests/0.14.0+CPython/2.7.2+Windows/7 400 0 64 6767
Exemplo de arquivo de rastreamento do IIS:
link
Exemplo do IIS HTTP.err de solicitações do Python:
2012-11-28 00:44:16 ::1%0 53528 ::1%0 80 HTTP/1.1 POST /testapp4.0/default.aspx - 1 Timer_EntityBody Classic+.NET+AppPool
2012-11-28 01:16:03 ::1%0 53928 ::1%0 80 HTTP/1.1 POST /testapp4.0/default.aspx - 1 Timer_EntityBody .NET+4.0
Idem, mas a partir de uma solicitação do PHP com falha:
2012-11-28 01:19:33 ::1%0 53942 ::1%0 80 - POST /testapp4.0/default.aspx - - Timer_HeaderWait -
Iterações feitas em várias coisas para tentar isolar
Eu vi o problema aparecer independentemente do que tentei:
- ASP.NET 2.0 vs 4.0
- Várias máquinas do Windows 7 Pro, uma delas uma VM e um laptop
- tráfego do host local vs passar por uma rede
- Clássico e amp; Modos integrados
- Scripts de cliente Python 2.7, 3.3, PHP 5.4 (em execução no Windows e no Linux)
- IIS Express
- Colocando um atraso de 1 segundo entre solicitações nos loops de script
- Variaram os parâmetros que estou colocando. Tudo, desde viewstate completamente preciso, etc. até "foo = bar"
- Desligou o firewall do Windows
Natureza intermitente
- Durante muito tempo, os scripts do Python sempre causariam erros na primeira solicitação. Então, de vez em quando, eles começavam a trabalhar e a maioria ficava trabalhando. Se eu colocar o script em um loop apertado, o servidor trava rapidamente novamente.
- Inicialmente, o script PHP estava sempre trabalhando na primeira solicitação, mas também falha consistentemente em um loop bem apertado.
Resolução:
- Usando um servidor Windows 2003 (IIS 6), 500 solicitações seguidas sem problemas
- quando eu posso dizer que o script foi interrompido, mas ainda não errou, e eu mato o script, as próximas solicitações geralmente funcionam.
- se eu deixar o tempo acabar em vez de eliminá-lo e tentar executar o script novamente, ele geralmente será interrompido novamente na próxima solicitação.
Rate limiting?
Eu estou querendo saber se isso pode ser algum tipo de problema de limitação de taxa no IIS 7.5 no Windows 7. Eu li que tem certas limitações, uma vez que não está sendo executado em um sistema operacional de servidor. No entanto, isso não explica por que ainda vejo o problema quando estou executando solicitações muito raras.
Por que isso é um problema?
Estou tentando executar testes funcionais em um aplicativo WebForms .NET. Como você pode imaginar, as conexões perdidas com frequência estão atrapalhando meus testes!
Passei dias solucionando isso e ficaria muito grato por alguma ajuda!