Pregunta
· 14 oct, 2021

¿Cómo podríamos usar MTOM para enviar un zip con un csv adentro?

En primer lugar, gracias por su tiempo leyendo esta pregunta y gracias por su ayuda.

Tenemos el siguiente caso de uso: necesitaríamos enviar con MTOM un zip que contenga un csv

 

Hemos leído, investigado, indagado:

https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls...

https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls...

https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls...

 

Necesitaríamos replicar cómo SOAPUI envía un zip con un csv como archivo adjunto en una solicitud SOAP, empleando Ensemble

Siendo la petición raw de la siguiente manera:

¿Podrían ayudarnos o indicarnos la documentación necesaria, ejemplos de código o proyectos de Ensemble para estudiar, comprender y desarrollar este comportamiento? 💭

¿Hay algunos ejemplos de código o documentación que nos pueda ayudar? 💭

 

Gracias por su tiempo, respuestas y ayuda.

$ZV: 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
Comentarios (9)2
Inicie sesión o regístrese para continuar

Hola Yone,

Entiendo que quieres implementar un cliente de WebService en Ensemble que utilice MTOM.

Supongo que ya tienes creado el cliente de WebService, el Business Operation y los Mensajes a partir del WSDL del WebService.

¿Has probado a sobreescribir el parámetro MTOMREQUIRED del cliente web y activarla?

En Using MTOM for Attachments. Webclient, tienes un ejemplo de un cliente de servicio web que al invocarlo activa la propiedad MTOMRequired y donde además ha cambiado los tipos de datos por derivados de %Stream:

Hola Alberto, gracias por responder porque nos apoya y orienta lo que nos explicas, en concreto el ejemplo de la documentación y las dos indicaciones a implementar

Hemos escrito el siguiente WebService:

