2010-02-24 32 views
32

AJAX novato aquí!
Por el momento, en mi aplicación web ASP.NET MVC, parece que mis solicitudes AJAX están siendo agrupadas o en cola, no estoy seguro.
No parece que se completen las solicitudes hasta que la solicitud anterior haya finalizado.
¿Cómo hago para que las solicitudes vuelvan de forma independiente?
No necesariamente quiero que alguien me dé la respuesta, pero tal vez algunos enlaces a buenos tutoriales o recursos que podrían ayudar. GraciasASP.NET MVC y Ajax, solicitudes concurrentes?

+0

Por favor enviar el código de la petición AJAX y la acción del controlador que está manejando. – Lazarus

Respuesta

35

Estoy expandiendo la respuesta de Lachlan Roche, que es correcta.

El marco de trabajo de ASP.NET tendrá solicitudes de "un único subproceso" que se ocupen del ámbito de sesión (un recurso global), para evitar que una solicitud interfiera con otra. En WebForms, creo que puede usar la directiva de la Página para especificar que las páginas individuales no usen Session y, por lo tanto, no es necesario tratarlas sincrónicamente de esta manera.

El problema es que en ASP.NET MVC todas las solicitudes utilizan la sesión, porque se utiliza para implementar TempData. Puede desactivar completamente el estado de la sesión, como lo señaló Lachlan Roche, o puede tratar esto caso por caso.

Una posible solución podría ser iniciar sus propios hilos de fondo para procesar cualquier código de larga ejecución, de modo que la solicitud inicial se "complete" lo más rápido posible.

-5

Sugiero usar jQuery para sus necesidades de ajax con asp.net mvc, lo he usado exclusivamente y ha sido extremadamente fácil.

En cuanto a tutoriales me gustaría ver en este: http://docs.jquery.com/Ajax

hay un montón de opciones para jugar y también sugieren la descarga de Firebug para que pueda ver las solicitudes lanzan desde la página de forma asíncrona y ver si se disparan y lo que return etc.

Al igual que el otro lado, la solicitud AJAX es asincrónica y no se pone en cola y todas vuelven independientemente cuando terminan, por lo que si observas en firebug será fácil ver lo que está pasando detrás las escenas y antes de que el depurador sea golpeado

+0

downvotes en una respuesta de 3 años, ¿alguien le importa comentar? – Jimmy

+4

No descarté esto, pero esto no es exacto: "La solicitud AJAX es asincrónica y no se pone en cola". Si bien es cierto que el cliente no los pone en cola, el servidor los pone en cola cuando el estado de la sesión está habilitado. –

34

ASP.NE T procesará las solicitudes en serie por sesión a menos que las sesiones estén configuradas como deshabilitadas o solo se lean en web.config mediante el atributo enableSessionState en el elemento de páginas.

Como esta es una configuración de página, esto no afectará a los controladores MVC y seguirán estando sujetos al procesamiento de solicitud en serie.

Curiosamente, incluso con sesiones deshabilitadas o configuradas para solo lectura, todavía podemos leer y escribir datos de sesión. Parece que solo afecta el bloqueo de la sesión que causa el procesamiento de solicitud en serie.

<system.web> 
    <pages enableSessionState="ReadOnly"/> 
</system.web> 

Las páginas también pueden tener una propiedad enableSessionState, aunque esto no es relevante para las vistas MVC.

<%@ Page EnableSessionState="True" %> 
+2

Acabo de comprobarlo. No funciona en ASP.NET MVC 5. Aunque Session = null, las solicitudes simultáneas siguen siendo secuenciales. –

+0

Mismo problema que Lachlan Roche – Simon

+0

Consulte la respuesta de Andy. Este atributo del controlador funcionó para mí: [SessionState (System.Web.SessionState.SessionStateBehavior.ReadOnly)] – RayLoveless

29

Con el lanzamiento de ASP.MVC 3 ahora puede agregar un atributo a sus controladores para marcar la sesión como de solo lectura, lo que permite que las acciones sean llamadas concurrentemente desde el mismo cliente.

sin sesión Auxiliar del Controlador:

Controlador sin sesión es otra gran característica nueva en ASP.NET MVC 3. Con sin sesión controlador puede controlar fácilmente su comportamiento de la sesión para los controladores. Por ejemplo, puede hacer que la sesión de su HomeController sea Disabled o ReadOnly, permitiendo la ejecución de solicitudes simultáneas para un solo usuario. Para más detalles, vea Concurrent Requests In ASP.NET MVC y HowTo: Sessionless Controller in MVC3 – what & and why?.

- de this DZone article.

Al agregar SessionState(SessionStateBehaviour.Disabled) a su controlador, el tiempo de ejecución le permitirá invocar múltiples acciones concurrentemente desde la misma sesión del navegador.

Desafortunadamente, no creo que haya una manera de marcar una acción para desactivar solo la sesión cuando se invoca esa acción, por lo que si tiene un controlador que tiene algunas acciones que requieren la sesión y otras que no , deberás mover los que no están en un controlador por separado.

En versiones posteriores de ASP MVC se puede decorar clases de controlador individuales con el SessionStateAttribute

[System.Web.Mvc.SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 
public class MyController : Controller 
{ 
} 
+1

Puede implementar su propia gestión de sesión basada en acciones consultando el siguiente artículo http://sapoval.org/per-action-custom -sessionstatetributribute – mematei

+0

Acabo de comprobarlo. No funciona en ASP.NET MVC 5. Aunque Session = null, las solicitudes simultáneas siguen siendo secuenciales. –

+0

Mencione también [SessionState (System.Web.SessionState.SessionStateBehavior.ReadOnly)] –

-2

Solicitud Bueno concurrente son más en aswell depende del navegador si fuego 10 solicitudes simultáneas supongamos que una acción con el Ajax en Mozilla y usando IE 8, entonces encontrarás que Mozilla tiene estilo para disparar una solicitud, espera su respuesta y luego dispara el segundo, y así sucesivamente ... para esto es una por una, mientras que en IE * este dispara alrededor de 6 solicitudes simultáneas a la vez al servidor.

La solicitud concurrente también depende del tipo de navegador.

2

Desde la versión 3.0 de .NET Framework liberado, puede utilizar enumeración "SessionStateBehavior" con SessionStateAttribute:

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