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.
Veuillez ne pas ajouter "C#" et tel à la fin de vos titres. C'est ce que les tags sont pour. –
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
Enveloppez vos 'GetResponse' et' GetResponseStream' dans les blocs 'using() {...}' car ils implémentent 'IDisposable'. –