Estoy desarrollando una solución basada en wcf para una capa de servicio web que utilizarán los dispositivos móviles "ocasionalmente conectados". El servicio no usará colas (en esta etapa) debido a las complejidades adicionales, por lo que en su lugar estará operando un enfoque simple de Solicitud / Respuesta.
Por supuesto, al ser un dispositivo móvil, es posible que los dispositivos se queden sin señal a mitad de la inserción / actualización. El servicio web en sí puede haber completado la transacción, pero el cliente nunca recibirá este mensaje. Debido a esto, reenviará la solicitud, momento en el cual el servidor debe reconocer esto como una solicitud duplicada y devolver la misma respuesta que intentó en primera instancia.
Por lo tanto, estoy tratando de hacer que los servicios sean Idempotentes. Para lograr esto, estoy implementando objetos DTO de parámetros de solicitud, que consisten en el RequestID, más los parámetros necesarios para completar la llamada.
Sin embargo, mi dificultad es implementar una forma de monitorear los identificadores de solicitud. Dado que el servicio no tiene estado actualmente, la única forma en que puedo imaginarlo es tener una tabla ServiceRequest en la base de datos, que tomará el RequestID como primario. Obviamente, consultar sobre esto indicará si la solicitud ya se ha procesado, ya que el cliente enviará el mismo RequestID. Pero el servicio también necesita saber qué mensaje devolver. En el caso de una inserción / actualización, el ID raíz agregado agregado también deberá almacenarse en algún lugar, ya sea directamente en la tabla de solicitud o en una tabla RequestToObjectLookup
Entonces, me pregunto si hay una mejor práctica para implementar esto. Mis pensamientos son tener una (s) tabla (s) de ServiceRequest (específica del servicio), que almacene requestids, información adicional y también una búsqueda del ID del objeto de resultado (en un guardar / insertar / actualizar). Entonces, cuando llega una nueva solicitud, esta tabla se puede consultar primero antes de continuar con el resto de la solicitud, ya sea para realizar el guardado o simplemente devolver el objeto actualizado anteriormente (que se realizó en el primer intento de solicitud).
También estoy pensando (como se dijo) que solo necesito mantener la identificación del agregado raíz referenciada con la solicitud, ya que solo debería poder usar las relaciones para obtener el resto de la información.
fuente