6

Tengo un proyecto ASP.NET MVC3 donde la página principal de aspx está realizando una carga dinámica para sus partes usando jQuery ajax. Así que, básicamente, cuando el sitio se carga, accede/Inicio/Índice y luego dentro de la vista Index (aspx), hay varias líneas de jQuery que hacen llamadas ajax (a/Home/PartOne y/Home/PartTwo para rellenar partes de la página.Cómo reducir/eliminar el tiempo de espera/latencia en la solicitud AJAX

Así que cada vez que se carga la página, que básicamente está haciendo 3 peticiones: para obtener el índice, para obtener PartOne le, y luego PartTwo

la pregunta:. ¿por qué hay una especie de "esperar" tiempo para la la tercera solicitud para ejecutar? Pensé que este era el límite de solicitud simultánea del navegador, pero ¿por qué no se está ejecutando después de la primera solicitud?

Cuando experimentalmente puse "OutputCache" attrib ute en "PartTwo", se comporta como se esperaba, que se estaba ejecutando rápidamente. Esto sugiere que el problema no está en IIS, sino en algún lugar después de eso y antes de que llegue a mi método de acción.

Aquí está una captura de pantalla de Chrome de perfiles de red: Chrome network profiler

Aquí es una captura de pantalla en el MvcMiniProfiler - mira a la tercera fila/valor, se está a la espera durante 500 ms antes de ejecutar código de acción de mi controlador. enter image description here

Mi código de controlador tiene este aspecto. Aunque me corté el código real, pero el código de PartTwo es muy trivial (sin cómputo de largo, no hay llamadas db, etc):

public class HomeController : Controller { 
    public ActionResult Index() { 
     // do something here 
     return View(); 
    } 

    public ActionResult PartOne() { 
     // do something here 
     return View(); 
    } 

    public ActionResult PartTwo() { 
     // do something here 
     return View(); 
    } 
} 

Mi javascript:

$(document).ready(function() { 
    $.ajax({ 
     url: "/Home/PartOne", 
     cache: false, 
     success: function (data, textStatus, request) { 
      $("#TestContainerOne").html(data); 
     } 
    }); 

    $.ajax({ 
     url: "/Home/PartTwo", 
     cache: false, 
     success: function (data, textStatus, request) { 
      $("#TestContainerTwo").html(data); 
     } 
    }); 
}); 

Mi index.aspx:

<h2>Home page</h2>  
<div id="TestContainerOne"></div> 
<div id="TestContainerTwo"></div> 

PartOne.ascx:

<h2>Part One</h2> 

PartTwo.ascx:

<h2>Part Two</h2> 

¿Ayuda?

+0

que podría tener algo que ver con el número de solicitudes simultáneas de un navegador puede tener con un dominio específico. Vea la respuesta de esta pregunta: http://stackoverflow.com/questions/561046/how-many-concurrent-ajax-xmlhttprequest-requests-are-allowed-in-popular-browse – Dismissile

+0

No lo creo. Debido a que solo hay 3 solicitudes, en teoría, deberían ejecutarse una detrás de la otra, lo cual es cierto. Pero la demora está ocurriendo en el lado del servidor. Mira mi nota sobre el experimento usando OutputCache, que sugiere que no es causada por la limitación del navegador/cliente. –

+1

Cosas que probar: a) Liberar compilación con debug = "false" en la web.config (creo que leí en alguna parte que cuando la depuración es cierta, hay algunas cosas almacenadas en la memoria caché), b) Pruebe el código en IIS o IIS Express, ya que generalmente encuentro que el servidor de desarrollo clásico es un tanto escabroso algunas veces. – Pedro

Respuesta

7

Debe usar el estado de sesión de solo lectura o deshabilitarlo completamente para obtener el procesamiento paralelo de las solicitudes Ajax. De forma predeterminada, el servidor bloquea el estado de la sesión para las solicitudes provenientes del mismo cliente, por lo que las solicitudes se ejecutan de forma secuencial.

Esto se hace mediante la decoración de su controlador con el atributo SessionState:

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 
public class HomeController : Controller { 
    public ActionResult Index() { 
     // do something here 
     return View(); 
    } 

    public ActionResult PartOne() { 
     // do something here 
     return View(); 
    } 

    public ActionResult PartTwo() { 
     // do something here 
     return View(); 
    } 
} 
+1

Escribí un informe de este problema en mi blog: http://setiabud.blogspot.com/2012/03/session-variable-performance.html –

+0

otro momento microsoft face-palm –

Cuestiones relacionadas