2011-09-21 12 views
7

Tengo un proyecto ASP.NET MVC ejecutándose en mi máquina de desarrollador con Windows 7 ultimate e iis 7.5.IIS retrasa mucho entre cada respuesta con solicitudes asincrónicas

hago lo siguiente:

var requests = ["http://myserver.com/news/details/113834", 
"http://myserver.com/tag/details?ids=113834&entityType=23", 
"http://myserver.com/publish/details?ids=113834&entityType=23", 
"http://myserver.com/generalproperty/details?ids=113834&entityType=23", 
"http://myserver.com/category/details?ids=113834&entityType=23"]; 

var f = new Date().getTime(); 
$.each(requests, function(k,v) { 
    $.ajax({ 
    url :v, 
    async : true, 
    type :'get', 
    success : function(data) { 
     console.log(new Date().getTime() -f); 
    }}); 
}) 

entonces consigo los siguientes resultados (aprox) 12, 521,1025,1550, 2067 async result http://martinhansen.no/hostedimages/async.PNG

Si cambio el asíncrono en false me sale: 14,32,49,58,68 sync result http://martinhansen.no/hostedimages/sync.PNG

Parece que en algún lugar las solicitudes están en cola y después de un tiempo responde cada 500 segundos. He hecho que mis controladores devuelvan texto en blanco en lugar de la llamada a la base de datos, por lo que no la base de datos.

¿Existe alguna limitación en IIS 7.5 para Windows 7? ¿Una configuración que puedo cambiar? Sospecho que hay un máximo de solicitudes concurrentes por usuario o algo similar. Y luego lo "castiga" respondiendo cada 500 ms solamente. Para que la gente no lo use como un servidor real.

¿Probablemente? ¿Y hay una manera de evitarlo?

Respuesta

8

No tiene nada que ver con IIS o con IIS en Windows 7, también lo probé en un servidor de prueba y obtuve los mismos resultados.

Fue debido a las limitaciones impuestas por sessionstate, ver la sección "Solicitudes concurrentes y estado de sesión" sección en la parte inferior aquí: http://msdn.microsoft.com/en-us/library/ms178581.aspx

Sin embargo, si dos solicitudes simultáneas se realizan para la misma sesión (mediante el uso de el mismo valor de SessionID), la primera solicitud obtiene acceso exclusivo a la información de la sesión. La segunda solicitud se ejecuta solo después de que finaliza la primera solicitud.

Pero todavía no entiendo por qué no se dispara la próxima solicitud justo después de que el primero parece estar terminado. Parece muy falso el retraso de 500 ms.

Me vino esta pregunta How to set the ASP.NET SessionState read-write LOCK time-out? que habla sobre el tiempo de bloqueo para el estado de la sesión.

System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_INTERVAL = 500

Ese es el número mágico que he estado buscando mi código y la interwebs para .. 500! Sabía que tenía que estar en algún lugar.

De todos modos, para solucionar este problema, he añadido el atributo sessionstate a mis controladores con la opción de sólo lectura

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 
public class BaseController : Controller{} 

Lea más sobre esto:

http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx

http://weblogs.asp.net/imranbaloch/archive/2010/07/10/concurrent-requests-in-asp-net-mvc.aspx

Todavía creo que algo anda mal, ¿por qué la solicitud anterior no le dice al sistema que ya no es ne eds un candado en el estado de sesión para que se pueda completar la siguiente solicitud?

0

¿Cuántas solicitudes envías a la vez? IIS en los sistemas operativos del cliente son limited to 10 simultaneous connections. Por encima de ese límite, lanza la conexión entrante a una cola y la procesa cuando se abre un espacio.

Este ha sido el caso durante mucho tiempo en un esfuerzo de MS para garantizar que los sistemas operativos de cliente no se utilicen para canibalizar las ventas de sus plataformas de sistema operativo de servidor.

Cuestiones relacionadas