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:

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

Usa FlurlClient (c) per esempio tramite il metodo di estensione di Flurl "IFlurlRequest.WithClient (c);"

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

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.

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 :

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

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
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché