Pregunta

Estamos escribiendo una aplicación de búsqueda que guarda los criterios de búsqueda para el estado de la sesión y ejecuta la búsqueda dentro de un panel de actualización de asp.net. A veces, cuando ejecutamos varias búsquedas sucesivamente, la segunda o tercera búsqueda a veces arrojará resultados del primer conjunto de criterios de búsqueda.

Ejemplo: en nuestra primera búsqueda, observamos " John Smith " - > Se muestran los resultados de John Smith. En la segunda búsqueda, hacemos un vistazo a " Bob Jones " - > Se muestran los resultados de John Smith.

Guardamos todos los criterios de búsqueda en el estado de sesión como dije, y lo leemos del estado de sesión dentro de la solicitud de ajax para formatear la consulta de base de datos. Cuando ponemos puntos de ruptura en VS, todo se comporta de manera normal, pero sin ellos obtenemos los criterios y resultados de búsqueda originales.

Mi conjetura es porque se guardan en sesión, que la solicitud de ajax de alguna manera obtiene su propia sesión y guarda los criterios para eso, y luego recupera los criterios de esa sesión cada vez, pero las cosas no asíncronas son capaces de ver cuando se modifican los criterios y se guardan los cambios en el estado correspondiente, pero como son de dos sesiones diferentes, existe una disparidad en lo que se guarda y se lee.

EDITAR ::: Para elaborar más, hubo una sugerencia de añadir los criterios de búsqueda a la cadena de consulta, lo que normalmente es una buena práctica y estoy de acuerdo en que debería ser así, pero cumpliendo con nuestros requisitos, no lo veo como viable. Lo desean para que el usuario complete la búsqueda de accesos de los controles de entrada y no haya una recarga de página, lo único que ven es un indicador de progreso en la página, y aún tienen la capacidad de navegar y usar otras funciones en la página actual. Si tuviera que agregar criterios a la cadena de consulta, tendría que hacer otra solicitud que causara que se cargara toda la página, lo cual, dependiendo de los criterios de búsqueda, puede llevar mucho tiempo. Esta es la razón por la que estamos utilizando una llamada ajax para realizar la búsqueda y por qué no estamos causando otra solicitud de página completa ... Espero que esto aclare la situación.

¿Fue útil?

Solución

No hay varias sesiones entre las cargas normales de páginas ASP.NET, las devoluciones de datos y las devoluciones parciales de ASP.NET AJAX. Te lo puedo decir con certeza.

En lugar de almacenar la cadena de búsqueda en la sesión, ¿qué tal si usas directamente el contenido de los cuadros de texto de búsqueda? No puedo pensar en ninguna razón por la que necesitarías barajarlo, ya que de todos modos estará disponible durante todo el ciclo de vida de la página.

Finalmente, con respecto a sus requisitos ... El uso de un UpdatePanel no cumple con el requisito de que sus usuarios puedan usar otra funcionalidad en la página si esa funcionalidad también genera devoluciones de datos parciales. Sólo se puede realizar una devolución parcial de datos a la vez. Si se produce otro evento mientras su búsqueda está en curso, la solicitud de búsqueda se cancelará sin ninguna notificación.

El uso de un método de página o servicio web para la búsqueda sería una forma mucho más rápida, fácil y más robusta de hacerlo. Normalmente no conecto mi propio sitio, pero creo que un par de mis publicaciones son exactamente relevantes para lo que estás haciendo:

Puede usar un control de usuario para representar los resultados de búsqueda a través de un servicio web (mucho más rápido que un UpdatePanel): http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/

O, puede devolver los resultados de búsqueda como JSON y mostrarlos en el lado del cliente (incluso más rápido): http://encosia.com/2008/06/26/use-jquery-and-aspnet-ajax-to- construir un cliente repetidor /

Cualquiera de estos métodos podría quitar su funcionalidad de búsqueda del paradigma de devolución de datos parcial, de modo que se ejecute más rápido, use menos ancho de banda y recursos del servidor, y no impida que otras actividades de UpdatePanel ocurran simultáneamente.

Otros consejos

Otro pensamiento, siempre me he encontrado con problemas con el panel de actualización y prefiero escribir mis solicitudes de atlas ajax a través de la biblioteca directamente, usando PageMethods. Tienes más control sobre lo que envías y recibes. UpdatePanel envía la página completa y recibe la jerarquía de control de la página completa, luego analiza lo que está "nuevo" y lo muestra.

Editar: ¿Cuál es el código que está utilizando para guardar los criterios en la sesión? ¿Y tiene código en el método que realmente verifica si la sesión tiene algunos criterios guardados, y en su lugar pasa eso de nuevo? Tal vez es por eso que los postbacks del segundo / tercer updatepanel están devolviendo el primer conjunto de criterios en lugar de los resultados esperados? Dejando de lado, por haber hecho algunas cosas pesadas de atlas de atlas, definitivamente no hay dos sesiones (una para devolución normal, otra para asíncrono) ¿Hay alguna posibilidad de que estés usando una webfarm?

Edición # 2: No hubiera podido escribir lo que he escrito arriba (primer párrafo) si no hubiera sido fanático de alguien que también respondió: https://stackoverflow.com/users/60/dave-ward

Debe establecer la propiedad EnableSession del atributo WebMethod para la función que está llamando.

[WebMethod( EnableSession=true )]
public static void DoSomething(){
    /// ....
}

Si usa manejadores genéricos .ashx, solo derive de la interfaz IRequiresSessionState

public class ActionRequest : IHttpHandler, IRequiresSessionState
{
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top