2011-06-07 4 views
0

J'ai un message SOAP dans une chaîne de mon côté clientcomment envoyer un message SOAP déjà construit dans WCF

string requestMessageString = "<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:inf="http://www.informatica.com/" 
xmlns:wsdl="http://www.informatica.com/wsdl/"> 
    <soapenv:Header> 
     <inf:Security> 
      <UsernameToken> 
      <Username>john</Username> 
      <Password>jhgfsdjgfj</Password> 
      </UsernameToken> 
     </inf:Security> 
    </soapenv:Header> 
    <soapenv:Body> 
     <wsdl:doClient_ws_IbankRequest> 
      <wsdl:doClient_ws_IbankRequestElement> 
      <!--Optional:--> 
      <wsdl:Client_No>00460590</wsdl:Client_No> 
      </wsdl:doClient_ws_IbankRequestElement> 
     </wsdl:doClient_ws_IbankRequest> 
    </soapenv:Body> 
</soapenv:Envelope>" 

et je vous envoie le message comme celui-ci

Message requestMsg = Message.CreateMessage(MessageVersion.Soap11, "http://tempuri.org/IService1/IbankClientOperation", requestMessageString); 

      Message responseMsg = null; 

      BasicHttpBinding binding = new BasicHttpBinding(); 
      IChannelFactory<IRequestChannel> channelFactory = binding.BuildChannelFactory<IRequestChannel>(); 
      channelFactory.Open(); 

      EndpointAddress address = new EndpointAddress(this.Url); 
      IRequestChannel channel = channelFactory.CreateChannel(address); 
      channel.Open(); 

      responseMsg = channel.Request(requestMsg); 

mais le problème est que le message réel qui est envoyé sur le fil a un message SOAP dans un message SOAP ... je veux en quelque sorte convertir mon message RAW en structure SOAP

Répondre

0

Vous ne pouvez pas utiliser Soap11 comme version du message et vous ne pouvez pas utiliser BasicHttpBinding. Essayez:

Message requestMsg = Message.CreateMessage(MessageVersion.None, "http://tempuri.org/IService1/IbankClientOperation", requestMessageString); 

CustomBinding binding = new CustomBinding(new HttpTransportBindingElement()); 
IChannelFactory<IRequestChannel> channelFactory = binding.BuildChannelFactory<IRequestChannel>(); 
channelFactory.Open(); 

Mais de toute façon si vous avez la demande SOAP pourquoi ne pas utiliser simplement WebClient ou HttpWebRequest pour poster la demande au serveur?

+0

Merci :) j'ai trouvé la réponse ci-dessous –

0

Vous pouvez convertir (deserialize) votre message SOAP dans un objet que votre service attend. Voici une esquisse de ce qui fonctionne pour moi:

var invoice = Deserialize<Invoice>(text); 
var result = service.SubmitInvoice(invoice); 

où Deserialize est la suivante:

private T Deserialize<T>(string text) 
{ 
    T obj; 
    var serializer = new DataContractSerializer(typeof(T)); 
    using (var ms = new MemoryStream(Encoding.Default.GetBytes(text))) 
    { 
     obj = (T)serializer.ReadObject(ms); 
    } 
    return obj; 
} 

Depuis SOAP XML, vous pouvez facilement l'ajuster structure (supprimer ou espace de noms de changement, par exemple) avant désérialisation .

Questions connexes