Blazor 0.6.0 "lingettes" compatible avec Flurl?

blazor flurl httpclientfactory

Question

Après la mise à jour de Blazor de 0.5.1 (avec Flurl actif) à 0.6.0, les appels via flurl génèrent une exception:

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

Le projet crée un HttpClientFactory qui obtient le HttpClient de Blazor pour être utilisé par Flurl:

Créez FlurlClient avec HttpClient (http) de Blazor à l'aide de HttpClientFactoryForBlazor:

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

Utilisez le FlurlClient (c) par exemple via la méthode d'extension de Flurl "IFlurlRequest.WithClient (c);"

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

Il semble donc que cette approche ne fonctionne plus.

Est-ce que quelqu'un sait comment faire fonctionner Flurl avec Blazor 0.6.0?

Call-Stack c'est:

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

Réponse acceptée

Pour mémoire, l’équipe Blazor est en train de réduire considérablement l’empreinte de l’application, et a recours à des mesures inhabituelles pour le faire. En un mot, ils l'ont réduit d'environ 20% en "effaçant" HttpClientHandler .

wipe signifie "remplacer les corps de méthodes spécifiés par une instruction de projection unique". Faire cela (au lieu de supprimer complètement la méthode) signifie que l’assemblage conserve une surface d’API complètement standard et si vous essayez d’utiliser une des méthodes effacées, vous obtenez une trace de pile d’exceptions facile à comprendre qui indique méthode que vous essayez d'appeler.

C'est ce à quoi vous vous heurtez: Blazor connaît toujours HttpClientHandler à des fins de compilation, mais HttpClientHandler une exception d'exécution si vous (ou dans ce cas une bibliothèque compatible) essayez de l'utiliser.

Mais HttpClient doit envelopper une implémentation de HttpMessageHandler Blazor a son propre: BrowserHttpMessageHandler . Et Flurl fournit un moyen simple d’échanger cela via son HttpClientFactory . Mais vous n'avez pas besoin de transmettre une instance HttpClient ou d'implémenter CreateHttpClient . Au lieu de cela, DefaultHttpClientFactory de DefaultHttpClientFactory et substituez simplement CreateMessageHandler :

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

Je recommande également d'enregistrer cette fois globalement au démarrage de l'application, plutôt que chaque fois que vous créez un FlurlClient :

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

Il convient également de noter que Blazor est toujours expérimental et que BrowserHttpMessageHandler pourrait être obsolète dans une version ultérieure. BrowserHttpMessageHandler vous donc à une BrowserHttpMessageHandler temporaire.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi