Freigeben über


Timeout einstellen bei externen Anrufen in einem Plug-in

Kategorie: Leistung

Wirkungspotential: Hoch

Symptome

Wenn ein Plug-in externe Webanfragen stellt, die nicht schnell reagieren, wartet das Plug-in auf die volle Standard-Timeout-Periode, bevor es fehlschlägt. Diese Dauer kann zu einer langen Transaktion führen, die andere Operationen bewirken kann. Wenn das Plug-in registriert ist:

  • Synchron können die Benutzer Folgendes erleben:

    • Nicht reaktionsfähige, modellgetriebene Anwendungen
    • Langsame Kundeninteraktionen
    • Der Browser reagiert nicht mehr.
  • Asynchron können Plug-in-Ausführungen einen längeren Zeitraum in Anspruch nehmen, bevor sie fehlschlagen.

Anleitung

Der Standard-Timeout-Wert für .Net Http-Clients beträgt 100 Sekunden, also nur 20 Sekunden weniger als die Zeit, die dem Plugin zur Verfügung steht. Es ist am besten, eine voraussichtliche Basiszeit festzulegen, zu der ein aufrufender Dienst antworten wird. Je länger sie diese normale Reaktionszeit überschreitet, desto höher ist die Wahrscheinlichkeit, dass sie letztendlich scheitert. Als Best Practice für die Leistung ist es am besten, schnell auszufallen, anstatt die standardmäßige Timeout-Periode ablaufen zu lassen. Sie sollten die Zeitspanne steuern, in der Ihr Aufruf an den externen Dienst wartet.

Der Timeout-Wert, den Sie einstellen sollten, hängt vom Dienst ab. Wenn Sie beispielsweise die Leistung des Dienstes überwachen können, können Sie eine Dauer bestimmen, bei der 99,999% der Anfragen erfolgreich sind, und Ihre Timeout-Periode mit einigen Sekunden Puffer auf diese Dauer einstellen. Dadurch wird verhindert, dass die gelegentlichen Ausreißer einen übermäßigen Einfluss auf die Leistung Ihres Plugins haben.

Wenn Sie System.Net.Http.Http.HttpClient Class verwenden, können Sie den Wert Timeout explizit setzen, wie in diesem Beispiel gezeigt, indem Sie den Timeout auf 15 Sekunden einstellen.

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.");
}

Wenn Sie System.Net.WebClient Class verwenden, müssen Sie eine abgeleitete Klasse erstellen und die Basis GetWebRequest Methode überschreiben, um den Timeout einzustellen:

  /// <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;
    }
  }

Dann können Sie diese Klasse in Ihrem Plugin-Code verwenden:

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.");
}

Siehe auch

Beispiel: Webzugriff über ein Sandkasten-Plug-In
KeepAlive auf falsch setzen, wenn Sie mit externen Hosts in einem Plug-in interagieren

Hinweis

Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)

Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).