none
Web Service no permite llamadas simultáneas RRS feed

  • Pregunta

  • Hola!

    Primero decir que no sé muy bien si este hilo es el bueno para exponer mi pregunta, de no ser así agradecería que lo moviesen a un hilo más indicado. Gracias!

    Tengo una duda con un Web Service que he desarrollado en C#, Linq, SQl Server. Os lo detallo.

    1. Originalmente tengo un Web Service (llamemoslo WebServiceMaster) que Recibe unos datos X. 
    2. Esos datos X, tienen asociados archivos adjuntos que tengo que recuperar llamando a otro Web Service (llamemoslo WebServiceAdjuntos), este segundo Web Service no está implementado por mi.
    3. Debo almacenar tanto en BBDD, como en mi Sistema de Ficheros los registros y archivos obtenidos en los pasos anteriores.

    Cuerpo del WebServiceMaster:

    • Inserta en una tabla de Log.
    • Abre Trans
    • Inserta Registro
    • Accede a WebServiceAdjuntos1
    • Accede a WebServiceAdjuntos2
    • Almacena Ficheros recuperados en las llamadas WebServiceAdjuntos en la carpeta deseada.
    • Commit Trans
    • Si algo falla, Rollback y escribe en una fichero de texto lo que ha fallado.

    Perfecto! Hasta aquí todo bien. El problema viene cuando, la llamada al WebServiceAdjuntos falla, en ese caso el WebSercieMaster no debería dejar rastro alguno en mi BBDD, ya que al no tener los archivos oportunos sería información inconsistente. Para conseguir esto simplemente pongo todo el cuerpo del WebSericeMaster en una TRANSACCION, en caso de que falle algo, hago un Rollback.

    ¡Ojo¡ ¿Que sucede? Funciona para iteraciones simples, pero cuando se hacen llamadas concurrentes, esta TRANSACCION, me bloquea la BBDD y no me permite hacer llamadas concurrentes al WebServiceMaster, devolviendome TimeOut... Las llamadas al WebServiceAdjuntos no son muy costosas pero esos WebService no me fío de que estén accesibles permanentemente, de ahí vino en una fase anterior de este mismo desarrollo en crear la TRANSACCION. Esto supuso el que ser corrigiera el tener datos inconsistentes en BBDD pero me generó el problema de la concurrencia.

    ¿Alguna ida de como solucionar esto de forma elegante?

    Gracias, un abrazo!

    lunes, 20 de agosto de 2018 7:54

Respuestas

  • Hola Javi, gracias por la respuesta.

    El punto de abrir ahí la transacción, es porque necesito el ScopeIdentity de la primera inserción para nombrar los ficheros obtenido en las dos llamadas posteriores.

    De todas formas lo tendré en cuenta como solución y seguiré buscando.

    Saludos

    lunes, 20 de agosto de 2018 10:13

Todas las respuestas

  • Hola Roque;:

    Y porque no alteras el producto.

    • Inserta en una tabla de Log.
    • Accede a WebServiceAdjuntos1
    • Accede a WebServiceAdjuntos2
    • Almacena Ficheros recuperados en las llamadas WebServiceAdjuntos en la carpeta deseada.
    • Abre Trans
    • Inserta Registro
    • Commit Trans

    Suponiendo que los archivos, los depositas en archivos , ya que si los almacenas en BBDD iría dentro de trans.

    Independientemente de lo que suceda en tu petición al adjunto que ya tienes logueado por tanto hay un rastro, de la petición, es el WebServiceMaster cuando ha recuperado los archivos, el que hace la inserción en la base de datos.

    Un saludo

    lunes, 20 de agosto de 2018 8:26
  • Hola Javi, gracias por la respuesta.

    El punto de abrir ahí la transacción, es porque necesito el ScopeIdentity de la primera inserción para nombrar los ficheros obtenido en las dos llamadas posteriores.

    De todas formas lo tendré en cuenta como solución y seguiré buscando.

    Saludos

    lunes, 20 de agosto de 2018 10:13