Error al consumir el servicio web, el tipo de contenido “application / xop + xml” no coincide con el tipo esperado “text / xml”

Tengo un problema extraño al consumir un servicio web para un producto que mi empresa ha comprado. El producto se llama Campaign Commander y está hecho por una compañía llamada Email Vision. Estamos intentando utilizar la “API SOAP de actualización masiva de datos”.

Cada vez que trato de llamar a cualquiera de los métodos en el servicio web, la llamada realmente tiene éxito pero el cliente falla al procesar la respuesta y recibo una excepción.

Los detalles de los errores están debajo, gracias por cualquier ayuda que ustedes puedan ofrecer.

Error al usar la referencia web (cliente de servicio web de estilo antiguo)

Cuando consumo el servicio como referencia web obtengo una InvalidOperationException para cualquier llamada que realice, con el siguiente mensaje:

 Client found response content type of 'multipart/related; type="application/xop+xml"; boundary="uuid:170e63fa-183c-4b18-9364-c62ca545a6e0"; start=""; start-info="text/xml"', but expected 'text/xml'. The request failed with the error message: -- --uuid:170e63fa-183c-4b18-9364-c62ca545a6e0 Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"; Content-Transfer-Encoding: binary Content-ID:     DpKTe-9swUeOsxhHH9t-uLPeLyg-aa2xk3-aKe9oJ5S9Yymrnuf1FxYnzpaFojsQSkSCbJsZmrZ_d3v2-7Hj    --uuid:170e63fa-183c-4b18-9364-c62ca545a6e0-- --. 

Como puede ver, el sobre del botón de respuesta parece válido (esta es una respuesta válida y la llamada tuvo éxito), pero el cliente parece tener un problema con el tipo de contenido y genera una excepción.

Error al utilizar la referencia de servicio (cliente WCF)

Cuando consumo el servicio como referencia de servicio obtengo una ProtocolException de ProtocolException para cualquier llamada que realice, con el siguiente mensaje:

 The content type multipart/related; type="application/xop+xml"; boundary="uuid:af66440a-012e-4444-8814-895c843de5ec"; start=""; start-info="text/xml" of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 648 bytes of the response were: ' --uuid:af66440a-012e-4444-8814-895c843de5ec Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"; Content-Transfer-Encoding: binary Content-ID:     Dqaqb-MJ9V_eplZ8fPh4tdHUbxM-ZtuZsDG6GalAGZSfSzyxgtuuIxZc3aSsnhI4b0SCbJsZmrZ_d3v2-7G8    --uuid:af66440a-012e-4444-8814-895c843de5ec--'. 

Al igual que con el ejemplo anterior; obtuvimos una respuesta válida y la llamada fue exitosa, pero el cliente parece tener un problema con el tipo de contenido y ha generado una excepción.

¿Hay alguna opción que pueda establecer para que el cliente no tenga un problema con el tipo de respuesta? He hecho algunas búsquedas en Google, pero nada de lo que he encontrado me ha ayudado hasta ahora.

Para cualquiera que padezca el mismo problema; Encontré una solución para consumir el servicio web como referencia de servicio (WCF). La propiedad BasicHttpBinding.MessageEncoding necesita establecerse en “Mtom”.

Aquí hay un fragmento de la configuración de configuración requerida:

           

Editar: si tiene el mismo problema con un enlace personalizado, consulte la respuesta de @robmzd .

Todavía no he encontrado una solución para consumirlo como referencia web antigua.

Después de haber luchado con esto durante unos días, encontré una solución notablemente simple para este problema:

  1. Active el Editor de configuración seleccionando Herramientas-> Editor de configuración de servicio WCF desde el menú principal en VS2010;
  2. Ciérrelo de nuevo;
  3. Haga clic derecho en el archivo App.Config para encontrar un nuevo elemento de menú “Editar configuración WCF”;
  4. Haga clic en el enlace;
  5. Cambie MessageEncoding a Mtom;
  6. Salvar.

Espero que esto ayude a alguien.

Obtuve exactamente el mismo problema con la misma función y la misma compañía y paso un par de horas en Google tratando de encontrar la respuesta correcta. Después de tantas pruebas finalmente lo conseguí. Esto es lo que hice: la siguiente cadena fue la respuesta que funciona desde Email Vision a la que me devolvió (Mi propósito principal era la Carga masiva, pero cambio a getLastUpload para simplificar y probar).

cuerda (2180) ”

 --uuid:5c8a8a1d-a29c-43d0-baaa-cb3a8c189962 Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"; Content-Transfer-Encoding: binary Content-ID:  254816API_BATCH_MEMBERDONE254810API_BATCH_MEMBERDONE254805API_BATCH_MEMBERDONE254799API_BATCH_MEMBERDONE254797API_BATCH_MEMBERDONE254791API_BATCH_MEMBERDONE254790API_BATCH_MEMBERDONE254771API_BATCH_MEMBERDONE254770API_BATCH_MEMBERERROR254759API_BATCH_MEMBERDONE254747API_BATCH_MEMBERDONE253619CCMDDONE238053CCMDDONE WITH ERROR(S)216618CCMDDONE WITH ERROR(S)200373CCMDDONE200367CCMDDONE195445CCMDDONE194579CCMDDONE194263CCMDDONE193740CCMDDONE --uuid:5c8a8a1d-a29c-43d0-baaa-cb3a8c189962-- 

