как отправить уже созданное сообщение SOAP в WCF - PullRequest
0 голосов
/ 07 июня 2011

У меня на стороне клиента SOAP-сообщение в строке

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>"

и я отправляю сообщение вот так

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);

но проблема в том, что фактическое сообщение, которое отправляется по проводам, имеет сообщение SOAP внутри сообщения SOAP ... я как-то хочу преобразовать свое RAW-сообщение в структуру SOAP

Ответы [ 3 ]

0 голосов
/ 08 июня 2011

Я получил ответ на этот вопрос Ошибка десериализации мыльного сообщения wcf

0 голосов
/ 22 октября 2015

Вы можете преобразовать (десериализовать) ваше сообщение SOAP в объект, ожидаемый вашим сервисом. Вот эскиз того, что работает для меня:

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

где десериализация это:

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;
}

Поскольку SOAP - это XML, вы можете легко настроить его структуру (например, удалить или изменить пространство имен) перед десериализацией.

0 голосов
/ 07 июня 2011

Вы не можете использовать Soap11 в качестве версии сообщения, и вы не можете использовать BasicHttpBinding.Попробуйте:

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();

Но в любом случае, если у вас есть SOAP-запрос, почему бы вам просто не использовать WebClient или HttpWebRequest для отправки запроса на сервер?

...