2011-12-20 43 views
5

Estoy en un cauce en cuanto a cómo agregar un archivo adjunto en mi solicitud SOAP. Tenemos que consumir un servicio web de terceros, construido en Java, que es lo más intrincado que me he encontrado. Cualquier otro servicio web que hayamos utilizado, que requiera archivos adjuntos, tiene un método o propiedad para agregar el archivo adjunto. Sencillo. Sin embargo, este no proporciona tal método.Agregar un archivo adjunto a la solicitud SOAP

Tenemos una versión del mensaje SOAP junto que es exactamente como queremos el XML, sin embargo, es la parte MIME del archivo que no podemos agregar.

Ejemplo:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"> 
<soap:Header> 
<payloadManifest xmlns="http://<examplePayload>"> 
<manifest contentID="Content0" namespaceURI="http://<exampleManifest>" element="ProcessRepairOrder" version="2.01" /> 
</payloadManifest> 
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
<wsu:Created>2011-12-19T15:25:13Z</wsu:Created> 
<wsu:Expires>2011-12-19T15:30:00Z</wsu:Expires> 
</wsu:Timestamp> 
<wsse:UsernameToken><wsse:Username>username</wsse:Username><wsse:Password>password</wsse:Password></wsse:UsernameToken></wsse:Security></soap:Header><soap:Body><ProcessMessage xmlns="<examplePayload"><payload><content id="Content0"> 

<s:ProcessRepairOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://example.xsd" xmlns:s="http://<exampleManifest>" xmlns:gwm="http://example"> 
    <s:ApplicationArea> 
     <s:Sender> 
      <s:Component>Test</s:Component> 
      <s:Task>ProcessAttachment</s:Task> 
      <s:CreatorNameCode>Test</s:CreatorNameCode> 
      <s:SenderNameCode>XX</s:SenderNameCode> 
      <s:DealerNumber>111111</s:DealerNumber> 
      <s:DealerCountry>GB</s:DealerCountry> 
     </s:Sender> 
     <s:CreationDateTime>2010-03-26T13:37:05Z</s:CreationDateTime> 
     <s:Destination> 
      <s:DestinationNameCode>GM</s:DestinationNameCode> 
      <s:DestinationURI/> 
      <s:DestinationSoftwareCode>GWM</s:DestinationSoftwareCode> 
     </s:Destination> 
    </s:ApplicationArea> 
    <s:DataArea xsi:type="gwm:DataAreaExtended"> 
     <s:Process/> 
     <s:RepairOrder> 
      <s:Header xsi:type="gwm:RepairOrderHeaderExtended"> 
       <s:DocumentId/> 
      </s:Header> 
      <s:Job xsi:type="gwm:JobExtended"> 
       <s:JobNumber/> 
       <s:OperationId>Test</s:OperationId> 
       <s:OperationName/> 
       <s:CodesAndComments/> 
       <s:Diagnostics/> 
       <s:WarrantyClaim xsi:type="gwm:WarrantyClaimExtended"> 
        <s:OEMClaimNumber>00112233445566778899</s:OEMClaimNumber> 
        <gwm:Attachment> 
         <gwm:File><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:test.gif"/></gwm:File> 
         <gwm:Filename>test.gif</gwm:Filename> 
        </gwm:Attachment> 
       </s:WarrantyClaim> 
       <s:LaborActualHours>0.0</s:LaborActualHours> 
       <s:Technician/> 
      </s:Job> 
     </s:RepairOrder> 
    </s:DataArea> 
</s:ProcessRepairOrder> 
</content></payload></ProcessMessage></soap:Body></soap:Envelope> 

Esta es la parte XML que podemos generar y enviar, sin embargo, es incorrecto, ya que necesitamos una parte MIME allí como:

Antes XML:

--MIMEBoundary 
Content-Type: application/xop+xml; charset=utf-8; type="text/xml" 
Content-Transfer-Encoding: binary 
Content-ID: <rootpart> 

Después XML

--MIMEBoundary 
Content-Type: image/gif; name=test.gif 
Content-Transfer-Encoding: binary 
Content-ID: <test.gif> 
[email protected]� 

--MIMEBoundary-- 

He buscado en Internet las respuestas, pero las he encontrado en blanco. No parece haber mucha documentación sobre el uso de WSE para esto. Debo enfatizar que WSE es un requisito en el lado del servidor, y no hay manera de que pueda cambiar la tecnología para abordar este problema.

¿Hay alguna manera de agregar estas secciones MIME?

EDITAR: Debo agregar que puedo obtener un documento XML que funcione enviado a través de SoapUI con archivos adjuntos, pero parece que no puede encontrar una forma dentro de nuestro código.

He añadido una recompensa para tratar de encontrar una solución a este problema. Si alguien tiene alguna otra idea, por favor avíseme.

EDITAR de nuevo: Sé que ha pasado una semana desde que pude verificar las respuestas aquí, pero aunque algunos dan una buena idea de dónde buscar, sigo dibujando un espacio en blanco. La terrible documentación que rodea al XopDocument y sus métodos es un gran punto de fricción, si alguien tiene algún ejemplo del uso de SaveToXopPackage, ¿podrían proporcionarlo, porque esto está comenzando a encenderse?

+2

WSE es obsoleto y no debe usarse sin importar qué. –

+1

Bien John, ¿qué le parece buscar una solución en lugar de solo pretender que sabe todo? En este escenario, para mí, se requiere WSE. Sin eso, nuestras solicitudes serán rechazadas. No puedo decirle al proveedor externo cómo deberían codificar, puedo intentarlo, pero siempre han sido la empresa menos útil del mundo para trabajar. Entonces, aunque WSE no debería usarse si está creando su propio software, es un requisito en este caso. – anothershrubery

+0

Claramente, es una decisión de negocios si su compañía debe continuar haciendo negocios con un tercero que requiere que utilice software obsoleto, en comparación con algún competidor que no lo haga. –

Respuesta

6

Estaba enfrentando el mismo problema y la solución final que encontré fue a través de HttpWebRequest. Un código de ejemplo:

public string ProcessAttachment(string fileInput) 
    { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Settings.Default.GWM_WS_WebReference_GWM); 
     req.Headers.Add("SOAPAction", "\"http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage/v1_01/ProcessAttachment\""); 
     req.Headers.Add("Accept-Encoding", "gzip,deflate"); 
     req.ContentType = "multipart/related; type=\"application/xop+xml\"; start=\"<[email protected]>\"; start-info=\"text/xml\"; boundary=\"----=_Part_14_1350106.1324254402199\""; 
     req.Method = "POST"; 
     req.UserAgent = "Jakarta Commons-HttpClient/3.1"; 
     req.Headers.Add("MIME-Version", "1.0"); 
     System.Net.ServicePointManager.Expect100Continue = false; 
     Stream memStream = new System.IO.MemoryStream(); 
     FileStream fileStream = new FileStream(fileInput, FileMode.Open, FileAccess.Read); 
     byte[] buffer = new byte[1024]; 
     int bytesRead = 0; 
     while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      memStream.Write(buffer, 0, bytesRead); 
     } 
     fileStream.Close(); 
     Stream stm = req.GetRequestStream(); 
     memStream.Position = 0; 
     byte[] tempBuffer = new byte[memStream.Length]; 
     memStream.Read(tempBuffer, 0, tempBuffer.Length); 
     memStream.Close(); 
     stm.Write(tempBuffer, 0, tempBuffer.Length); 
     stm.Close(); 
     HttpWebResponse resp = null; 
     resp = (HttpWebResponse)req.GetResponse(); 
     stm = resp.GetResponseStream(); 
     StreamReader r = new StreamReader(stm); 
     return r.ReadToEnd();    
    } 

El parámetro fileinput es la ruta absoluta del archivo que contiene la solicitud SOAP que contiene también los datos binarios en bruto de que el archivo se adjunta al final separado con MIME de Límites

+3

-1 para ningún bloque "que use". –

+0

Realmente no entiendo cómo funciona esto. Si dices incluir los datos brutos en el archivo en línea, entonces eso no es posible, en mi escenario. Tiene que estar contenido en una sección XOP como se define en el ejemplo que di. Si me falta esto en su código, informe. – anothershrubery

+0

El archivo debe tener las 2 partes que está describiendo en la primera publicación: La parte XML y la parte de datos Ras separadas con Mime Boundary. La parte de datos en bruto significa que su parte "GIF89a @ " debe reemplazarse como una cadena simple usando el siguiente código: byte [] bt = File.ReadAllBytes (imageFile); cadena raw = System.Text.Encoding.Unicode.GetString (bt) ; Mejor contactarme directamente para explicar, ya que creo que esto va más allá del alcance de stackoverflow. –

3

Creo que puede tener un par de opciones:

1) Use MTOM. Esto parece envolver automáticamente el mensaje saliente en bloques MIME.

2) Microsoft proporciona soporte para generar y leer XOP con mime a través de la clase XopDocument, que es de lo que SoapEnvelope hereda.

El método de guardar es SaveToXopPackage y el método de lectura es LoadFromXopPackage.

Sin embargo, creo que este enfoque puede requerir que usted mismo realice el envío del mensaje a través de HttpWebRequest. This blog tiene un ejemplo de cómo implementar esto. La desventaja es que esto requiere una gran cantidad de códigos y configuraciones adicionales para funcionar correctamente.

La solución ideal sería interceptar el código que realiza la transmisión de envolvente, pero no he podido localizar la ubicación correcta para esto en la canalización.

+0

Estos son solo algunos del número de referencias que he usado al intentar hacer que esto funcione. Puedo hacer que envíe un bloque cerrado MIME, pero no sé cómo agregar los datos binarios del archivo adjunto a la parte MIME. – anothershrubery

+1

Además, bien podría no haber documentación para 'SaveToXopPackage', Google devuelve 28 resultados, la mayoría de los cuales son esta página exacta. – anothershrubery

1

Como dices que funcionó a través de SoapUI, creo que puedes pedirle a SoapUI el XML generado que enviaste para que sepas cómo debe verse, luego modifica tu código para imitarlo.

ACTUALIZACIÓN: después de su comentario y de leer las otras respuestas con más detalle: la solución me parece simplemente enviando bytes directamente, utilizando HttpWebRequest como en la respuesta de ktsiolis. En detalle:

  • Crear su jabón XML (el ejemplo que diste), codificar esto a bytes en UTF-8 (1)
  • Crear una cadena con el mimeboundary inicial (la parte en su "Antes de XML"), codificar en bytes en UTF8 (2)
  • Cree los bytes para el segundo mimeboundary (la parte en "después de XML"). Por lo tanto crear la cadena que contiene codificar "--MIMEBOUNDARY", etc., a los bytes UTF8, y Anexar todos los bytes del archivo de test.gif (3)
  • Anexar todos los bytes en el orden (2), (1) y (3) y enviar eso a través del cable.

¿No debería esto hacer el truco?

+0

en serio? Sé exactamente cómo debería verse, simplemente no sé cómo puedo obtener los datos binarios adjuntos a la parte MIME. – anothershrubery

2

Tengo un 90% de confianza de que estoy trabajando en el mismo proyecto que ustedes. Esa solicitud de jabón es un poco familiar :-)

Hemos pasado la mayor parte del camino al cambiar a WCF y básicamente codificar a mano el objeto de solicitud (crear clases que coincidan con el formato soap y luego usar los atributos xmlelement para decorarlo para que se vea como su solicitud de jabón. El archivo en sí mismo se declara como un byte() en la clase de archivo adjunto y también decorado con el elemento xm).

Esto es lo que parece el contrato de WCF y parte del modelo de datos. El modelo de datos real tiene un montón de clases adicionales (Área de aplicación, Área de datos, Trabajo, etc.) pero esto le da suficiente idea de cómo está estructurado. La pieza importante es el archivo como Byte(). Aquí está en Vb.net ...

Public Class WarrantyClaim 
    <XmlElement(Order:=0)> Public OEMClaimNumber As String = "" 
    <XmlElement(Order:=1, namespace:="http://www.gm.com/2006/GWM")> Public Attachment As New Attachment 
End Class 

Public Class Attachment 
    <XmlElement(Order:=0)> Public File As Byte() 
    <XmlElement(Order:=1)> Public Filename As String 
End Class 

<ServiceContract(XmlSerializerFormat()> _ 
Public Interface IService 
    <OperationContract(action:="http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage/v1_01/ProcessAttachment")> _ 
    Sub ProcessMessage(ByVal payload As WarrantyClaim) 
End Interface 

siguiente que tenga su cliente WCF, esto es más o menos lo mismo que todos los clientes de WCF.

Public Class GmgwClient 
    Inherits System.ServiceModel.ClientBase(Of IService) 
    Implements IService 

    Public Sub New() 
     MyBase.New() 
    End Sub 
    Public Sub New(ByVal configName As String) 
     MyBase.New(configName) 
    End Sub 
    Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding, ByVal remoteAddress As System.ServiceModel.EndpointAddress) 
     MyBase.New(binding, remoteAddress) 
    End Sub 

    Public Sub ProcessMessage(ByVal payload As Payload) Implements IService.ProcessMessage 
     MyBase.Channel.ProcessMessage(payload) 
    End Sub 
End Class 

Finalmente, tiene la aplicación.config. Aquí está la magia porque le estamos diciendo a WCF que use Mtom para enviar el mensaje. Esto tomará Byte() y lo despojará en una sección MIME separada que lo reemplazará con un XOP: Include. Tenga en cuenta que por ahora solo lo estoy enviando a través de localhost para que pueda ver la solicitud usando tcpTrace. Puede googlear esa aplicación, pero básicamente capturará la solicitud para que podamos ver cómo se ve. Me tcptrace de configuración para escuchar en el puerto 84.

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WsHttpMtomBinding" messageEncoding="Mtom"> 
     <security mode="None"> 
      <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" /> 
     </security> 
     <reliableSession enabled="false" /> 
     </binding> 
    </wsHttpBinding> 
    </bindings> 
    <client> 
    <endpoint address="http://localhost:84/ProcessMessage" binding="wsHttpBinding" bindingConfiguration="WsHttpMtomBinding" contract="MyAppNameSpace.IService" name="preprod"/> 
    </client> 
</system.serviceModel> 

Por último, aquí está la llamada real al cliente WCF para realizar la solicitud.

Dim x As New WarrantyClaim 
x.OEmClaimNumber = "12345" 
x.Attachment = New Attachment 
x.Attachment.Filename = "sample.gif" 
x.Attachment.File = IO.File.ReadAllBytes("C:\sample.gif") 

Dim y As New GmgwClient("preprod") 
y.ProcessMessage(x) 

Y aquí está el rastro que recibimos a través de tcpTrace. Tiene la estructura básica correcta y ha logrado extraer los datos binarios del xml y colocarlos en una sección MIME separada.

POST /ProcessMessage HTTP/1.1 
MIME-Version: 1.0 
Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:501aa27d-9dd1-4f8a-b56d-3fbf327e7be6+id=1";start-info="application/soap+xml" 
VsDebuggerCausalityData: uIDPoysDMCv023ZIjK0Cpp504ooAAAAA//jfaCaohkab2Zx/EU7gpLZDcUldWtlGr1j4ZnrfKl4ACQAA 
Host: localhost:84 
Content-Length: 55125 
Expect: 100-continue 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 


