ブレーザー0.6.0 "ワイプ" Flurl互換性?

blazor flurl httpclientfactory

質問

Blazorを0.5.1(Flurlの動作時)から0.6.0に更新した後、flurl経由の呼び出しで例外がスローされます。

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

このプロジェクトでは、Flurlによって使用されているBlazorのHttpClientを取得するHttpClientFactoryを作成します。

HttpClientFactoryForBlazorを使用してBlazorのHttpClient(http)でFlurlClientを作成する:

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

例えば、Flurlの拡張メソッド "IFlurlRequest.WithClient(c);"を使って、FlurlClient(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;
    }
}

だから、このアプローチはもはや動かないようです。

Blazor 0.6.0でFlurlを作る方法を誰かが知っていますか?

コールスタックは:

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 

受け入れられた回答

バックグラウンドのために、Blazorチームは、アプリのフットプリントを大幅に削減し、そうするための珍しい手段に頼っています。一言で言えば、 HttpClientHandler "ワイプ"することで約20%削減しました。

ワイプとは、指定されたメソッド本体を単一のスロー命令に置き換えることを意味します。これを行うと(実際にメソッドを完全に削除するのではなく)、アセンブリが完全に標準のAPIサーフェスを保持していることを意味します。ワイプされたメソッドの1つを使用しようとすると、メソッドを呼び出します。

Blazorはまだコンパイルの目的でHttpClientHandlerを認識していますが、あなた(またはこの場合は互換性のあるライブラリ)が使用しようとすると実行時例外がスローされます。

しかし、 HttpClientHttpMessageHandler実装をラップする必要がありHttpMessageHandler 。Blazorには独自のBrowserHttpMessageHandlerます。そして、FlurlはHttpClientFactoryを使ってこれを簡単に交換する方法を提供しHttpClientFactory 。しかし、 HttpClientインスタンスを渡すか、 CreateHttpClient実装する必要はありません。代わりに、 DefaultHttpClientFactoryを継承し、単にCreateMessageHandlerオーバーライドします。

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

FlurlClientを作成するたびにではなく、アプリの起動時にこれを一度グローバルに登録することをおすすめします。

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

また、Blazorはまだ実験中であり、 BrowserHttpMessageHandlerは将来のリリース廃止される可能性があるので、一時的なBrowserHttpMessageHandler可能性があることBrowserHttpMessageHandlerBrowserHttpMessageHandlerBrowserHttpMessageHandler



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