Si observa la parte superior de la cadena, tiene un valor clave y el rest del personal del servidor que hizo que la clase SoapClient arroje una excepción, “parece que no tenemos ningún documento XML”. Aunque el documento xml estaba debajo de todo este personal.

 --uuid:5c8a8a1d-a29c-43d0-baaa-cb3a8c189962 Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"; Content-Transfer-Encoding: binary Content-ID:  

De manera similar, en la parte inferior de la cadena (después del xml) aparece la misma clave

 --uuid:5c8a8a1d-a29c-43d0-baaa-cb3a8c189962-- 

Entonces la solución fue tratar de deshacerse de la parte de la cadena desde el principio hasta el comienzo del archivo xml y desde el final del archivo xml hasta el final de la cadena. Encontré un muy buen script que me ayudó a acercarme a esta solución MTOM php client . Sin embargo, mi respuesta xml fue un poco diferente, así que modifiqué un poco ese guión y aquí está mi versión.

 function upload_file_insert_via_soap_obj( $token, $csv_file ) { try { $wsdl_loc = 'https:XXX/apibatchmember/services/BatchMemberService?wsdl'; $soap_Object = new MTOMSoapClient( $wsdl_loc, array( 'cache_wsdl' => WSDL_CACHE_NONE, 'trace' => true ) ); $parameters['token'] = $token; $parameters['insertUpload']['fileName'] = "insertMemberTest.txt"; $parameters['insertUpload']['fileEncoding'] = "UTF-8"; $parameters['insertUpload']['separator'] = ","; $parameters['insertUpload']['skipFirstLine'] = "false"; $parameters['insertUpload']['autoMapping'] = "true"; $parameters['file'] = file_get_contents( "insertMemberTest.txt" ); $results = $soap_Object->uploadFileInsert( $parameters ); $upload_id = $results->return; echo "
upload_id: ".$upload_id; return $upload_id; } catch ( Exception $exception ) { echo "EX REQUEST: " . $soap_Object->__getLastRequest() . "
"; echo "EX RESPONSE: " . $soap_Object->__getLastResponse() . "
"; echo "
Response var dump: "; var_dump( $soap_Object->__getLastResponse() ); echo "
"; echo '

Exception: '.$exception->getMessage()."
"; var_dump( $exception ); } } /** * This client extends the ususal SoapClient to handle mtom encoding. Due * to mtom encoding soap body has test apart from valid xml. This extension * remove the text and just keeps the response xml. */ class MTOMSoapClient extends SoapClient { public function __doRequest( $request, $location, $action, $version, $one_way = 0 ) { $response = parent::__doRequest( $request, $location, $action, $version, $one_way ); //if resposnse content type is mtom strip away everything but the xml. if ( strpos( $response, "Content-Type: application/xop+xml" ) !== false ) { //not using stristr function twice because not supported in php 5.2 as shown below //$response = stristr(stristr($response, "

Si tiene un alojamiento propio en un servicio WCF y está consumiendo el servicio con un cliente WCF. Debe recordar configurar la propiedad MessageEncoding en el host de esta manera:

 BasicHttpBinding binding = new BasicHttpBinding(); binding.MessageEncoding = WSMessageEncoding.Mtom; 

Me encontré con este problema también. Mi cliente siguió lanzando esta excepción al inicio y no pude entender por qué hasta que me di cuenta de que olvidé establecer mi propiedad de vinculación MessageEncoding en la aplicación de host.

Tuve el mismo problema pero con . Para solucionarlo, puede configurar la encoding de mensaje de Mtom utilizando un nodo de configuración separado bajo el enlace.

              

Acabo de recibir este problema porque < configSections > no era el primer elemento en < configuración >.

No estoy seguro de si este es un lugar apropiado para poner esto, pero me estaba costando conseguir que mi servicio de Windows se conectara a un WSDL (usando una referencia web generada automáticamente).

Estaba obteniendo el mismo error que el póster original aquí. Como no utilizo WCF, la aplicación.config no funcionaría para mí y no causó que mi servicio se iniciara. Encontré una publicación en MSDN donde AjayChigurupati dice que debe cambiar

public partial class WsdlService : System.Web.Services.Protocols.SoapHttpClientProtocol {...}

A

public partial class WsdlService : Microsoft.Web.Services3.WebServicesClientProtocol {...}

(Asegúrese de agregar la referencia de Microsoft.Web.Services3 a su proyecto)

Ahora tenemos acceso a la propiedad booleana RequireMtom y puede rodear su función de llamada de la siguiente manera:

  public DownloadResponse downloadDataFile([System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] DownloadRequest Request) { RequireMtom = true; // ADDED object[] results = this.Invoke("downloadDataFile", new object[] { Request}); RequireMtom = false; // ADDED return ((DownloadResponse)(results[0])); } 

Con suerte, esto ayuda a otra persona con el mismo problema en el futuro.