--uuid:501aa27d-9dd1-4f8a-b56d-3fbf327e7be6+id=1 
Content-ID: <http://tempuri.org/0> 
Content-Transfer-Encoding: 8bit 
Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml" 

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
    <s:Header> 
    <a:Action s:mustUnderstand="1">http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage/v1_01/ProcessAttachment</a:Action> 
    <a:MessageID>urn:uuid:a85374e6-c8ca-4328-ad32-6e8b88a5ca59</a:MessageID> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    <a:To s:mustUnderstand="1">http://localhost:84/ProcessMessage</a:To> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport"> 
     <payload xsi:type="gwm:WarrantyClaimExtended"> 
     <OEMClaimNumber>12345</OEMClaimNumber> 
     <Attachment xmlns="http://www.gm.com/2006/GWM"> 
      <File> 
      <xop:Include href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634618782531246992" xmlns:xop="http://www.w3.org/2004/08/xop/include"/> 
      </File> 
      <Filename>sample.gif</Filename> 
     </Attachment> 
     </payload> 
    </ProcessMessage> 
    </s:Body> 
</s:Envelope> 
--uuid:501aa27d-9dd1-4f8a-b56d-3fbf327e7be6+id=1 
Content-ID: <http://tempuri.org/1/634618782531246992> 
Content-Transfer-Encoding: binary 
Content-Type: application/octet-stream 

GIF89a<BinaryStuff> 

Como he mencionado anteriormente, todavía tenemos algunos problemas. Hay algunas etiquetas que faltan en el encabezado de Soap ... pero creo que podremos descifrarlas. El problema real es que Content-ID NO está en un formato que nuestro socio pueda aceptar; esperan algo como < [email protected]> y .net está formateándolos como http://tempuri.org/1/634618782531246992. Esto está ocasionando que su controlador de servicio web se bloquee porque no sabe cómo leer el identificador de contenido escapado dentro del mensaje de error.

+0

Mi dirección de correo electrónico se puede ver en mi perfil. – anothershrubery

+0

