Définir le délai d’expiration lors d’appels externes dans un plug-in
Catégorie : Performance
Potentiel d’impact : Élevé
Symptômes
Si un plug-in effectue des demandes Web externes qui ne répondent pas rapidement, il va alors attendre la fin du délai d’expiration par défaut avant d’échouer. Cette durée peut entraîner une longue transaction qui peut affecter d’autres opérations. Si le plug-in est enregistré :
de manière synchrone, les utilisateurs peuvent rencontrer :
- Des applications basées sur des modèles qui ne répondent pas
- Des interactions lentes avec le client
- L’arrêt des réponses du navigateur
de manière asynchrone, les exécutions de plug-in peuvent prendre un certain temps avant d’échouer.
Recommandation
La valeur par défaut du délai d’expiration pour les clients .Net Http est de 100 secondes, seulement 20 secondes de moins que le temps disponible pour exécuter le plug-in. Il est donc préférable d’établir un temps de référence attendu au bout duquel un service d’appels va répondre. Plus ce temps de réponse normal est dépassé, plus il y a de chance que l’appel échoue au final. Les meilleures pratiques en matière de performances recommandent d’échouer rapidement plutôt que de laisser le délai par défaut arriver à expiration. Vous devez contrôler la période pendant laquelle votre appel au service externe devra attendre.
La valeur du délai d’expiration que vous devez définir dépend du service. Par exemple, si vous pouvez surveiller les performances du service, vous pouvez déterminer une durée où 99,999 % des requêtes réussissent et fixer votre délai d’expiration sur cette durée, à quelques secondes près. Cela empêche des cas exceptionnels d’avoir trop d’impact sur les performances de votre plug-in.
Si vous utilisez System.Net.Http.HttpClient Class, vous pouvez définir la valeur Timeout
explicitement, comme illustré dans cet exemple qui définit le délai d’expiration sur 15 secondes.
using (HttpClient client = new HttpClient())
{
client.Timeout = TimeSpan.FromMilliseconds(15000); //15 seconds
client.DefaultRequestHeaders.ConnectionClose = true; //Set KeepAlive to false
HttpResponseMessage response = client.GetAsync(webAddress).GetAwaiter().GetResult(); //Make sure it is synchronous
response.EnsureSuccessStatusCode();
string responseText = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); //Make sure it is synchronous
tracingService.Trace(responseText);
//Log success in the Plugin Trace Log:
tracingService.Trace("HttpClientPlugin completed successfully.");
}
Si vous utilisez System.Net.WebClient Class, vous devez créer une classe dérivée et remplacer la base GetWebRequest Method pour définir le délai d’expiration :
/// <summary>
/// A class derived from WebClient with 15 second timeout and KeepAlive disabled
/// </summary>
public class CustomWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
if (request != null)
{
request.Timeout = 15000; //15 Seconds
request.KeepAlive = false;
}
return request;
}
}
Vous pouvez ensuite utiliser cette classe dans votre code plug-in :
using (CustomWebClient client = new CustomWebClient())
{
byte[] responseBytes = client.DownloadData(webAddress);
string response = Encoding.UTF8.GetString(responseBytes);
tracingService.Trace(response);
//Log success in the Plugin Trace Log:
tracingService.Trace("WebClientPlugin completed successfully.");
}
Voir aussi
Exemple : Accès Web d’un plug-in placé dans le bac à sable
Définissez KeepAlive sur false lorsque vous interagissez avec des hôtes externes dans un plug-in
Notes
Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)
Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).