Class WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP Extends %SOAP.WebClient [ ProcedureBlock ]
{

// Parameter LOCATION = "https://regvacube.sns.gob.es/regvacu/ws/FicheroVacuService";

/// This is the URL used to access the web service.
/// This is the namespace used by the Service
Parameter NAMESPACE = "http://ws.regvacuWs.ms.es/regvacu/ws/FicheroVacuService";

///  20/09/21 Cambiamos a 0, con el objetivo de quitar el xsi:type
Parameter OUTPUTTYPEATTRIBUTE = 0;

/// Determines handling of Security header.
Parameter SECURITYIN = "ALLOW";

/// This is the name of the Service
Parameter SERVICENAME = "FicheroVacuService";

// Parameter SOAPVERSION = 1.2;

Parameter SOAPVERSION = 1.1;

/// This is the SOAP version supported by the service.
Parameter MTOMREQUIRED = 1;

// Method cargarFichero(fichero As %xsd.base64Binary(REQUIRED=1), ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]

// Method cargarFichero(fichero As %GlobalBinaryStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]

/// 15 10 21 Edu explica que el fichero, el .zip con un .csv necesitamos enviarlo SIN CODIFICAR
/// quitamos %GlobalBinaryStream y ponemos %GlobalCharacterStream
///
Method cargarFichero(fichero As %GlobalCharacterStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]
{
  //Header - Addresing
 set addressing = ..crearAddressing()
 
 set addressing.Action = "cargarFichero"
 
 set ..AddressingOut                = addressing
 set ..AddressingOut.mustUnderstand = "1"

 //Firma el XML (mensaje SOAP)
 //do ..crearSignature()
 
 set ..MTOMRequired=1
 
 //24 09 21 para añadir parametro name en cabecera content type
 //set ..ContentType="application/octet-stream; name=nombre"
 
 //28 09 21 probamos a ajustarlo
 //set ..ContentType="application/octet-stream; charset=latin1"
 set ..ContentType="application/xhtml+xml; charset=latin1"
 
 /*
     27 09 21 con el objetivo de poner parametro name en cabecera content type
     Genera excepcion:      ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1
 */
 //set ..HttpRequest.ContentType="application/octet-stream; name=nombre"
 //do ..HttpRequest.SetHeader("name","nombre")
 
 Quit ..WebMethod("cargarFichero","CargarFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero",.fichero,.ccaaId,.tipoFichero)
}

Method infoFichero(ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), infoFichero As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(REQUIRED=1), Output estado As EsquemasDatos.HistoriaClinica.tns.EstadoFicheroType(REQUIRED=1)) As %xsd.base64Binary(XMLNAME="fichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]
{
 set ..MTOMRequired=1    
 Quit ..WebMethod("infoFichero","InfoFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/infoFichero",.ccaaId,.infoFichero,.estado)
}

Method crearAddressing() As %SOAP.Addressing.Properties
{
    set IPRedSanitaria = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","IPRedSanitaria")
     set puertoRespuestas = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","PuertoRespuestasSSL")
     set ReplyTo = ##class(%SOAP.Addressing.EndpointReference).%New()
     set ReplyTo.Address = "http://www.w3.org/2005/08/addressing/anonymous"
     //set ReplyTo.Address = "https://"_IPRedSanitaria_":"_puertoRespuestas_"/csp/SNS/Servicios.ProgramasAsistenciales.SIFCOv02r00.cls"
     set MessageId = ##class(Util.FuncionesComunes).getUID()
     
     set addressing = ##class(%SOAP.Addressing.Properties).%New()
     set addressing.MessageId = MessageId
     set addressing.Destination = ..Location
     set addressing.ReplyEndpoint = ReplyTo    
          
     Quit addressing
}

Method crearSignature() As %XML.Security.Signature
{
       //Generamos el Binary Security Token a partir del mcertificado
     set x509alias = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","aliasCertMSSSI")
    set pwd = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","pwdCertMSSSI")
    set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias,pwd)
    set token = ##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(cred)
    
    //Creamos la firma
    //set sig1=##class(%XML.Security.Signature).CreateX509(token,,$$$KeyInfoX509IssuerSerial)
    //set sig2=##class(%XML.Security.Signature).CreateX509(token,$$$SOAPWSIncludeSoapBody,$$$SOAPWSReferenceDirect)
    set sig2=##class(%XML.Security.Signature).CreateX509(token,$$$SOAPWSIncludeDefault,$$$SOAPWSReferenceDirect)
    
    //do sig1.SetSignatureMethod($$$SOAPWSrsasha1)
    do sig2.SetSignatureMethod($$$SOAPWSrsasha1)
    //do sig1.SetDigestMethod($$$SOAPWSsha1)
    do sig2.SetDigestMethod($$$SOAPWSsha1)
    
    //Creamos la referencia al id del token generado a partir de la firma
    //set algorithm=$$$SOAPWSEnvelopedSignature_","_$$$SOAPWSc14n
    set reference=##class(%XML.Security.Reference).Create(token.Id)
    do sig2.AddReference(reference)
    
    //Crear TimeStamp
    Set timestamp=##class(%SOAP.Security.Timestamp).Create()
    
    //Se une
    //do ..SecurityOut.AddElement(sig1)
    do ..SecurityOut.AddToken(token)
    do ..SecurityOut.AddElement(sig2)    
    Do ..SecurityOut.AddToken(timestamp)
}

}

El sistema destino, nos pide por favor, que implementemos un WebService con MTOM y que envie los zip con csv de la siguiente forma:

Al importar el WSDL del sistema destino, se nos generó la cabecera del método "cargarFichero" con "fichero" como un "%xsd.base64Binary"

Siguiendo tus indicaciones, hemos cambiado fichero por "%GlobalCharacterStream"

De esta forma se envía el fichero, el csv, sin codificar, dentro de un CDATA

Siendo la respuesta del sistema destino:

10/15/2021 08:57:24 *********************
Input to Web client with SOAP action = http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero
--MIME_Boundary
Content-ID: <root.message@cxf.apache.org>
Content-Type: application/xop+xml; type="text/xml"; charset=utf-8
Content-Transfer-Encoding: 8bit

        <?xml version="1.0" encoding="UTF-8"?>
        <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body>
                <soap:Fault>
                    <faultcode>soap:Server</faultcode>
                    <faultstring>Name must not be null</faultstring>
                </soap:Fault>
            </soap:Body>
        </soap:Envelope>

--MIME_Boundary--

---------------
Validate Security header: action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero, MethodName=cargarFichero
**** SOAP client return error. method=cargarFichero, action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero
     ERROR #6248: La respuesta de SOAP es un error de SOAP: faultcode=Server
faultstring=Name must not be null
faultactor=
detail=

Sin embargo, como observamos en la primera imagen, el sistema destino necesitaría, requeriría, que le enviemos el fichero codificado en binario, ya que pone:

Content-Transfer-Encoding: binary

Cuando adaptamos el fichero para que sea "%GlobalBinaryStream" vemos la siguiente traza, donde sí se codifica en binario:

Al enviar codificado en binario, el sistema destino también responde:

09/28/2021 16:56:43 *********************
Input to Web client with SOAP action = http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero
--MIME_Boundary
Content-ID: <root.message@cxf.apache.org>
Content-Type: application/xop+xml; type="text/xml"; charset=utf-8
Content-Transfer-Encoding: 8bit

            <?xml version="1.0" encoding="UTF-8"?>
            <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
                <soap:Body>
                    <soap:Fault>
                        <faultcode>soap:Server</faultcode>
                        <faultstring>Name must not be null</faultstring>
                    </soap:Fault>
                </soap:Body>
            </soap:Envelope>

--MIME_Boundary--

---------------
Validate Security header: action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero, MethodName=cargarFichero
**** SOAP client return error. method=cargarFichero, action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero
     ERROR #6248: La respuesta de SOAP es un error de SOAP: faultcode=Server
faultstring=Name must not be null
faultactor=
detail=

En resumen, el sistema destino necesita de nosotros: "añadir el parámetro “name” dentro de la cabecera “Content-Type” al adjuntar el archivo. Vuestro cliente debería generar dicho parámetro para no obtener dicho error."

Siendo la comparativa completa entre lo enviado por ensemble (sin el parámetro "name", por lo tanto es incorrecto) a la izquierda; y lo generado por el SoapUI (con el parámetro name, correcto), a la derecha:


 

Por favor, ustedes ¿podrían indicarnos ejemplos, documentación, proyectos, código, que nos sirva de referencia para indagar, investigar y completar el desarrollo?

Además hemos investigado las siguientes respuestas:

https://community.intersystems.com/post/add-parameter-name-inside-conten...

Muchas gracias por su tiempo, leyendo y respondiendo, gracias

Hola de nuevo Yone,

Por lo que comentas, quizá te falte añadir la cabecera Content-Disposition en la petición y ahí especificar el nombre del archivo.

Creo que en el ejemplo que habías hecho originalmente con SoapUI, esa cabecera tenía este valor:

Content-Disposition: attachment; name="application.zip"

En Fine Tuning a WebClient te habla de cómo puedes especificar cabeceras en tu cliente web utilizando el método SetHttpHeader() que hereda de %SOAP.WebClient.

Así que puedes probar a especificar con SetHttpHeader() la cabecera Content-Disposition y añadir el nombre del fichero que quieras que aparezca.

Gracias por responder Alberto,

es un apoyo, alivio y ayuda, la orientación que nos ofreces

Siguiendo tu criterio, y la explicación de la documentación, hemos añadido:

do ..SetHttpHeader("Content-Disposition","application.zip")

La línea la hemos escrito antes de:

Quit ..WebMethod("cargarFichero","CargarFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero",.fichero,.ccaaId,.tipoFichero)

Al capturar el LOGSOAP observamos que se queda sin incluir la cabecera Content-Disposition y el nombre application.zip en lo que enviamos:

¿Por qué podría ser que al escribir la línea, se quede sin incluir la nueva cabecera Content-Disposition y el nombre del fichero application.zip? 💭🤔
 

Además, en otras pruebas, hemos escrito 3 formas adicionales, para tratar de resolverlo:

set ..ContentType="application/octet-stream; name=nombre"

Mediante la línea anterior, no se ve que añada el parámetro "name"

Probamos con la siguiente línea y generaría excepción Ensemble:

set ..HttpRequest.ContentType="application/octet-stream; name=nombre"

Genera excepcion:      ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1

y mediante:

do ..HttpRequest.SetHeader("name","nombre")

Nos da excepción también:

ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1

La clase completa que hemos escrito del Servicio Web es:

