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:

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

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

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

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.

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:

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

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
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum