HttpClient - Diese Instanz wurde bereits gestartet

8

Ich bekomme diese Ausnahme mit HTTP-Client in meiner API.

  

Beim Ausführen der Anforderung ist eine nicht behandelte Ausnahme aufgetreten.   System.InvalidOperationException: Diese Instanz hat bereits eine oder mehrere Anforderungen gestartet. Eigenschaften können nur vor dem Senden der ersten Anfrage geändert werden.

und ich habe meinen Dienst als

injiziert %Vor%

Ich dachte singleton war mein bestes wette . Was könnte mein Problem sein?

bearbeiten: meine Verwendung

%Vor%     
legen---wait for it---dary 14.02.2017, 20:33
quelle

2 Antworten

16

Dies ist das Design der Klasse HttpClient .Net Kernquelle .

Die interessante Methode ist hier CheckDisposedOrStarted() .

%Vor%

Nun wird dies beim Festlegen der Eigenschaften

aufgerufen
  1. BaseAddress
  2. Timeout
  3. MaxResponseContentBufferSize

Wenn Sie also die HttpClient -Instanz wiederverwenden möchten, sollten Sie eine einzelne Instanz einrichten, die diese 3 Eigenschaften vorgibt, und alle Verwendungen müssen NICHT diese Eigenschaften ändern.

Alternativ können Sie eine Factory erstellen oder einfach AddTransient(...) verwenden. Beachten Sie, dass AddScoped hier nicht am besten geeignet ist, da Sie die gleiche Instanz pro Anforderungsbereich erhalten.

Grundfabrik bearbeiten

Eine Fabrik ist jetzt nichts anderes als ein Dienst, der dafür verantwortlich ist, eine Instanz für einen anderen Dienst bereitzustellen. Hier ist eine grundlegende Fabrik, um deine HttpClient zu bauen, jetzt erkenne, dass dies nur das grundlegendste ist, was du kannst, um diese Fabrik so zu erweitern, wie du es willst und jede Instanz von HttpClient

voreinzustellen %Vor%

Nun, warum habe ich das Interface benutzt? Dies geschieht durch Verwendung von Dependency-Injection und IoC. Wir können Teile der Anwendung leicht einfach austauschen. Anstatt auf HttpClientFactory zuzugreifen, greifen wir nun auf IHttpClientFactory zu.

%Vor%

Nun würden Sie in Ihrer Klasse, Ihrem Service oder Controller die Factory-Schnittstelle anfordern und eine Instanz generieren.

%Vor%

Der Schlüssel hier ist.

  1. Die Factory ist verantwortlich für die Generierung der Client-Instanz und verwaltet die Standardeinstellungen.
  2. Wir fordern die Schnittstelle und nicht die Implementierung an. Dies hilft uns, unsere Komponenten getrennt zu halten und ein modulares Design zu ermöglichen.
  3. Der Dienst wird als eine Instanz mit Gültigkeitsbereich registriert. Singletons haben ihren Nutzen, aber in diesem Fall ist es wahrscheinlicher, dass Sie eine Instanz mit einem Bereich möchten.
  

Scoped Lifetime Services werden einmal pro Anfrage erstellt.

    
Nico 14.02.2017, 21:07
quelle
2

Singletons sind der richtige Ansatz. Die Verwendung von Scoped oder Transient verhindert Verbindungspooling und führt zu Leistungsverschlechterungen und Port-Erschöpfung.

Wenn Sie konsistente Voreinstellungen haben, können diese einmal initialisiert werden, wenn der Dienst registriert ist:

%Vor%

...

%Vor%

Wenn Sie keine konsistenten Standardwerte haben, sollten BaseAddress und DefaultRequestHeaders nicht verwendet werden. Erstellen Sie stattdessen eine neue HttpRequestMessage:

%Vor%     
Tratcher 18.01.2018 16:32
quelle

Tags und Links