Blazor 0.6.0 "salviette" Flurl-compatibilità?

blazor flurl httpclientfactory

Domanda

Dopo aver aggiornato Blazor da 0.5.1 (con Flurl funzionante) a 0.6.0, le chiamate via flurl generano un'eccezione:

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

Il progetto crea una HttpClientFactory che ottiene HttpClient di Blazor per essere utilizzato da Flurl:

Crea FlurlClient con HttpClient (http) di Blazor usando HttpClientFactoryForBlazor:

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

Usa FlurlClient (c) per esempio tramite il metodo di estensione di Flurl "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;
    }
}

Quindi, sembra che questo approccio non funzioni più.

Qualcuno sa come far funzionare Flurl con Blazor 0.6.0?

Call-Stack è:

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 

Risposta accettata

Solo per un po 'di background, il team di Blazor sta riducendo significativamente l'impronta dell'app e ricorre a misure insolite per farlo. In poche parole, lo hanno ridotto di circa il 20% "cancellando" HttpClientHandler .

pulire significa "sostituire i corpi del metodo specificato con una singola istruzione di lancio". In questo modo (invece di rimuovere completamente il metodo) significa che l'assembly mantiene una superficie API completamente standard e, se provi a utilizzare uno dei metodi puliti, ottieni una traccia dello stack delle eccezioni di facile comprensione che ti dice quale cancellato metodo che stai cercando di chiamare.

Questo è ciò contro cui vi siete imbattuti: Blazor è ancora a conoscenza di HttpClientHandler a scopi di compilazione, ma lancia un'eccezione di runtime se voi (o in questo caso una libreria compatibile) provate ad usarlo.

Ma HttpClient deve includere alcune implementazioni di HttpMessageHandler Blazor: BrowserHttpMessageHandler . E Flurl fornisce un modo semplice per scambiarlo tramite HttpClientFactory . Ma non è necessario passare in un'istanza HttpClient o implementare CreateHttpClient . Invece, eredita da DefaultHttpClientFactory e sostituisci semplicemente CreateMessageHandler :

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

Ti consiglio anche di registrarlo una volta a livello globale all'avvio dell'app, anziché ogni volta che crei un FlurlClient :

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

Va anche notato che Blazor è ancora sperimentale e che BrowserHttpMessageHandler potrebbe essere deprecato in una versione futura , quindi aspettatevi che questo possa essere solo un intervento temporaneo.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow