2012-03-16 2 views
0

J'essaie de faire plusieurs demandes identiques à un service Web REST. Le problème que je pose est que pour chaque requête, il semble qu'une nouvelle socket est ouverte, ce qui rend l'opération beaucoup plus lente (~ x10). (par rapport à la même opération utilisant un canal proxy SOAP).Plusieurs demandes Web identiques

J'ai regardé dans HttpWebRequest.KeepAlive, mais je ne peux pas appeler GetResponse() sur la même requête web plusieurs fois.

Cet extrait ci-dessous est l'idée de ce que je dois, et oui je sais cela ne fonctionnera pas pour les raisons je l'ai mentionné ci-dessus:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(serviceUri); 
req.KeepAlive = true; 

var dcs = new DataContractSerializer(typeof(Test)); 

while (enabled) 
{ 
    var stream = req.GetResponse().GetResponseStream();     

    if (stream != null) 
    { 
     var test = (Test)dcs.ReadObject(stream); 
     counter++; 
    } 
} 

EDIT: Ceci est la boucle que je utilise pour le SOAP test:

private void SoapLoop() 
{ 
    IService1 proxy = 
     ChannelFactory<IService1>.CreateChannel(
      tcpBinding, endpointAddress); 



    while (enabled) 
    { 
     var test = proxy.GetRead(new GetReadRequest()); 
     counter++; 
    } 

} 

L'objet que je transfère est le même dans SOAP et REST, et est ~ 300KB.

EDIT2: Je l'ai fait quelques tests supplémentaires:

sur de petits objets, par exemple: 100 octets REST surpasse SOAP (~ 2 à 1), mais sur de gros objets (objets avec de grands tableaux d'octets d'image) SOAP est beaucoup plus rapide .

Une autre chose étrange est que lorsque je commente la ligne var test = (Test)dcs.ReadObject(stream); dans la boucle REST, la performance tombe réellement: S.

+3

Veuillez ne pas ajouter "C#" et tel à la fin de vos titres. C'est ce que les tags sont pour. –

+0

Autant que je sache, vous pouvez utiliser différentes 'WebRequests' et ils vont essayer de réutiliser la même connexion. Êtes-vous sûr que cela n'arrive pas réellement et que le serveur supporte 'Keep-Alive'? – svick

+0

Enveloppez vos 'GetResponse' et' GetResponseStream' dans les blocs 'using() {...}' car ils implémentent 'IDisposable'. –

Répondre

0

Fermez la première réponse avant d'ouvrir la nouvelle. Veuillez considérer mettre GetXYZ() à l'intérieur d'une instruction using. KeepAlive est true par défaut.

+0

Comme je l'ai dit ci-dessus: Ceci est Squelette, il n'est pas conçu comme un code de travail. J'ai ajouté stream.Close() et Response.Close(). La performance est meilleure mais reste beaucoup plus lente qu'une boucle similaire qui utilise un service basé sur SOAP. – user472875

+0

Donc, si je comprends bien, maintenant le code fonctionne, mais les performances ne sont pas ce que vous attendez? Pouvez-vous poster le code complet que vous utilisez pour tester les performances dans les deux cas? –