2009-01-26 8 views
0

J'ai un service de savon de démonstration qui en écho à la demandeInvoquer un TCP SoapService utilisant TcpClient

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

Service est hébergé à l'aide TCP,

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

je peux appeler le service en écrivant mon propre 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(); 
     } 
} 

Existe-t-il un moyen d'appeler le service en utilisant TcpClient? Je veux envoyer le fichier XML brut sur TCP pour appeler le service et lire la réponse du flux réseau. J'ai essayé d'utiliser le code suivant et xml mais cela ne semble pas fonctionner.

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> 

Toute aide serait appréciée.

Répondre

1

Vous devez remplir tous les en-têtes binaires à SOAP/TCP.

Voir SUN's SOAP/TCP reference.

Comme un indice, vous pouvez exécuter tcpdump ou wireshark, enregistrer SOAP session et voir exactement ce que vous devez remplir.

Pour enregistrer le trafic de réalimentation, utilisez tcpdump pour capturer le fichier, et ouvrez le fichier avec wireshark

+0

i essayé d'utiliser Wireshark (ainsi que tous les hacks mentionnés @ http://wiki.wireshark.org/CaptureSetup/Bouclage) mais il ne capture pas le trafic de bouclage sur Windows. tcpdump a capturé le trafic de bouclage mais la sortie n'était pas significative. – chikak

+0

J'ai pris une sauvegarde avec tcpdump et ouvert le fichier dans wireshark. Quand j'ai suivi le flux de tcp je pouvais seulement voir suivant, . ...-.) urne: uid: uid: 406356e4-dc0f-4fb7-8dMIME-Version: 1.0 Type de contenu: multipart .. @ .......... – chikak

Questions connexes