2017-10-05 7 views
0

J'ai un client restsharp et demande mis en place comme ceci:RestSharp Délai d'attente ne fonctionne pas

var request = new RestRequest(); 
request.Method = Method.POST; 
request.AddParameter("application/json", jsonBody, ParameterType.RequestBody); 
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; }; 
request.Timeout = -1; 
request.ReadWriteTimeout = -1; 
var url = $"http://{ipAddress}/api/calculate"; 
var client = new RestClient(); 
client.BaseUrl = new Uri(url); 
client.Timeout = -1; 
client.ReadWriteTimeout = -1; 
var response = client.Execute(request); 

Cette demande va prendre un certain temps pour terminer, à environ 30 minutes. Maintenant, je sais qu'il y a des manières plus élégantes de faire ceci, mais, pour cette demande, je dois le faire comme ceci.

Ce client RestSharp et cette requête sont exécutés dans le service Windows. Lorsque le service exécute la requête, il déclenche TimoutException et le délai maximal de requête est d'environ 40 secondes.

Pour une raison quelconque, le délai d'attente que je définis ne fonctionne pas dans ce cas.

Quelqu'un a une solution pour cela?

Répondre

1

Vous ne faites peut-être pas ce que vous pensez en définissant la valeur ReadWriteTimeout. Votre valeur est ignorée et vous obtenez la valeur par défaut. Selon cette réponse What is default timeout value of RestSharp RestClient? RestSharp utilise HttpWebRequest dans sa mise

La propriété de délai d'attente pour HttpWebRequest ne peut pas être négative HttpWebRequest.Timeout Property.

Si vous regardez dans le code client RestSharp vous voyez ceci: https://github.com/restsharp/RestSharp/blob/70de357b0b9dfc3926c95d1e69967c7a7cbe874c/RestSharp/RestClient.cs#L452

 int readWriteTimeout = request.ReadWriteTimeout > 0 
      ? request.ReadWriteTimeout 
      : this.ReadWriteTimeout; 

     if (readWriteTimeout > 0) 
     { 
      http.ReadWriteTimeout = readWriteTimeout; 
     } 
+0

Merci pour la réponse. Alors, que suggérez-vous que je fasse pour mettre un temps illimité au timeout? –

+1

Tout d'abord, je diviserais l'opération en opérations de démarrage, d'état et de résultat. Passez l'appel, renvoyez un jeton, puis vérifiez l'état. Enfin, obtenez le résultat enregistré. Si ce n'est pas faisable, alors je suggère de faire le temps d'attente aussi longtemps que vous le pouvez et espérer le meilleur. Si vous contrôlez l'API, optez pour ce qui se cache derrière la porte n ° 1. –

+0

Vous aviez raison. Dans la documentation officielle, il y a un -1 pour un délai d'attente illimité. Je l'ai mis comme Int32.MaxValue et cela a fonctionné. Merci mon pote! –