たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

第一章:古の魔法は死んだ。王の帰還だ。 ~WCFからgRPCへ、魂の継承儀式~

どうやら、一筋縄ではいかない砂の迷宮に迷い込んだらしい。この顛末を書き残しておくか。

かつて、.NET Frameworkという大地で、我々はWCF(Windows Communication Foundation)という名の、万能にして偉大な魔法を操っていた。しかし、時代は流れ、.NET 6という新たな大地では、その古の魔法はもはや使えない。神々(Microsoft)は、その後継者として「gRPC」という、より強力で、より高速な、新たな王を我々に示した。

今回は、Windowsという故郷の大地で、この新たな王gRPCの力を借り、ゴーレムを錬成する。そして、localhostという名の安息所から、IPアドレスという広大な世界へ、その魂を解き放つ儀式を執り行う。これは、古き王への追悼と、新たなる王への忠誠を誓う、魂の継承儀式の記録である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • gRPCという、HTTP/2の光の道を駆ける、新たな魔法体系に興味がある者
  • WCFという古の魔法の終焉に戸惑い、次なる力を求める探求者

第一の儀式:gRPCサーバという名の、王の神殿を築く

Visual Studio 2022という名の魔法の工房で、新たなプロジェクトを創造する。テンプレートから「ASP.NET Core gRPC サービス」を選び、GrpcGreeterという名の、王の神殿を築き始める。

gRPC (ASP.NET Core gRPC サービス) を選択する

新たな王の神殿を、ここに築く

神殿には、王の声を聴くための魔法の耳「NLog」を、NuGetという名の宝物庫から授ける。

NLog を追加する

王の声を聴くための、魔法の耳

魂の設計図を書き換える:launchSettings.json

ここが、今回の儀式で最も重要な秘儀だ。神殿の設計図であるlaunchSettings.jsonを開き、applicationUrlに記されたlocalhostという内なる言葉を、0.0.0.0という、全世界に向けた開かれた言葉へと書き換える。

{
  "profiles": {
    "GrpcGreeter": {
      "applicationUrl": "http://0.0.0.0:5217;https://0.0.0.0:7217",
      // ...
    }
  }
}

この一文こそが、王が自らの神殿に閉じこもるのをやめ、広大な世界からの呼びかけに応えるための、最も重要な呪文である。

王の降臨

神殿を起動すると、初回に限り、SSL証明書という名の「聖なる結界」を信頼するかの信託を問われる。これを承認すれば、王はついに、我々の世界に降臨する。

IIS Express SSL 証明書の信頼

聖なる結界を、信頼せよ

第二の儀式:王と対話する、使徒を創る(gRPCクライアント)

王と対話するためには、その言葉を理解し、伝えるための「使徒(クライアント)」が必要だ。 新たなコンソールアプリのプロジェクトを創り、サーバと同様に、gRPCとNLogに必要なパッケージを授ける。

使徒の心得:greet.proto

王との対話の作法を記した、greet.protoという名の聖典を、サーバの神殿からコピーする。ただし、csharp_namespaceは、この使徒自身の名であるGrpcGreeterClientへと書き換えねばならない。

魂の接続:Program.cs

いよいよ、使徒が王と対話する、感動の瞬間だ。 ipconfigで突き止めた、王の神殿の座標(IPアドレス)を指定する。そして、自己署名証明書という結界を信頼する、という誓いを立てることを忘れてはならない。

// 王の神殿の座標
var server = "https://172.18.149.227:7217";

var option = new GrpcChannelOptions()
{
    HttpClient = new HttpClient(new HttpClientHandler
    {
        // 自己署名証明書という結界を、信頼する
        ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator,
    })
};
var channel = GrpcChannel.ForAddress(server, option);
var client = new Greeter.GreeterClient(channel);

// 使徒が王へ、最初の言葉を投げかける
var response = await client.SayHelloAsync(new HelloRequest { Name = "World" });

対話の記録:Log2Console

Log2Consoleという名の真実の鏡を覗き込めば、王と使徒、二つの魂が交わした、荘厳な対話の記録を、その目で確かめることができる。

Log2Console によるログの確認

真実の鏡に映る、王と使徒の対話

羊皮紙を巻く前に

WCFの時代は終わった。しかし、我々はgRPCという、より強力な魔法を手に入れた。 localhostの壁を越え、IPアドレスで世界と繋がるためのlaunchSettings.jsonの書き換えは、些細だが、決定的に重要な儀式だった。

この旅で得た知見は、次の冒険、すなわち「Linux」という異世界でのゴーレム錬成へと繋がっていく。

この羊皮紙が、同じように古き王との別れを悲しみ、新たなる王への忠誠を誓う、未来の冒険者の助けとなることを願う。

おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が「古き王は死んだ、新しい王の時代だ!」なんて、一人で興奮している。俺に言わせりゃ、王様なんてのは、誰だっていいんだ。ちゃんと俺に、美味い干し草と、新鮮な水をくれる王様ならな。まったく、人間の忠誠心ってやつは、よく分からんぜ。やれやれだぜ。