Acabo de notar su edición para esto ahora. Sí, parece el mismo proyecto! Lamentablemente, su solución no va a funcionar en nuestro caso, ya que estamos limitados a utilizar WSE y no WCF ... Confianza en VS 2005. Es un dolor. Pero este es el resultado que estoy buscando, pero necesito encontrar la solución en WSE. :(Sin embargo, con su problema, ¿no puede configurar el Content-ID a todo lo que desea? Esto funciona dentro de SoapUI, cuando especifica el ID de contenido usted mismo y no depende de la representación predeterminada? Mi dirección de correo electrónico, no funciona, está en mi perfil si desea conversar más. – anothershrubery

0

Ok, así que lo recibí para aceptar los datos del archivo en el elemento <gwm:File>. Este es sin utilizar XOP, por lo que la petición ahora se ve así:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"> <soap:Header> <payloadManifest xmlns="http://<examplePayload>"> <manifest contentID="Content0" namespaceURI="http://<exampleManifest>" element="ProcessRepairOrder" version="2.01" /> </payloadManifest> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsu:Created>2011-12-19T15:25:13Z</wsu:Created> <wsu:Expires>2011-12-19T15:30:00Z</wsu:Expires> </wsu:Timestamp> <wsse:UsernameToken><wsse:Username>username</wsse:Username><wsse:Password>password</wsse:Password></wsse:UsernameToken></wsse:Security></soap:Header><soap:Body><ProcessMessage xmlns="<examplePayload"><payload><content id="Content0"> <s:ProcessRepairOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://example.xsd" xmlns:s="http://<exampleManifest>" xmlns:gwm="http://example"> 
    <s:ApplicationArea> 
     <s:Sender> 
      <s:Component>Test</s:Component> 
      <s:Task>ProcessAttachment</s:Task> 
      <s:CreatorNameCode>Test</s:CreatorNameCode> 
      <s:SenderNameCode>XX</s:SenderNameCode> 
      <s:DealerNumber>111111</s:DealerNumber> 
      <s:DealerCountry>GB</s:DealerCountry> 
     </s:Sender> 
     <s:CreationDateTime>2010-03-26T13:37:05Z</s:CreationDateTime> 
     <s:Destination> 
      <s:DestinationNameCode>GM</s:DestinationNameCode> 
      <s:DestinationURI/> 
      <s:DestinationSoftwareCode>GWM</s:DestinationSoftwareCode> 
     </s:Destination> 
    </s:ApplicationArea> 
    <s:DataArea xsi:type="gwm:DataAreaExtended"> 
     <s:Process/> 
     <s:RepairOrder> 
      <s:Header xsi:type="gwm:RepairOrderHeaderExtended"> 
       <s:DocumentId/> 
      </s:Header> 
      <s:Job xsi:type="gwm:JobExtended"> 
       <s:JobNumber/> 
       <s:OperationId>Test</s:OperationId> 
       <s:OperationName/> 
       <s:CodesAndComments/> 
       <s:Diagnostics/> 
       <s:WarrantyClaim xsi:type="gwm:WarrantyClaimExtended"> 
        <s:OEMClaimNumber>00112233445566778899</s:OEMClaimNumber> 
        <gwm:Attachment> 
         <gwm:File>[email protected]�</gwm:File> 
         <gwm:Filename>test.gif</gwm:Filename> 
        </gwm:Attachment> 
       </s:WarrantyClaim> 
       <s:LaborActualHours>0.0</s:LaborActualHours> 
       <s:Technician/> 
      </s:Job> 
     </s:RepairOrder> 
    </s:DataArea> </s:ProcessRepairOrder> </content></payload></ProcessMessage></soap:Body></soap:Envelope> 

Cuando pasó a SoapUI esto funciona perfectamente, sin embargo en el código sí da una respuesta, pero que arroja un error que dice Response is not well-formed XML. con una excepción interna de WSE1608: No XOP parts were located in the stream for the specified content-id: <rootpart*[email protected]>

Abriré una nueva pregunta con respecto a esto, ya que técnicamente es un problema diferente.

La otra pregunta se puede encontrar en Soap response, not well formed XML, no XOP parts located, using WSE

0

estoy involucrado en exactamente el mismo proyecto y tengo los mismos problemas que se discuten en este hilo! Estoy usando las mejoras de vb 2005 y WSE 3.0 y lo conseguí funcionando, incluso por ahora es un dolor. Al escribir el contenido del archivo directamente en la propiedad del archivo, el archivo adjunto será aceptado por el socio. En mi caso, esto funciona para casi todas las transacciones excepto PRA. Aquí, la respuesta es positiva y se entregará un AttachmentID pero el archivo adjunto no aparece en la transacción.

Aquí es un ejemplo de la sección Datos adjuntos:

   <gwm:Attachment> 
        <gwm:File>/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ...</gwm:File> 
        <gwm:Filename>intro2.jpg</gwm:Filename> 
       </gwm:Attachment> 

Si fijo RequireMtom para el servicio a True, voy a conseguir el error siguiente:

Das Präfix '' kann nicht von '' in 'http://www.starstandards.org/webservices/2005/10/transport' innerhalb desselben Startelementtags neu definiert werden.

Por un lado, funciona, por otro lado, no estoy seguro de si se enviará con elementos XOP.

+0

Tuve una discusión con los desarrolladores del servicio web acerca de poner los datos directamente en el elemento '' y dijeron que esto no se ajusta a su especificación y requieren un elemento '' . Ver http://stackoverflow.com/questions/8805095/soap-response-not-well-formed-xml-no-xop-parts-located-using-wse para una descripción más detallada del problema que estamos teniendo. Si Quiero discutir más al respecto aquí, por favor, consulte mi perfil para mi dirección de correo electrónico. – anothershrubery

+0

Claro ... pero no puedo encontrar su dirección de correo electrónico –

+0

Si no puede verlo en biografía, ahora está en la sección Acerca de mí en mi pr Ofile. – anothershrubery

Cuestiones relacionadas