Blazor 0.6.0 "wischt" Flurl-Kompatibilität?

blazor flurl httpclientfactory

Frage

Nach der Aktualisierung von Blazor von 0.5.1 (mit funktionierendem Flurl) auf 0.6.0 werfen Aufrufe über flurl eine Ausnahme:

WASM: [Flurl.Http.FlurlHttpException] Call failed. Cannot invoke method 
because it was wiped. See stack trace for details.

Das Projekt erstellt eine HttpClientFactory, die Blazors HttpClient dazu bringt, von Flurl verwendet zu werden:

Erstellen Sie FlurlClient mit Blazors HttpClient (http) mit HttpClientFactoryForBlazor:

IFlurlClient c = new FlurlClient() { Settings = new Flurl.Http.Configuration.ClientFlurlHttpSettings { HttpClientFactory = new HttpClientFactoryForBlazor(http) }};

Verwenden Sie den FlurlClient (c) beispielsweise über Flurls Erweiterungsmethode "IFlurlRequest.WithClient (c);"

private class HttpClientFactoryForBlazor : Flurl.Http.Configuration.IHttpClientFactory
{
    private readonly HttpClient httpClient;

    public HttpClientFactoryForBlazor(HttpClient httpClient)
    {
        this.httpClient = httpClient;
    }

    public virtual HttpClient CreateHttpClient(HttpMessageHandler handler)
    {
        return this.httpClient;
    }
}

Es sieht so aus, als ob dieser Ansatz nicht mehr funktioniert.

Weiß jemand, wie Flurl mit Blazor 0.6.0 funktioniert?

Anruf-Stack ist:

WASM: [Flurl.Http.FlurlHttpException] Call failed. Cannot invoke method because it was wiped. See stack trace for details. GET http://srv01.servicegrid.eu:4455/API/Status?forceLoadDbs=False blazor.webassembly.js:1:32098
WASM:   at Flurl.Http.FlurlRequest.HandleExceptionAsync (Flurl.Http.HttpCall call, System.Exception ex, System.Threading.CancellationToken token) <0x26945b8 + 0x001c2> in <c38761af4558433f81b1691eb86a1548>:0 blazor.webassembly.js:1:32098
WASM:   at Flurl.Http.FlurlRequest.SendAsync (System.Net.Http.HttpMethod verb, System.Net.Http.HttpContent content, System.Threading.CancellationToken cancellationToken, System.Net.Http.HttpCompletionOption completionOption) <0x2665d30 + 0x005e6> in <c38761af4558433f81b1691eb86a1548>:0 blazor.webassembly.js:1:32098
WASM:   at Flurl.Http.FlurlRequest.SendAsync (System.Net.Http.HttpMethod verb, System.Net.Http.HttpContent content, System.Threading.CancellationToken cancellationToken, System.Net.Http.HttpCompletionOption completionOption) <0x2665d30 + 0x0079a> in <c38761af4558433f81b1691eb86a1548>:0 blazor.webassembly.js:1:32098
WASM:   at Flurl.Http.HttpResponseMessageExtensions.ReceiveJson[T] (System.Threading.Tasks.Task`1[TResult] response) <0x26a2180 + 0x000d6> in <c38761af4558433f81b1691eb86a1548>:0 blazor.webassembly.js:1:32098
WASM:   at DotNetFabrik.FlurlExtensions.FlurlRequestExtensions.HandleWebApiExceptions[T] (System.Threading.Tasks.Task`1[TResult] task) <0x26a43f8 + 0x000e2> in <8c1e6df9d3f545cd831ff49915df2d85>:0 blazor.webassembly.js:1:32098
WASM:   at DotNetFabrik.FlurlExtensions.FlurlRequestExtensions.HandleWebApiExceptions[T] (System.Threading.Tasks.Task`1[TResult] task) <0x26a43f8 + 0x00264> in <8c1e6df9d3f545cd831ff49915df2d85>:0 blazor.webassembly.js:1:32098
WASM:   at BlazorCoreDMSTools.CommunicationService.CommunicationService.SetTokenAsync (System.String token, System.String database, System.String serverUri) <0x260dc60 + 0x00d9e> in <cb925648b50340888772566fbaeac465>:0 

Akzeptierte Antwort

Nur für einige Hintergrundinformationen ist das Blazor-Team dabei, den Footprint der App deutlich zu reduzieren und auf einige ungewöhnliche Maßnahmen zurückzugreifen . Kurz gesagt, sie haben es um etwa 20% reduziert, indem sie " HttpClientHandler " HttpClientHandler .

Wipe bedeutet "Ersetze angegebene Methodenkörper durch eine Einzelwurfanweisung". Wenn Sie dies tun (statt die Methode tatsächlich vollständig zu entfernen), behält die Assembly eine vollständig standardmäßige API-Oberfläche bei. Wenn Sie versuchen, eine der abgewischten Methoden zu verwenden, erhalten Sie einen leicht verständlichen Trace, der Ihnen anzeigt, welche gelöscht wurden Methode, die Sie anrufen möchten.

Dies ist der Punkt, gegen den Sie gestoßen sind: Blazor kennt HttpClientHandler zu Kompilierungszwecken, wird aber eine Laufzeitausnahme auslösen, wenn Sie (oder in diesem Fall eine kompatible Bibliothek) versuchen, sie zu verwenden.

Aber HttpClient muss einige Implementierungen von HttpMessageHandler umschließen Blazor hat seinen eigenen: BrowserHttpMessageHandler . Und Flurl bietet eine einfache Möglichkeit, dies über seine HttpClientFactory zu tauschen. Sie müssen jedoch keine HttpClient Instanz übergeben oder CreateHttpClient implementieren. Erben DefaultHttpClientFactory stattdessen von DefaultHttpClientFactory und überschreiben Sie CreateMessageHandler :

private class HttpClientFactoryForBlazor : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler()
    {
        return new BrowserHttpMessageHandler();
    }
}

Ich würde auch empfehlen, dies einmal beim App-Start global zu registrieren und nicht jedes Mal, wenn Sie einen FlurlClient erstellen:

FlurlHttp.Configure(settings =>
{
    settings.HttpClientFactory = new HttpClientFactoryForBlazor();
});

Es sollte auch beachtet werden, dass Blazor immer noch experimentell ist und dass BrowserHttpMessageHandler in einer zukünftigen Version veraltet sein könnte , also erwarte, dass dies nur ein vorübergehender BrowserHttpMessageHandler sein könnte.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow