Blazor 0.6.0 "toallitas" ¿Compatibilidad con Flurl?

blazor flurl httpclientfactory

Pregunta

Después de actualizar Blazor de 0.5.1 (con Flurl en funcionamiento) a 0.6.0, las llamadas a través de flurl lanzan una excepción:

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

El proyecto crea un HttpClientFactory que obtiene HttpClient de Blazor para ser utilizado por Flurl:

Cree FlurlClient con HttpClient (http) de Blazor usando HttpClientFactoryForBlazor:

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

Utilice el FlurlClient (c), por ejemplo, mediante el método de extensión de Flurl "IFlurlRequest.WithClient (c)";

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

Entonces, parece que este enfoque ya no funciona.

¿Alguien sabe cómo hacer que Flurl con Blazor 0.6.0 funcione?

Call-Stack es:

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

Respuesta aceptada

Solo para algunos antecedentes, el equipo de Blazor está en el proceso de reducir significativamente la huella de la aplicación y recurrir a algunas medidas inusuales para hacerlo. En pocas palabras, lo han reducido en aproximadamente un 20% al "limpiar" HttpClientHandler .

limpiar significa "reemplazar los cuerpos de los métodos especificados con una instrucción de un solo lanzamiento". Hacer esto (en lugar de eliminar realmente el método por completo) significa que el ensamblaje conserva una superficie API completamente estándar, y si intenta usar uno de los métodos borrados, obtiene un seguimiento de la pila de excepciones fácil de entender que le indica qué borrado Método al que estás tratando de llamar.

Esto es contra lo que se ha topado: Blazor aún es consciente de HttpClientHandler para propósitos de compilación, pero lanzará una excepción de tiempo de ejecución si usted (o en este caso una biblioteca compatible) intenta usarla.

Pero HttpClient debe envolver alguna implementación de HttpMessageHandler Blazor tiene su propia: BrowserHttpMessageHandler . Y Flurl proporciona una forma fácil de intercambiar esto a través de su HttpClientFactory . Pero no necesita pasar una instancia de HttpClient o implementar CreateHttpClient . En su lugar, herede de DefaultHttpClientFactory y simplemente reemplaza a CreateMessageHandler :

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

También recomiendo registrar esto una vez globalmente en el inicio de la aplicación, en lugar de cada vez que crees un FlurlClient :

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

También se debe tener en cuenta que Blazor aún es experimental y que BrowserHttpMessageHandler puede estar en desuso en una versión futura , así que espere que esto sea solo una solución temporal.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué