Pregunta
· 23 sep, 2021

ContentType inexperado al llamar a un WS Soap

Hola comunidad,

Tengo una clase cliente SOAP que conecta con un WS Service. Esta estructura y configuracion es la misma para varios proveedores que están integerados con mi solución.

Si llamo a un proveedor, devuelve el XML esperado. Pero hay un proveedor que lanza un error:

ERROR #6243: HTTP request to SOAP WebService returned response with unexpected CONTENT-TYPE: application/wsdl+xml

He intentado asignar el ContentType al adapter.%Client con este valor, pero no funciona.

Si lo invoco usando SOAP UI, con el mismo Soap Envelop, funciona correctamente y el Content-Type es text/xml

¿Puede ayudarme alguien?

Saludos,
Kurro Lopez

Product version: Ensemble 2017.1
$ZV: Cache for Windows (x86-64) 2017.2.1 (Build 801_3U) Thu Apr 12 2018 10:02:23 EDT
Comentarios (7)3
Inicie sesión o regístrese para continuar

Hola David,

No se donde se establece ese valor.

El Business Operation se creó usando el wizard y lo que se modificó en los métodos, es que antes de hacer el Invoke a cada uno de los métodos del WS, modifica el namespace y el Location según a que proveedor va a realizar la consulta.

Todos los proveedores tienne la misma estructura y métodos iguales, varían el Namespace y la URL.

He probado a incluir la siguiente linea:

Method MiMetodo(pRequest As MyMessageWS.RequestbuscarInfoRequest, Output pResponse As MyMessageWS.RequestbuscarInfoResponse) As %Library.Status
{
    do ..preparaOperacion(pRequest)
    Set tSC = ..Adapter.InvokeMethod("buscarInfo",.info,pRequest.idEspecialidad,pRequest.listaActos,pRequest.centroSanitario,pRequest.infoAdicional)
    Quit:$$$ISERR(tSC) tSC
    Set tSC = pRequest.NewResponse(.pResponse)  Quit:$$$ISERR(tSC) tSC
    Set pResponse.InfoCentro=$get(info)
    Quit $$$OK
}

Method preparaOperacion(pRequest As MyMessageWS.Request.base) As %Status
{
 Set ..Adapter.%Client.Namespace = pRequest.Namespace
 Set ..Adapter.%Client.Location = pRequest.Url
 Set ..Adapter.%Client.ContentType = "application/wsdl+xml"
 Quit $$$OK
}

He invocado al proveedor directamente para que me dé el WSDL y, efectivamente, responde con un fichero wsdl+xml

A ver si con esta explicación puedes ayudar mejor.

Un saludo,
Kurro

Hola Kurro,

¿Has probado a activar el rastreo con ^ISCSOAP en pruebas?
https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...

set ^ISCSOAP("Log")="ios"
set ^ISCSOAP("LogFile")="/tmp/test.log"

Intenta comparar la petición completa (cabeceras incluidas) y la respuesta que obtienes para un servicio de otro proveedor que sí funciona Vs. este que te da problemas. Quizá sencillamente estés teniendo algún problema con la URL del Location que le estás pasando y por eso el WebService te devuelve el WSDL.

Quizá puedas comparar la petición te funciona en SoapUI Vs. la que da error en IRIS y comprobar si tienen alguna mínima diferencia en cabeceras HTTP o SOAP.

Podrías utilizar SetHttpHeader() para modificar las cabeceras HTTP de tu %SOAP.WebClient
https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...

O directamente cabeceras SOAP si te hicieran falta:
https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...

Esto es lo que ha devuelto el log

09/23/2021 16:04:36 *********************
Output from Web client with SOAP action = http://ws.myprovider.org/buscarInfo
<?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'>
  <SOAP-ENV:Body><buscarInfo xmlns="http://ws.myProvider.salutic.org/"><idEspecialidad xsi:type="s:string">CT</idEspecialidad><centroSanitario xsi:type="s:string">CG</centroSanitario><infoAdicional xmlns:s01="http://ws.myProvider.salutic.org/" xsi:type="s01:infoAdicionalType"><ambulancia xsi:type="s:boolean">false</ambulancia><urgencia xsi:type="s:boolean">false</urgencia><gravedad xsi:type="s:boolean">false</gravedad><anestesia xsi:type="s:boolean">false</anestesia><claustrofobia xsi:type="s:boolean">false</claustrofobia></infoAdicional></buscarInfo></SOAP-ENV:Body>
</SOAP-ENV:Envelope>

09/23/2021 16:04:36 *********************
Input to Web client with SOAP action = http://ws.myProvider.org/buscarInfo

ERROR #6243: La solicitud HTTP a SOAP WebService ha devuelto una respuesta con CONTENT-TYPE inesperado: application/wsdl+xml.
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://ws.myProvider.org/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.myProvider.org/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
<wsdl:documentation>Servicio Web para InfoOnline TEST</wsdl:documentation>
  <wsdl:types>
    <xsd:schema>
<xsd:import namespace="http://ws.myProvider.org/" schemaLocation="InfoOnline.xsd"/>
</xsd:schema>
  </wsdl:types>
  <wsdl:message name="buscarInfoSoapOut">
    <wsdl:part name="buscarInfoResult" element="tns:buscarInfoResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="buscarInfoSoapIn">
    <wsdl:part name="parameters" element="tns:buscarInfo">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="InfoOnlineWSSoap">
    <wsdl:operation name="buscarInfo">
<wsdl:documentation>Solicita informacion para un paciente</wsdl:documentation>
      <wsdl:input message="tns:buscarInfoSoapIn">
    </wsdl:input>
      <wsdl:output message="tns:buscarInfoSoapOut">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="InfoOnlineWSSoap" type="tns:InfoOnlineWSSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="buscarInfo">
      <soap:operation soapAction="http://ws.myProvider.org/buscarHueco" style="document"/>
      <wsdl:input>
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="InfoOnlineWS">
<wsdl:documentation>Servicio Web Seguro  (Pruebas) para InfoOnline (TEST) </wsdl:documentation>
    <wsdl:port name="InfoOnlineWSSoap" binding="tns:InfoOnlineWSSoap">
      <soap:address location="https://urlprovider.com/services/SIU"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
**** SOAP client return error. method=buscarInfo, action=http://ws.myProvider.org/buscarInfo
     ERROR #6243: La solicitud HTTP a SOAP WebService ha devuelto una respuesta con CONTENT-TYPE inesperado: application/wsdl+xml.

Nota: Por motivos de confidencialidad, se ha modificado la dirección del proveedor y algunos detalles mas, pero esta es la respuesta obtenida.

He sobreescrito el método %OnSOAPResponse para ver si obtenía algo, y ya viene con el error

 Method %OnSOAPResponse(mode As %String, client As %SOAP.WebClient, action As %String, oneWay As %Boolean, method As %String, requestStream As %BinaryStream, responseStream As %BinaryStream, sc As %Status)
{
Quit
}

entonces, no debería de ser un problema de la cabecera de salida, sino mas bién las cabeceras de entrada. ¿O es que intenta recuperar el WSDL para hacer la operación y ahí es donde está el problema?

Un saludo,
Kurro

¿Entiendo que tú sólo controlas el cliente de WebService no? (el servicio web en sí, lo controla y lo mantiene otro proveedor).

A simple vista, me parece que debe haber algo que falte o sobre en la petición SOAP de forma que hace que el servicio web no lo interprete correctamente y te devuelva el WSDL sin más.

Pero vaya, básicamente habría que investigarlo en detalle. Quizá es mejor que abras directamente un caso a soporte WRC para que puedan verlo contigo.