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%Dies ist das Design der Klasse HttpClient .Net Kernquelle .
Die interessante Methode ist hier CheckDisposedOrStarted()
.
Nun wird dies beim Festlegen der Eigenschaften
aufgerufenBaseAddress
Timeout
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
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.
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.
Scoped Lifetime Services werden einmal pro Anfrage erstellt.
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%Tags und Links c# asp.net-core