2009-11-13 7 views
15

tengo una referencia de servicio WCF:envío de XML de jabón sin procesar directamente al servicio WCF desde C#

http://.../Service.svc(?WSDL) 

y tengo un archivo XML que contiene un sobre SOAP compatible

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <MyXML> 
     ... 

Ahora, me gustaría para enviar estos datos brutos directamente al servicio (y recibir la respuesta) a través de algún código C# sin usar una referencia de servicio de Visual Studio.

Esto es posible, y si es así, ¿cómo?

+0

¿alguna vez logró esto? ¿Cómo? – jcolebrand

+0

No lo han logrado aún, me temo que – lox

+0

¿Acabas de renunciar a la idea? Qué estabas intentando hacer? ¿Por qué no podría usar la referencia de servicio de Visual Studio? En cierto modo, es una característica fundamental del .NET Framework, por lo que no entiendo por qué no usaste esa característica. Además, podría haber creado una clase con la herramienta wsdl de VS y luego usar la clase de cliente para conectarse. Es curioso si todavía está trabajando en este tema de alguna manera, ya que está abierto y otros lo leerán (tenga en cuenta las 1.023 visitas hasta ahora) – jcolebrand

Respuesta

30

Puede usar UploadString. Es necesario configurar los Content-Type y SOAPAction cabeceras adecuadamente:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var client = new WebClient()) 
     { 
      // read the raw SOAP request message from a file 
      var data = File.ReadAllText("request.xml"); 
      // the Content-Type needs to be set to XML 
      client.Headers.Add("Content-Type", "text/xml;charset=utf-8"); 
      // The SOAPAction header indicates which method you would like to invoke 
      // and could be seen in the WSDL: <soap:operation soapAction="..." /> element 
      client.Headers.Add("SOAPAction", "\"http://www.example.com/services/ISomeOperationContract/GetContract\""); 
      var response = client.UploadString("http://example.com/service.svc", data); 
      Console.WriteLine(response); 
     } 
    } 
} 
+1

Solo una nota para otros, el "Tipo de contenido" puede tener que establecerse en 'client.Headers.Add (" Content-Type "," application/soap + xml; charset = utf-8 ");' y el El archivo de entrada de solicitud SOAP puede requerir '' – CodeCowboyOrg

+1

También una nota para futuros visitantes: tuve que configurar la codificación en utf8 para que funcione correctamente: 'cliente. Encoding = Encoding.UTF8; ' –

0

Puede intentar usar la clase webclient y publicar su xml en el servicio.

5

sólo quiero comentar que la respuesta de Darin trabajado para mí, excepto que tuve que llevar a cabo las comillas adicionales alrededor del valor de la cabecera SOAPAction (sustituya la URI, por supuesto):

client.Headers.Add("SOAPAction", "http://www.example.com/services/ISomeOperationContract/GetContract"); 
+1

También agregaré que me funciona en el 99.99% de los servicios. Algunos servicios _require_ el en el frente aunque el sitio W3 sugiere que es opcional en el mundo HTTP + SOAP. –

Cuestiones relacionadas