Objeto estático compartido ASP.NET Webgarden

Tengo un servicio web que necesita usar un objeto jabber-net para enviar mensajes XMPP a los clientes.

(Es para manejar la impresión: cuando el servicio web necesita que se imprima algo, envío un mensaje XMPP a un cliente de formularios de Windows que se ejecuta en la máquina en particular conectada a la impresora, con el tipo de trabajo de impresión y la URL, y luego el cliente descarga los datos y los envía a la impresora. Este canal de comunicación también se utilizará para otras funciones de POS, como abrir cajones, hablar con dispositivos de chip y pin, etc., por lo que las alternativas de impresión no serán útiles).

Tengo un objeto estático que contiene una instancia del objeto jabber-net, que inicia sesión en el servidor XMPP y luego está disponible para enviar mensajes.

Esto funciona bien con un solo subproceso. Cuando convierto el servicio web en un jardín web para que pueda funcionar en más de un subproceso, parece que cada subproceso obtiene su propia instancia del objeto jabber-net, por lo que todos intentan iniciar sesión en el servidor XMPP en una vez como el mismo usuario, lo que significa que continuamente son expulsados.

Pregunta: ¿Hay alguna forma de compartir un objeto vivo (que pueda manejar eventos, no un objeto serializado, no solo datos) entre todos los subprocesos en un jardín web y, de ser así, cuál es la mejor manera de hacerlo?

preguntado el 28 de agosto de 12 a las 13:08

1 Respuestas

Los jardines web son básicamente granjas web en miniatura, y deben tratarse como tales: busque soluciones que estarían involucradas en granjas web y esas mismas soluciones se aplicarán en su caso.

Me sorprendieron las sesiones y los jardines web, y finalmente cambié a un proveedor de sesión fuera de proceso (utilicé un proveedor basado en Memcached, pero el proveedor de SQL Server habría funcionado). Podría hacer algo similar y tener un proveedor compartido al que cada subproceso podría solicitar el objeto.

Sin embargo, esto no resolverá su problema de eventos; dudo que se pueda resolver de esta manera, y es posible que deba cambiar a un sistema de mensajería (msmq, por ejemplo), con todos los mensajes manejados por un solo proceso.

Respondido 28 ago 12, 13:08

El problema es que el enfoque basado en XMPP fue mi forma de enviar mensajes. MSMQ no ayudará mucho, porque "Los mensajes no se pueden leer desde una cola en una computadora que no tiene una conexión directa". Supongo que podría vivir con cada subproceso iniciando sesión en el servidor XMPP por separado con un nombre único, aunque será interesante averiguar qué nombres son libres para iniciar sesión... tal vez si profundizo más en jabber-net descubriré cómo para iniciar sesión con el mismo nombre y un recurso diferente. - ben curthoys

Ok, eso servirá como respuesta, como agregar la línea _JabberClient.Resource = "myserver" + Thread.CurrentThread.ManagedThreadId.ToString(); Ha ordenado todo: todos los subprocesos pueden iniciar sesión felizmente a la vez, todos podrán enviar mensajes y todos ellos recibirán cualquier mensaje / notificación de presencia al servidor. - ben curthoys

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.