背景
まず.NETが提供するHttpClient
ですが、.NET Core3.0以降であればHTTP/2
に対応しています。
HttpClient クラス (System.Net.Http) | Microsoft Learn
var client = new HttpClient { BaseAddress = new Uri("https://localhost:5001"), DefaultRequestVersion = new Version(2, 0) }; using var response = await client.GetAsync("/"); Console.WriteLine(response.Content);
.NET Core 3.0 の新機能 - .NET | Microsoft Learn
現在対応しているUnityのランタイムの最新は.NET Standard2.1
ですが、まだHttpClient
がHTTP/2に対応していません。(全てはMonoのせい)
learn.microsoft.com
UnityでHttp/2
を扱いたい場合はどうすればよいのかという話になるわけですが、そこでYetAnotherHttpHandler
が登場します。
概要
YetAnotherHttpHandler
によりUnity(.NET Standard2.1)でHTTP/2を利用することができるようになります。ライブラリが提供するYetAnotherHttpHandler
はHttpMessageHandler
を継承しており、HttpClient
のコンストラクタに渡すだけでHTTP/2を利用するようになります。
// .NETの内部実装 public HttpClient(HttpMessageHandler handler) : this(handler, true){ }
// YetAnotherHttpHandlerの内部実装 public class YetAnotherHttpHandler : HttpMessageHandler
https://github.com/dotnet/runtime/blob/0154a2f3403d94ea6d6f93f5a774b6e366969e0a/src/libraries/System.Net.Http/src/System/Net/Http/HttpClient.cs#L142-L151
github.com
つまりユーザーはいつも通りHttpClient
を利用するので、使い心地をほとんど変える必要がないという素晴らしさです。
YetAnotherHttpHandler brings the power of HTTP/2 to Unity and .NET Standard.
This library enables the use of HTTP/2, which Unity does not support. It allows you to use grpc-dotnet instead of the deprecated C-core gRPC library. It can also be used for asset downloading via HTTP/2, providing more functionality to your projects.
The library is implemented as a HttpHandler for HttpClient, so you can use the same API by just replacing the handler. (drop-in replacement)
YetAnotherHttpHandlerはHTTP/2のパワーをUnityと.NET Standardにもたらします。 このライブラリはUnityがサポートしていないHTTP/2の使用を可能にします。 非推奨のCコアgRPCライブラリの代わりにgrpc-dotnetを使用することができます。 また、HTTP/2経由のアセットダウンロードにも使用でき、プロジェクトにさらなる機能を提供します。 このライブラリはHttpClientのHttpHandlerとして実装されているので、ハンドラを置き換えるだけで同じAPIを使用できます。 (ドロップイン置き換え)
環境
- Unity 2021.3 (LTS) or later
各Architecture/Platform
の対応について詳細はreadmeをご覧ください。
Builder in hyper_util::client::legacy - Rust
インストール方法
最近CySharpさんはNuGetForUnityやUnityNuGetを採用してきていますが、私は考え方が古いのかUPMの方が良いのかなとまだ思ってます... (何故かライブラリを信用できない)
というわけでUPMでインストールするには以下のURLをUnity Package ManagerのAdd package from git URL...
に入力してください。
https://github.com/Cysharp/YetAnotherHttpHandler.git?path=src/YetAnotherHttpHandler
追加で依存先のライブラリをインポートする必要があります。
Releases
に依存先のdllを含めた.unitypackage
を上げておいてくれてるみたいです。Cysharp.Net.Http.YetAnotherHttpHandler.Dependencies.unitypackage
をインストールしてUnityへインポートすればOKです。
github.com
それかnuget.org
から直接取ってくる手法も一応あります。Download package
を押して以下の手順で操作をします。
.nupkg
をダウンロード- 拡張子を
.zip
に変更して展開 system.io.pipelines.8.0.0/lib/netstandard2.0/System.IO.Pipelines.dll
をUnityのPluginsフォルダに配置system.runtime.compilerservices.unsafe.6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll
を同様にPluginsフォルダに配置
使い方
YetAnotherHttpHandler
を生成して、HttpClient
のコンストラクタに渡してあげます。
using System.Net.Http; using Cysharp.Net.Http; using UnityEngine; public class Sample : MonoBehaviour { private async void Start() { using var handler = new YetAnotherHttpHandler(); using var httpClient = new HttpClient(handler); // 適当にブログのページを取得します。HTTP/2に対応していることは確認済です。 var result = await httpClient.GetAsync("https://www.hanachiru-blog.com/"); // HTTP message version : 2.0 var version = result.Version; Debug.Log(version); var content = await result.Content.ReadAsStringAsync(); Debug.Log(content); } }
正しく通信できることを確認できました。
さいごに
readmeに書かれている通り、Grpc.Net
に移行でHTTP/2が必要になり利用されるケースが多いようです。
そこら辺も詳しくreadmeにかかれているので、気になる方はチェックしてみてください。
github.com