Gracias Luis Ángel Pérez.

En el hilo, se explican 3 formas de convertir Objeto a JSON, ahora bien; ¿cuál de las 3 es la recomendada por Intersystems, la preferible y/o estándar y por qué?

Eduard Lebedyuk expone 2 alternativas:

1º Utilizar la clase "result set" para contener los resultados:

Para utilizar esta opción, se debe crear una clase que extienda de %RegisteredObject y %JSON.Adaptor que tenga propiedades para contar los resultados (count) y una lista de los mismos (results). Por ejemplo:

Class Test.JSONRS Extends (%RegisteredObject, %JSON.Adaptor)
{
Property count As %Integer;
Property results As list Of Book;
}

Luego, se puede convertir un objeto normal a un objeto dinámico y asignarlo a la propiedad results de la clase Test.JSONRS utilizando la función %ObjectToAET:

set dynObj = ##class(%ZEN.Auxiliary.altJSONProvider).%ObjectToAET(obj)
set resultSet = ##class(Test.JSONRS).%New()
set resultSet.count = <cantidad de resultados>
set resultSet.results = dynObj
set jsonString = resultSet.%ToJSON()

2º Utilizar un enfoque más simple:

En esta opción, se genera el JSON directamente utilizando la función %JSONExport para cada objeto y concatenando los resultados. Por ejemplo:

