Вызов TCP SoapService с использованием TcpClient - PullRequest
0 голосов
/ 26 января 2009

У меня есть демо-мыло, которое возвращает запрос

 public class EchoWebService : SoapService
    {
        [SoapMethod("Echo")]
        public string Echo(string request)
        {
            Console.WriteLine("Request: {0}", request);
            return DateTime.Now + Environment.NewLine + request;
        }
    }

Сервис размещается с использованием TCP,

Uri to = new Uri("soap.tcp://localhost:5696");
EndpointReference EPR = new EndpointReference(to);
SoapReceivers.Add(EPR, new EchoWebService());

Я могу вызвать службу, написав свой собственный TCP SoapClient,

Uri to = new Uri("soap.tcp://localhost:5696");
EndpointReference EPR = new EndpointReference(to);
mysoapclient client1 = new mysoapclient(EPR);
Console.WriteLine(client1.GetResponse("Hello World"));

class mysoapclient : SoapClient
{
        public mysoapclient(EndpointReference endpoint) : base(endpoint) { }
        public string GetResponse(string request)
        {

            return base.SendRequestResponse("Echo",
              request).GetBodyObject(typeof(string)).ToString();
        }
}

Есть ли способ вызвать службу с помощью TcpClient? Я хочу отправить сырой XML через TCP, чтобы вызвать службу и прочитать ответ обратно из сетевого потока. Я пытался использовать следующий код и XML, но, похоже, он не работает.

TcpClient client = new TcpClient("localhost", 5696);
byte[] request = Encoding.UTF8.GetBytes(xml);
NetworkStream stream = client.GetStream();
stream.Write(request, 0, request.Length);
byte[] response = new byte[client.ReceiveBufferSize];
client.GetStream().Read(response, 0, client.ReceiveBufferSize);
Console.WriteLine(Encoding.UTF8.GetString(response));

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Echo xmlns="http://tempuri.org/">
      <request>Hello World</request>
    </Echo>
  </soap:Body>
</soap:Envelope>

Любая помощь будет оценена.

1 Ответ

1 голос
/ 26 января 2009

Вам нужно заполнить все двоичные заголовки до SOAP/TCP.

См. Ссылка SUN на SOAP / TCP .

В качестве подсказки вы можете запустить tcpdump или wireshark, записать ваш SOAP сеанс и посмотреть, что именно вам нужно заполнить.

Чтобы записать петлевой трафик, используйте tcpdump, чтобы захватить его в файл, и откройте файл с помощью wireshark

...