2010-03-10 20 views
8

J'utilise un client de service Web C# traditionnel généré dans VS2008 .Net 3.5, héritant de SoapHttpClientProtocol. Cela se connecte à un service Web distant écrit en Java.Comment configurer un client de service Web C# pour envoyer l'en-tête et le corps de la requête HTTP en parallèle?

Toute la configuration se fait dans le code lors de l'initialisation du client, et peut être vu ci-dessous:

 ServicePointManager.Expect100Continue = false; 
     ServicePointManager.DefaultConnectionLimit = 10; 

     var client = new APIService 
     { 
      EnableDecompression = true, 
      Url = _url + "?guid=" + Guid.NewGuid(), 
      Credentials = new NetworkCredential(user, password, null), 
      PreAuthenticate = true, 
      Timeout = 5000 // 5 sec 
     }; 

Tout fonctionne très bien, mais le temps nécessaire pour exécuter l'appel de méthode la plus simple est presque le double du temps de ping réseau. Alors qu'un client de test Java prend à peu près le même que le temps de ping réseau:

C# client ~ 550ms 
Java client ~ 340ms 
Network ping ~ 300ms 

Après avoir analysé le trafic TCP pour une session découvert ce qui suit:

Fondamentalement, le client C# a envoyé des paquets TCP dans la séquence suivante .

Client Send HTTP Headers in one packet. 
Client Waits For TCP ACK from server. 
Client Sends HTTP Body in one packet. 
Client Waits For TCP ACK from server. 

Le client Java a envoyé des paquets TCP dans l'ordre suivant.

Client Sends HTTP Headers in one packet. 
Client Sends HTTP Body in one packet. 
Client Revieves ACK for first packet. 
Client Revieves ACK for second packet. 
Client Revieves ACK for second packet. 

est-il de toute façon de configurer le client de service Web C# pour envoyer l'en-tête/corps en parallèle en tant que client Java semble?

Toute aide ou pointeurs très appréciés.

+0

Pouvez-vous renifler les en-têtes http pour la requête .Net et la requête java et les comparer? (Et je suppose que le client Java utilise le même proxy) –

+0

désolé, quand je dis proxy je veux dire comme dans une classe proxy, plutôt que d'un proxy http – Christopher

+0

modifié pour supprimer les références à «proxy» et remplacer par «client» – Christopher

Répondre

0

Je pense que vous pouvez utiliser la méthode héritée EndGetRequestStream pour hacker le protocole SoapHttpClientProtocol. Enregistrez-le dans un tampon jusqu'à la fin de la requête. Ensuite, créez votre propre flux et exportez-le tout de suite.

1

Merci pour la réponse Rob, finalement j'ai choisi d'utiliser la génération de proxy Add Service Service/WCF, qui le fait par défaut. Probablement parce qu'il utilise des bibliothèques HTTP plus récentes en dessous. J'ai eu quelques problèmes de génération de proxy WCF avec des méthodes SOAP qui retournent des tableaux bruts d'objets complexes (à savoir: renvoyer un objet qui contient un tableau d'objets a bien fonctionné). Pour contourner ce problème, vous devez soit placer vos tableaux dans des objets, soit passer de la configuration du serveur SOAP de RPC à DOCUMENT (ce que nous avons fait).