set jsonString = {"results": <cantidad de resultados>, "items": [
##class(%JSON.Adaptor).%JSONExport(obj1)_", "_##class(%JSON.Adaptor).%JSONExport(obj2)_", "_...]}

Este enfoque es más simple pero puede ser menos eficiente en términos de uso de memoria y tiempo de ejecución. Sin embargo, puede ser más adecuado para casos en los que se trabaja con un pequeño número de objetos.
 

Por otro lado, Muni Ganesh explica esta 3ª vía:

Emplear la función "%ToJSON()" para convertir el objeto "MainObj" a formato JSON y se imprime el resultado.
 

   set array=[]
   set obj = {}
   set obj.title="For Whom the Bell Tolls"
   set obj.author="Hemmingway"
   do array.%Push(obj)    

   set obj = {}
   set obj.title="The Invisible Man"
   set obj.author="Ellison"
   do array.%Push(obj)    

   set obj = {}
   set obj.title="Tender is the Night"
   set obj.author="Fitzgerald"
   do array.%Push(obj)    

 set arraylen=0 
 set iter = array.%GetIterator()
   while iter.%GetNext() {
      set arraylen=$I(arraylen)
   }
   
   set MainObj={}
   set MainObj.results=arraylen
   set MainObj.items=array
   
   w MainObj.%ToJSON()
----------------------------------------------------------------------------------------------------------------

Output:

{"results":3,"items":[{"title":"For Whom the Bell Tolls","author":"Hemmingway"},{"title":"The Invisible Man","author":"Ellison"},{"title":"Tender is the Night","author":"Fitzgerald"}]}

--------------------------------------------------------------------------------------------------------------------

Desarrollando una integración en el ámbito de la interoperabilidad sanitaria, en un Servicio REST ¿cuál es la forma aconsejada por ustedes en Intersystems para convertir Objeto a JSON?

¿Cuál de las 3 es la recomendada por Intersystems, la preferible y/o estándar y por qué?
 

Gracias, muchas gracias por leer y responder, un saludo.

Gracias Luis Ángel.

Cierto tienes razón; gracias por explicarlo.

Los campos de la cabecera de un mensaje HTTP son case-insensitive y que, por lo tanto, llegan a un ESB ya en minúsculas. Esto facilita el procesamiento de los mensajes y es una característica importante de este protocolo de comunicación web.

Aún seguimos sin encontrar respuesta a cómo conseguir que el ESB envíe una etiqueta XML vacía.

Es decir si enviamos desde SoapUI <datosAdicionales /> al enviarlo el ESB lo quita.

Hemos indagado instancialo vacío en el Servicio:

 if (solicitud.pdfFormulario.datosAdicionales.Size=0){
  $$$LOGALERT("Entran en if solicitud.pdfFormulario.datosAdicionales.Size=''")
  do pRequest.solicitud.pdfFormulario.datosAdicionales.Insert(##class(EsquemasDatos.AdministracionElectronica.PLATEA.v02r00.tns.campoType).%New())
  $$$LOGINFO("Al final del if: solicitud.pdfFormulario.datosAdicionales: "_pRequest.datosAdicionales.Size)
  }else{
  $$$LOGASSERT("Va por else")
  set pRequest.solicitud = solicitud 
  }

Y en la clase de los datos:

Parameter XMLIGNORENULL = 1; Parameter XMLUSEEMPTYELEMENT = 1;

Por favor, ¿nos podrían indicar pasos mediante los cuales indagar investigar depurar resolver solventar este reto?

Por compartir

hábitos que Tribu de Mentores recomienda para mejorar la salud, junto con su respectivo emoji:

  1. 🏃‍♀️ Hacer ejercicio regularmente: La actividad física es esencial para mantener una buena salud. No es necesario que te conviertas en un atleta de élite, pero sí es importante que hagas algo de ejercicio cada día. Caminar, correr, nadar, hacer yoga o levantar pesas son algunas opciones que puedes considerar.
  2. 🥗 Comer alimentos saludables: La comida que consumes es tu combustible para el día a día. Es importante que te asegures de estar comiendo alimentos que te den los nutrientes que necesitas para mantenerte saludable. Intenta incluir más frutas, verduras, proteínas magras y granos enteros en tu dieta.
  3. 🚭 Dejar de fumar: El tabaco es una de las principales causas de enfermedades en el mundo. Si eres fumador, dejar de fumar es una de las mejores cosas que puedes hacer por tu salud. Si no fumas, asegúrate de evitar el humo del cigarrillo y otros productos de tabaco.
  4. 💤 Dormir lo suficiente: El sueño es fundamental para la salud mental y física. Intenta dormir al menos 7 horas al día para que tu cuerpo y tu mente puedan recuperarse y rejuvenecerse. También es importante tener una rutina de sueño regular para que tu cuerpo se acostumbre a dormir y despertar a las mismas horas cada día.
  5. 🧘‍♀️ Reducir el estrés: El estrés crónico puede afectar negativamente tu salud. Es importante que encuentres formas de reducir el estrés en tu vida. La meditación, la respiración profunda, el yoga y el tai chi son algunas técnicas que puedes probar para reducir el estrés.

Para tratar de depurarlo por nosotros mismos hemos investigado los Parámetros XML que gestionan los nulos y vacíos: https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...

  • XMLUSEEMPTYELEMENT
  • XMLIGNORENULL
  • XMLNILNOOBJECT
  • XMLNIL

Por favor, ¿nos podrían indicar pasos mediante los cuales indagar investigar depurar resolver solventar este reto?

Como añadido extra por si nos apoyan compartimos:

Según el libro "Tribu de Mentores" de Tim Ferris, estos son los 7 hábitos que más contribuyen a mejorar el estado de ánimo y cuidar de la salud mental, física y personal integral de uno mismo:

  1. Meditación: 🧘‍♂️ La meditación es una práctica efectiva para reducir el estrés y la ansiedad, mejorar la concentración y la memoria, y aumentar la felicidad y la claridad mental. La meditación es una herramienta para fortalecer la atención y la introspección, y así, ayuda a la persona a entender mejor sus pensamientos y emociones.
  2. Ejercicio: 🏋️‍♀️ El ejercicio regular es fundamental para mantener una buena salud física y mental. Los beneficios del ejercicio incluyen la reducción del estrés y la ansiedad, la mejora del estado de ánimo, el aumento de la energía y la mejora de la calidad del sueño.
  3. Sueño: 💤 El sueño es esencial para el bienestar general, tanto físico como mental. La falta de sueño puede contribuir a la ansiedad, la depresión y la irritabilidad, así como a la disminución de la memoria y la concentración.
  4. Dieta saludable: 🥗 Una dieta equilibrada y saludable es fundamental para la salud física y mental. Los alimentos frescos y nutritivos pueden mejorar la concentración, la memoria y el estado de ánimo, y reducir el riesgo de enfermedades crónicas.
  5. Higiene personal: 🧼 La higiene personal es importante para la salud física y mental. Mantener una buena higiene personal puede reducir el riesgo de enfermedades, mejorar la autoestima y promover una sensación general de bienestar.
  6. Desconectar: 📵 Desconectar de las redes sociales, el correo electrónico y otras distracciones digitales puede ser beneficioso para la salud mental. Esto puede reducir la ansiedad y el estrés, mejorar la concentración y la productividad, y aumentar el tiempo libre y la creatividad.
  7. Tiempo en la naturaleza: 🌳 Pasando tiempo en la naturaleza puede ser beneficioso para la salud mental y física. Estar en la naturaleza puede reducir el estrés y la ansiedad, aumentar la energía y la vitalidad, y mejorar la salud cardiovascular.

Estos son algunos de los hábitos que más contribuyen a mejorar el estado de ánimo y cuidar de la salud mental, física y personal integral de uno mismo, según el libro "Tribu de Mentores" de Tim Ferris.

Adicionalmente hemos leído con atención:

https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI...

https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI...

https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI...

https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI...

https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...

https://community.intersystems.com/post/making-jwtoauth20

Sin embargo, sí seguimos con la misma cuestión:

¿Qué vía existe para "llamar", "invocar", "comunicar" desde los otros entornos ( por ejemplo INTEGRACION ) con el Servidor de Recursos de PREPRODUCCION con el fin de Validar el Token?

Es decir la pregunta de otra forma sería:

¿Qué mecanismo existe para desde un Entorno A (Integración) se comunique con un Entorno B (Preproducción) con la misión de Validar el Token desde el Entorno A empleando el Servidor de Recursos centralizados disponible en el Entorno B?

Muchísimas gracias por su atención, y gracias por sus respuestas.

Un saludo
 

Alberto, para añadir más detalles:

Puesto que los 2 son, Servicios.DICOM.VNAtoPACSImagenesMedicasv01r00 y Servicios.DICOM.MOVEImagenesMedicasv01r00 son de la clase: "EnsLib.DICOM.Service.TCP" con Adaptador: "EnsLib.DICOM.Adapter.TCP"

Se pueden unificar

Ahora bien, la cuestión a resolver es: ¿Qué es preferible 1 único Servicio donde se aúnan los FIND y MOVE/GET o 2 servicios con los FIND y MOVE/GET separados? ¿separados o juntos?

Lo que sin embargo el reto seria que necesitamos si o si que ambos servicios apunten a los 2 Procesos:

Es decir que en el Parámetro: "Nombre de configuración de destino dúplex" [Indicar los 2 procesos] por ejemplo: Procesos.DICOM.VNAtoPACSImagenesMedicasv01r00,DICOM Move Process

✍️📤Es decir: se enviarian los FIND a los 2 procesos por ejemplo:

 Procesos.DICOM.VNAtoPACSImagenesMedicasv01r00,DICOM Move Process

y los MOVE/GET también se enviarían indistintamente a los 2 procesos:

 Procesos.DICOM.VNAtoPACSImagenesMedicasv01r00,DICOM Move Process

🔎🔎

Además NO sería trivial el discriminar, y/o distinguir entre un DICOM con comando FIND de otro DICOM (MOVE/GET) puesto que previamente existe el establecer conexión, mediante "EnsLib.DICOM.Notify.Established"

También mencionar que el cribar un FIND de un MOVE/GET sería hacerlo mediante GetValueAt("CommandSet.AffectedSOPClassUID") = [Número del FIND/ Número del MOVE/GET]

Actualmente la foto del circuito es:

¿Qué es preferible 1 único Servicio donde se aúnan los FIND y MOVE/GET o 2 servicios con los FIND y MOVE/GET separados? ¿separados o juntos?

carteles vida fail desmotivaciones

Aunque quizá sea un poco subjetivo, nos gustaría conocer qué se recomienda

¿Qué es preferible 1 único Servicio donde se aúnan los FIND y MOVE/GET o 2 servicios con los FIND y MOVE/GET separados? ¿separados o juntos?
 

Muchas gracias de antemano Alberto, por leernos y respondernos.

Un saludo.
 

Buenos días Alberto:

Hemos estado trabajando con los GET.

Actualmente lo que hacemos es desde un Simulador origen dcm4che solicitar un get:

./getscu -b VNAPRE -c ESBPRE@XX.XXX.X.XXX:XXXX -m StudyInstanceUID="1.2.826.0.1.3680043.8.1055.1.20111102150758591.92402465.76095170" --store-tc "CTImageStorage:1.2.840.10008.1.2.4.91;1.2.840.10008.5.1.4.1.2.2.3,1.2.840.10008.1.2.1"  

El cual va mediante: ESBSSCC a otro ESBFUERTEV por su servicio dedicado:

Servicios.DICOM.MOVEImagenesMedicasv01r00
 
El cual tiene como clase:
 
EnsLib.DICOM.Service.TCP
 
Obteniendo así cada uno de los 361 estudios con ese StudyInstanceUID
 
Sin embargo se nos ha generado una duda.
Puesto que actualmente disponemos de 2 servicios,:

1 para los FIND "Servicios.DICOM.VNAtoPACSImagenesMedicasv01r00"

1 para los MOVE/GET "Servicios.DICOM.MOVEImagenesMedicasv01r00"

¿Qué es preferible 1 único Servicio donde se aúnan los FIND y MOVE/GET o 2 servicios con los FIND y MOVE/GET separados? ¿separados o juntos?

Buenos días Alberto,

Recientemente hemos estado indagando desarrollando y profundizando con DICOM para gestionar los FIND obteniendo el listado de imágenes médicas, con el objetivo de extraerlas desde los RISPACS hacia el ESB.

Alberto, agradeceríamos si nos puedes orientar y explicar lo siguiente: ¿estaría soportado realizar la Operacion Retrieve, en el ejemplo que nos explicas en el artículo actual?

La necesidad es el hecho de que quizá sería más apropiado en vez de guardar las imágenes DICOM mediante Move/Store; cachearlas, y trasladarlas desde los RISPACS (Sistemas Destinos) al Origen.

En concreto, lo que conocemos es:

🔎Query/Retrieve, or Q/R for short, is the DICOM service for searching images on the PACS and getting a copy of them to the workstation where they can be displayed.

Mientras que:

 📌C-MOVE is a DICOM command that means this: The calling AE (we) ask the called AE (the PACS) to send all the DICOM Instances that match the identifier to the target AE.

Parece que MOVE es enviar imágenes (guardándolas), mientras que Query/Retrieve es cachear (copiar) las imágenes DICOM.

Por favor, Alberto Fuentes; podrías indicarnos documentación referencias código ejemplos respecto a: ¿estaría soportado realizar la Operacion Retrieve, en el ejemplo que nos explicas en el artículo actual?

Muchas gracias de antemano por tu apoyo y respuestas.

Un saludo.

Hola Alberto,

Muchas gracias por tu ayuda

Hemos realizado lo que nos has recomendado:

Mostrar el contenido del DICOM mediante dcmdump:

  ./dcmdump "IImagen PatientID 732831 PatientName Milagros ReasonForStudy 350290  InstitutionName RISPACsCHUIMI   StudyDate 20220930.dcm"

Observamos el InstitutionName cumplimentado

632: (0008,0080) LO #14 [RISPACsCHUIMI] InstitutionName

Además, Alberto, hemos realizado los apartados 2 al 4 que has indicado, para generar un Servicio de Lectura de Ficheros DICOM puro.

De esta manera se muestra el InstitutionName con su valor correspondiente en el ESB:

(0008,0080) InstitutionName RISPACsCHUIMI

Alberto ¿de qué manera nos recomiendas, suguieres, expones continuar indagando?

¿Es el simulador, el cual está manipulando los campos de datos del DICOM en el envío?

Para construir el repositorio BBDD simulada empleamos:

./dcmdir -c ./shared/dicom/CHUIMI/DICOMDIR --fs-id SAMPLEDICOMS --fs-desc ./shared/dicom/CHUIMI/descriptor ./shared/dicom/CHUIMI

Una vez generada, iniciamos el repositorio a partir de la BBDD previa:

./dcmqrscp --ae-config ./shared/dicom/CHUIMI/ae.properties -b VNAPRE:11110 --dicomdir ./shared/dicom/CHUIMI/DICOMDIR  

Y para llevar a cabo el FIND empleamos:

./findscu -b VNAPRE -c ESBPRE@10.136.4.141:19586 -m PatientID=12989575 -m PatientName="Milagros" -r StudyInstanceUID -r PatientName -r StudyDate -r InstitutionName -r ReasonForStudy

Alberto ¿de qué manera nos recomiendas depurar para profundizar en las causas y resolver la situación?

Muchas gracias de antemano

Un saludo

Hola Alberto,

Gracias por indicarme los recursos y sobre todo agradezco que me especificaras en concreto qué propiedades aportan en este caso.

He configurado:

Seguimiento del nivel de detalle = 2

ARTIM = 20

TXTIM = 20

Y ahora sí se recibe la respuesta del Establecer conexión desde el Simulador ( Destino ) hacia la Operacion TCP Dicom ( Receptora )

Lo que sí es cierto, resulta que ocurre la excepción de forma similar, casi igual en el paso [6]; justo antes de recibir la Notificación de Conexión establecida por parte del SIMULADOR dcm4che hacia la Operacion del ESB:

  ERROR <Ens>ErrBPTerminated: Finalizando BP DICOM Move Process # debido a un error: ERROR <Ens>ErrException: <READ>zAcceptPDU+4^EnsLib.DICOM.Adapter.TCP.1 -- - registrado como '-' número - @''
> ERROR <Ens>ErrException: <READ>zAcceptPDU+4^EnsLib.DICOM.Adapter.TCP.1 -- - registrado como '-' número - @''

Lo más acuciante e intrigante es el hecho de que el Simulador dcm4che que replica ser un Sistema ORIGEN (envía al servicio) se queda a la escucha, tras haber enviado el C-MOVE-RQ:

Y el simulador que actúa como DESTINO se queda en el estado de Asociación Establecida, sin embargo no le llega efecitamente el C-MOVE-RQ, lo cual es muy llamativo :

¿ De qué forma nos recomiendan depurar ?

Muchas gracias de antemano por su tiempo, por leerme y responder. Un saludo

Hola Alberto,

Gracias por tu respuesta y tiempo, Alberto

Hemos escrito al inicio del método:

set ^zdebug($i(^zdebug))="["_$zdt($zts,3,,2)_"] "_"before" 

y al final del método:

set ^zdebug($i(^zdebug))="["_$zdt($zts,3,,2)_"] "_"after. tSC="_tSC 

En PREproducción observamos:

zw ^zdebug
^zdebug=2
^zdebug(1)="[2022-06-03 08:52:17.11] before"
^zdebug(2)="[2022-06-03 08:52:17.11] after. tSC=1"

En INTegración ocurre similar:

zw ^zdebug
^zdebug=2
^zdebug(1)="[2022-06-03 08:53:43.77] before"
^zdebug(2)="[2022-06-03 08:53:43.78] after. tSC=1"

¿De qué forma nos recomiendas, Alberto, continuar?

Gracias Alberto por tu asistencia y tiempo

Un saludo

Es de agradecer, Alberto, tu respuesta, y sobre todo las explicaciones y enlaces

A continuación te detallamos la situación, Alberto, para que ustedes nos indiquen, ordenen, recomienden, sugieran vías o formas de continuar:

A continuación, se muestran las trazas del WireShark

Primero observamos la traza Simulada desde Línea de Comandos mediante:

./findscu -b VNAPRE -c ESBPRE@10.136.4.142:19586 -m PatientID="102030" -M StudyRoot

Segundo se muestra la traza Real desde Sistema Origen hacia Sistema Destino:

La principal diferencia radica en la petición, la cual está en 1 único paquete en la Simulada, el cual está titulado como:

1072 … P-DATA, C-FIND-RQ ID=1, C-FIND-RQ-DATA

Sin embargo, en la real, la petición consta de 2 paquetes:

1904 … P-DATA, C-FIND-RQ ID=1

1906 … P-DATA, C-FIND-RQ-DATA

 

Ahondando en el detalle, comparamos la primera de las peticiones titulada como: “P-DATA, C-FIND-RQ ID=1

En la Simulada se observa lo siguiente:

Donde cabe destacar estos 2 contenidos del conjunto de comandos (Command, Last Fragment):

    (0000,0700)          2 Priority                                      0

    (0000,0800)          2 Command Data Set Type                         0

 

Los cuales en la Real son distintos:

    (0000,0700)          2 Priority                                      2

    (0000,0800)          2 Command Data Set Type                         1

 

Además, también es importante recalcar que en la segunda petición reseñada como “P-DATA, C-FIND-RQ-DATA” existen diferencias:

En la Real es más completa:

PDV, C-FIND-RQ-DATA

    PDV Length: 130

    Context: 0x01 (Implicit VR Little Endian: Default Transfer Syntax for DICOM, Study Root Query/Retrieve Information Model - FIND)

    Flags: 0x02 (Data, Last Fragment)

    (0008,0005)          0 Specific Character Set                        <Empty>

    (0008,0020)          0 Study Date                                    <Empty>

    (0008,0030)          0 Study Time                                    <Empty>

    (0008,0050)          0 Accession Number                              <Empty>

    (0008,0052)          6 Query/Retrieve Level                          STUDY

    (0008,0061)          0 Modalities in Study                           <Empty>

    (0008,0090)          0 Referring Physician's Name                    <Empty>

    (0008,1010)          0 Station Name                                  <Empty>

    (0008,1030)          0 Study Description                             <Empty>

    (0010,0010)          0 Patient's Name                                <Empty>

    (0010,0020)          2 Patient ID                                    9

    (0010,0030)          0 Patient's Birth Date                          <Empty>

    (0010,0040)          0 Patient's Sex                                 <Empty>

    (0020,000d)          0 Study Instance UID                            <Empty>

    (0020,0010)          0 Study ID                                      <Empty>

Sin embargo, en la Simulada únicamente existen 2 datos:

PDV, C-FIND-RQ-DATA

    PDV Length: 30

    Context: 0x01 (Implicit VR Little Endian: Default Transfer Syntax for DICOM, Study Root Query/Retrieve Information Model - FIND)

    Flags: 0x02 (Data, Last Fragment)

    (0008,0052)          6 Query/Retrieve Level                          STUDY

    (0010,0020)          6 Patient ID                                    102030

 

 

Por otro lado, lo que nos genera mayor inquietud, nos pone en vilo, y es extraño, resulta ser las discrepacias entre los resultados de los estudios médicos obtenidos mediante servicio ‘interno’ y mediante ‘simulación por herramienta externa’ hacia el Servicio TCP de DICOM

 

En concreto cuando ejecutamos desde la “Salida” del “Studio” de ESBPRE lo siguiente:

do ##class(DICOM.BS.QueryService).TestFind("102030")

 

Se envía la petición:

Y para cada uno de los 3 estudios médicos respondidos por el Sistema Destino, obtenemos datos completos:

 

Mientras que cuando simulamos ser Sistema Origen, gracias a la herramienta ‘findscu’ de Línea de Comandos, ejecutamos:

./findscu -b VNAPRE -c ESBPRE@10.136.4.142:19586 -m PatientID="102030" -M StudyRoot

Generándose la petición siguiente en la traza:

Si prestamos atención a la imagen anterior, se visualiza que únicamente se remiten 2 filas en el “DataSet”, las cuales corresponden a: ‘QueryRetrieveLevel’ y ‘PatientID’

 

Siendo la respuesta por parte del Sistema Origen con 3 estudios médicos, donde únicamente se incluyen 3 filas en el DataSet:

 

Las cuales corresponden al: ‘QueryRetrieveLevel’, ‘RetrieveAETitle’ y ‘PatientID’

 

De esta forma observamos grandes diferencias entre la respuesta generada por el Sistema Destino, cuando enviamos desde nuestro servicio interno, frente a cuando remitimos la consulta simulando ser sistema origen por TCP de DICOM

 

¿ustedes cómo recomiendan continuar?

 

Muchas gracias, Alberto, por leer, responder, y tomar su tiempo para atendernos

 

Gracias a ustedes por indicarnos, ordenarnos, recomendarnos, sugerirnos, técnicas, documentación, ejemplos; mediante los cuales investigar, depurar, indagar esta cuestión

 

Un saludo

Hola Alberto,

gracias por responder, porque es un apoyo, alivio, auxilio y aporte tus indicaciones, instrucciones y ejemplos

Siguiendo tus indicaciones ubicadas en el ejemplo: https://github.com/intersystems-ib/iris-dicom-sample
Hemos realizado 2 pruebas:

Primera prueba: tratamos de guardar DICOM

Siguiendo el ejemplo 1: https://github.com/intersystems-ib/iris-dicom-sample#receiving-dicom-with-embedded-pdf

Circuito:

Siendo la respuesta del sistema destino:

                ERROR <EnsDICOM>PeerRejectedAssociation: La contraparte ha rechazado la asociación. Fuente: '' Motivo: ''

Además, realizamos una segunda prueba

Segunda prueba: Consultar y Recuperar, Query / Retrieve: https://github.com/intersystems-ib/iris-dicom-sample#query--retrieve-scenario

Siendo la respuesta por parte del sistema destino:

ERROR <Ens>ErrBPTerminated: Finalizando BP DICOM Query Process # debido a un error: ERROR <EnsDICOM>PeerRejectedAssociation: La contraparte ha rechazado la asociación. Fuente: '%1' Motivo: '%2'
> ERROR <EnsDICOM>PeerRejectedAssociation: La contraparte ha rechazado la asociación. Fuente: '%1' Motivo: '%2'

¿ de qué manera, Alberto, nos recomiendan ustedes depurar, buscar, investigar, indagar el porqué de estas 2 excepciones ?

¿ mediante qué mecanismo, o cuál sería tu proceso mental y toma de acciones para organizar, ordenar, entender y sobre todo seguir y dar con la causa de estas excepciones ?

¿ cuál sería la vía correcta para entender, atender, depurar, corregir, y comprender mejor este tipo de integraciones, Alberto ?

Muchas gracias por leer y responder, porque es un gran espaldarazo, auxilio y aporte el hecho de que nos hagas seguimiento y nos vayas indicando, ordenando, explicando, cómo continuar, o en qué ejemplos basarnos

Un saludo

Hola Alberto,

Gracias por responder y explicar

Una duda:

¿el uso de las herramientas que comentas es posible para la version HS2017?

¿cual es la versión mínima IRIS para ello?

Lo preguntamos por dos motivos:

Primero: estamos desarollando en:

"" Cache for UNIX (Red Hat Enterprise Linux for x86-64) 2017.2.1 (Build 801_3_18358U) Tue Jul 24 2018 16:36:10 EDT""

Segundo: se presenta el reto o desafío de emplear el simulador para probar DICOM dcm4che

Gracias por responder

Disculpen, había cometido un error

Necesitamos usar el mecanismo llamado "Attachment" para enviar el fichero como un adjunto en la petición SOAP; y no el mecanismo alternativo, conocido como "MTOM"

Hemos añadido las siguientes líneas en el Cliente Web:

Set file=##class(%Library.FileCharacterStream).%New()
 Set file.Filename="application.zip"
 
 while (fichero.AtEnd '= 0){
     do file.Write($system.Encryption.Base64Decode(fichero.Read()))
 }
 
 Set mim

epart=##class(%Net.MIMEPart).%New()
 Set mimepart.Body=file
 Do mimepart.SetHeader("Content-Disposition", "attachment; name=""application.zip""")

do ..Attachments.Insert(mimepart)

Siguiendo la documentación:

Using SOAP with Attachments: Web Client

¿Qué podría significar que el sistema destino nos devuelva un código http 511?

     ERROR #6242: La solicitud HTTP a SOAP WebService ha devuelto un estado inesperado: 511.

Parece que podría indicar lo siguiente:

"El código de estado de respuesta HTTP 511 Network Authentication Required indica que el cliente necesita autenticarse para obtener acceso a la red."

En estos casos, ¿qué se suele necesitar?

En el LOGSOAP veríamos:

10/15/2021 15:51:56 *********************
Output from Web client with SOAP action = http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero
----boundary1980.3529411764705881780.294117647058824--
Content-Type: text/xml; charset="UTF-8"
Content-Transfer-Encoding: 8bit

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema' xmlns:wsa='http://www.w3.org/2005/08/addressing'>
    <SOAP-ENV:Header>
        <wsa:Action>cargarFichero</wsa:Action>
        <wsa:MessageID>7148b7422dc711eca7e1005056b672a4</wsa:MessageID>
        <wsa:ReplyTo>
            <wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address>
        </wsa:ReplyTo>
        <wsa:To>https://regvacu-svc-pre.sns.gob.es/sssns/regvacu-bus-r01/PS/CCAA/Canarias/RegVacu_PS?wsdl</wsa:To>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <CargarFicheroVacuRequest xmlns="http://ws.regvacuWs.ms.es/regvacu/ws/FicheroVacuService">
            <fichero>
                <![CDATA[;;;47B7F6BF1C6D7174A920B3...;12010070;]]>
            </fichero>
            <ccaaId>01</ccaaId>
            <tipoFichero>2</tipoFichero>
        </CargarFicheroVacuRequest>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
----boundary1980.3529411764705881780.294117647058824--
Content-Disposition: attachment; name="application.zip"


----boundary1980.3529411764705881780.294117647058824----


10/15/2021 15:51:56 *********************
Input to Web client with SOAP action = http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero

ERROR #6242: La solicitud HTTP a SOAP WebService ha devuelto un estado inesperado: 511.
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
    <soapenv:Body/>
</soapenv:Envelope>**** SOAP client return error. method=cargarFichero, action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero
     ERROR #6242: La solicitud HTTP a SOAP WebService ha devuelto un estado inesperado: 511.

¿se implementaría una autenticación desde nuestra Operacion SOAP o Cliente Web, hacia el sistema destino?

¿qué recomiendan ustedes?

¿cómo continuaríamos? ¿cuáles son los siguientes pasos?

Gracias por leernos, y por su ayuda con las respuestas