¿Cómo se ejecuta el código en un WebService?

Actualmente estoy trabajando en un WebService que está destinado a ser utilizado por numerosos clientes ligeros diferentes. Lo he estado probando hasta ahora con 1 sitio web como cliente.

Mi pregunta es, el servicio web tiene clases adecuadas. Cuando alguien inicia sesión en un sitio web que usa el servicio web, ¿se crea una instancia de la clase principal para esa instancia de alguien que lo usa?

Por ejemplo, durante la depuración tengo 1 cliente.

  1. El servicio comienza con una variable que se instala como "Hola mundo". El cliente solicita la cadena del servicio y luego la devuelve.
  2. Luego, el servicio cambia una variable interna para que sea igual a la enviada por el cliente. Luego, el servicio agrega 2 al final, por lo que la variable ahora es "Hello World 2".
  3. El cliente solicita la cadena actualizada y obtiene Hello World 2.
  4. Otro usuario inicia sesión. Piden la cadena, esperando Hello World, pero obtienen Hello World 2. Ahora, cuando la devuelven, obtienen Hello World 2
    1. Este es un resultado indeseable y es lo que estoy tratando de evitar.

¿Cómo voy a hacer esto?

preguntado el 16 de mayo de 11 a las 18:05

No debería utilizar los servicios web ASMX a menos que no tenga otra opción. Todo nuevo desarrollo debe usar WCF. -

¿Qué tan difícil es el cambio? ¿Puedo seguir utilizando clientes SOAP en mis clientes ligeros? -

El cambio no es difícil. WCF es SOAP y mucho más: aproximadamente 100 veces más funcional que los servicios ASMX. Además, Microsoft ahora considera que ASMX es una "tecnología heredada". -

@John Saunders: o simplemente use MVC o IHttpHandlers para entregar datos estructurados, ni siquiera necesita una pila de servicios para muchas tareas en estos días. -

@Wyatt: eso depende de sus requisitos. Siempre ha sido posible usar HttpHandlers y, sin embargo, a menudo hay buenas razones para no hacerlo, razones como "no reinventar la rueda". -

2 Respuestas

Un WebService en ASP.NET funciona de manera muy similar a un centro de llamadas de servicio al cliente. El servidor ASP.NET mantiene un "grupo" de HttpApplications, cada una de las cuales representa una conexión a su servidor web a través de un navegador u otro programa, ya sea gestionando activamente una llamada de servicio o esperando recibir una. Cuando entra una llamada de servicio, se enruta a una instancia inactiva del grupo, que ejecuta el método especificado y devuelve el resultado que se transmite como una respuesta SOAP (o utilizando cualquier protocolo que haya configurado para su servicio). Luego, la clase de servicio vuelve a su estado inactivo. Su próxima llamada puede ser manejada por una instancia diferente de la clase de servicio ("su llamada se está transfiriendo al próximo representante disponible") que la que manejó su última llamada.

Para casi cualquier circunstancia, esta arquitectura está bien. Las instancias de clase de servicio pueden, como parte de su ejecución, leer y escribir en almacenes de datos centralizados a los que tienen acceso todas las demás instancias, siempre que (a.) Un método de servicio no necesite información especializada para producir la información correcta. responder, o (b.) el servicio puede obtener cualquier información especializada de este almacén de datos central, no importa qué instancia maneje cada llamada.

Sin embargo, los servicios también admiten el estado de la sesión. Un cliente puede ser dirigido a un servicio, darle alguna información para recordar sin escribirla en ningún lugar de forma centralizada, y luego tener que volver a llamar a esa misma instancia de servicio para darle más información antes de que se pueda llegar a un resultado determinado. Para hacer esto, el cliente solicita un identificador de sesión del servicio; básicamente como pedirle a un CSR en un call center su extensión directa. Se realiza algo de trabajo mientras está conectado, luego cada lado puede ir y hacer otro trabajo sin estar conectado, luego el cliente devolverá la llamada, proporcionará el identificador de sesión que se le dio y su próxima llamada de servicio será manejada por la instancia que manejó el última petición. Mientras un identificador de sesión esté pendiente, el servicio permanecerá inactivo en el grupo, "recordando" cualquier información que se le haya dado, hasta que el cliente con ese identificador de sesión diga que está hecho (cerrando la sesión), o el cliente no ha llamado volver en un momento dado (tiempo de espera).

contestado el 16 de mayo de 11 a las 22:05

De acuerdo, estoy todo convertido a WCF, pero no tengo este problema. stackoverflow.com/questions/6035981/… - Sobrecarga119

Si desea restablecer el estado para los nuevos clientes, debe realizar un seguimiento de los clientes que se han conectado y proporcionarles los datos de manera adecuada. Esto podría implicar que se requiera una llamada para configurar una sesión, de modo que pueda asignar y devolver un token al cliente, que luego se utiliza para todas las llamadas posteriores.

Una alternativa es escribir su servicio usando WCF y luego usar el PerSession InstanceContextMode, que construirá un nuevo objeto de servicio para cada sesión. En este caso, aún debe indicar qué llamadas comienzan una sesión y qué llamadas terminan una sesión. Para más, vea aquí.

contestado el 16 de mayo de 11 a las 22:05

He investigado la solución WCF, pero tengo problemas para informar al servicio cuándo finalizar una sesión. El usuario nunca termina realmente la sesión ya que mi página web tiene algunos formularios y botones en los que el usuario puede hacer clic y se supone que debe recuperar los datos del servidor. ¿Hay alguna forma de deshacerme de los datos solo cuando el usuario abandona la página web? - Sobrecarga119

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