Class WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP Extends %SOAP.WebClient [ ProcedureBlock ]
{

// Parameter LOCATION = "https://regvacube.sns.gob.es/regvacu/ws/FicheroVacuService";

/// This is the URL used to access the web service.
/// This is the namespace used by the Service
Parameter NAMESPACE = "http://ws.regvacuWs.ms.es/regvacu/ws/FicheroVacuService";

///  20/09/21 Cambiamos a 0, con el objetivo de quitar el xsi:type
Parameter OUTPUTTYPEATTRIBUTE = 0;

/// Determines handling of Security header.
Parameter SECURITYIN = "ALLOW";

/// This is the name of the Service
Parameter SERVICENAME = "FicheroVacuService";

// Parameter SOAPVERSION = 1.2;

Parameter SOAPVERSION = 1.1;

/// This is the SOAP version supported by the service.
Parameter MTOMREQUIRED = 1;

// Method cargarFichero(fichero As %xsd.base64Binary(REQUIRED=1), ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]

// Method cargarFichero(fichero As %GlobalBinaryStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]

/// 15 10 21 Edu explica que el fichero, el .zip con un .csv necesitamos enviarlo SIN CODIFICAR
/// quitamos %GlobalBinaryStream y ponemos %GlobalCharacterStream
///
Method cargarFichero(fichero As %GlobalCharacterStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]
{
  //Header - Addresing
 set addressing = ..crearAddressing()
 
 set addressing.Action = "cargarFichero"
 
 set ..AddressingOut                = addressing
 set ..AddressingOut.mustUnderstand = "1"

 //Firma el XML (mensaje SOAP)
 //do ..crearSignature()
 
 set ..MTOMRequired=1
 
 //24 09 21 para añadir parametro name en cabecera content type
 //set ..ContentType="application/octet-stream; name=nombre"
 
 //28 09 21 probamos a ajustarlo
 //set ..ContentType="application/octet-stream; charset=latin1"
 //set ..ContentType="application/xhtml+xml; charset=latin1"
 
 /*
     27 09 21 con el objetivo de poner parametro name en cabecera content type
     Genera excepcion:      ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1
 */
 //set ..HttpRequest.ContentType="application/octet-stream; name=nombre"
 //do ..HttpRequest.SetHeader("name","nombre")
 
 
 /*
 15 10 21 seguimos la indicacion de Alberto Fuentes:
     ➕ añadir la cabecera Content-Disposition en la petición y ahí especificar el nombre del archivo.
     https://es.community.intersystems.com/post/%C2%BFc%C3%B3mo-podr%C3%ADamos-usar-mtom-para-enviar-un-zip-con-un-csv-adentro#comment-169536
     https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GSOAP_cli_details#GSOAP_cli_details_http_headers
 */
 do ..SetHttpHeader("Content-Disposition","application.zip")
 
 Quit ..WebMethod("cargarFichero","CargarFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero",.fichero,.ccaaId,.tipoFichero)
}

Method infoFichero(ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), infoFichero As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(REQUIRED=1), Output estado As EsquemasDatos.HistoriaClinica.tns.EstadoFicheroType(REQUIRED=1)) As %xsd.base64Binary(XMLNAME="fichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]
{
 set ..MTOMRequired=1    
 Quit ..WebMethod("infoFichero","InfoFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/infoFichero",.ccaaId,.infoFichero,.estado)
}

Method crearAddressing() As %SOAP.Addressing.Properties
{
    set IPRedSanitaria = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","IPRedSanitaria")
     set puertoRespuestas = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","PuertoRespuestasSSL")
     set ReplyTo = ##class(%SOAP.Addressing.EndpointReference).%New()
     set ReplyTo.Address = "http://www.w3.org/2005/08/addressing/anonymous"
     //set ReplyTo.Address = "https://"_IPRedSanitaria_":"_puertoRespuestas_"/csp/SNS/Servicios.ProgramasAsistenciales.SIFCOv02r00.cls"
     set MessageId = ##class(Util.FuncionesComunes).getUID()
     
     set addressing = ##class(%SOAP.Addressing.Properties).%New()
     set addressing.MessageId = MessageId
     set addressing.Destination = ..Location
     set addressing.ReplyEndpoint = ReplyTo    
          
     Quit addressing
}

}

¿Cómo podríamos indagar, depurar, ajustar, y resolver juntos, esta situación?

Si nos pudieran orientar, se los agradeceríamos 🙇‍♂️🙏🙏

¿Cómo recomendarían ustedes seguir?

¿Qué documentación necesitamos estudiar, leer, entender, para completar esta parte?

Gracias por las respuestas

Hola Yone,

En principio el ..SetHttpHeader() debería ser suficiente.

Puedes probar con:

do ..SetHttpHeader("Content-Disposition", "attachment; name=""application.zip""")

¿El Servicio Web sigue devolviendo un error respecto al Name?

Supongo que estás utilizando ^ISCSOAP para examinar lo que se envía al WebService. Dependiendo de tu versión de Ensemble o Health Connect podrás utilizar las opciones de ISCSOAP para que te muestre las cabeceras HTTP:

set ^ISCSOAP("Log")="ioshH"
set ^ISCSOAP("LogFile")="/tmp/soap.log"

Aquí en InterSystems IRIS SOAP Log te explica las diferentes opciones. Comprueba en la documentación de tu versión específica si están las opciones para las cabeceras HTTP y así asegurarte de que se muestran.

He hecho una prueba rápida en una 2020.1 y en el log de ISCSOAP debería tener una pinta así:

10/15/2021 13:39:51 *********************
Output from Web client with SOAP action = 
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mensaje SOAP que se haya enviado -->


**** Output HTTP headers for Web Client
User-Agent: Mozilla/4.0 (compatible; InterSystems IRIS;)
Host: xyz.es
Accept-Encoding: gzip
Content-Disposition: attachment; name="application.zip"
SOAPAction: 

Si en tu versión no se pueden mostrar las cabeceras en el log quizá puedes utilizar herramientas externas como WireShark, etc.

Échale un vistazo a esto, y si no logras avanzar escríbeme por correo y quedamos y lo revisamos.

Gracias Alberto por tu respuesta y por dedicarnos tu tiempo,

Hemos añadido:

do ..SetHttpHeader("Content-Disposition", "attachment; name=""application.zip""")

Activamos el LOGSOAP:

set ^ISCSOAP("Log")="ioshH"

set ^ISCSOAP("LogFile") = "/opt/contenedor/15 10 21 3 Content-Disposition attachment name Cargar Fichero Vacunas.xml"

Observamos que unicamente se incluyen las cabeceras SOAP, y no las HTTP en la traza:

10/15/2021 13:17:59 *********************
Output from Web client with SOAP action = http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero
----boundary1237.882352941176471407.7058823529411765--
Content-Type: application/xop+xml; type="text/xml"; charset="UTF-8"
Content-Transfer-Encoding: 8bit
Content-Id: <0.EFBCA6F8.2DB1.11EC.9A62.005056B672A4>

        <?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>efbc9f822db111ec9a62005056b672a4</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>

Siguiendo el consejo que nos indicas, leemos la documentación de la versión que empleamos:

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

Y nos sale que la opción "H" en el ^ISCSOAP que nos permitiría observar las cabeceras HTTP, está sin incluir:

Tienes razón, Alberto, el Servicio Web destino, nos sigue respondiendo que faltaría la propiedad name:

10/15/2021 13:18:00 *********************
Input to Web client with SOAP action = http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero
--MIME_Boundary
Content-ID: <root.message@cxf.apache.org>
Content-Type: application/xop+xml; type="text/xml"; charset=utf-8
Content-Transfer-Encoding: 8bit

                <?xml version="1.0" encoding="UTF-8"?>
                <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

---------------
Validate Security header: action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero, MethodName=cargarFichero
**** SOAP client return error. method=cargarFichero, action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero
     ERROR #6248: La respuesta de SOAP es un error de SOAP: faultcode=Server
faultstring=Name must not be null
faultactor=
detail=

¿Cómo podríamos continuar?

¿De qué forma depuraríamos las cabeceras HTTP del envío del fichero mediante SOAP?

¿Ustedes como nos recomiendan que sigamos?

¿Cuáles serían los siguientes pasos?

Muchas gracias por tus respuestas Alberto, y sobre todo gracias por indicarnos la documentación y ejemplos concretos y prácticos

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

Hola Yone, me alegro de que al final hayas encontrado el mecanismo de Attachment para enviarlo :)

Respecto a la autenticación, deberías revisar las especificaciones del servicio web al que te quieres conectar.

Creo que estás intentando conectar a un servicio web del Ministerio para enviar comunicaciones, por experiencias pasadas creo recordar que suelen pedir al menos:
* Cabeceras WSA (parece que ya tienes algunas puestas).
* Firma del mensaje con token y un timestamp. La firma debería incluir el timestamp, el cuerpo SOAP, el token y las cabeceras WSA.

Pero repito, confírmalo por favor con la documentación de las especificaciones del servicio web al que te quieras conectar.

Puedes echar un vistazo a la documentación aquí:
https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...

En cualquier caso lo dicho, si necesitas algún ejemplo específico o comentar alguna cosa concreta puedes escribirme por email y buscamos un rato para echarlo un ojo.