🧅

【C#】MagicOnionのJsonTranscodingを使ってみる

に公開

まえがき

MagicOnionのサーバー開発を行う際に、動作確認用のUIがあると便利です。
公式にJsonTranscodingという機能が用意されています。
というわけで早速これを使ってみます。[1]

導入

まずMagicOnion.Server.JsonTranscoding.SwaggerをNuGetから導入します。

dotnet add package MagicOnion.Server.JsonTranscoding.Swagger

次にProgram.csを以下のように修正します。

// 前略
var isDevelopment = builder.Environment.IsDevelopment();
var magicOnion = builder.Services.AddMagicOnion();
if (isDevelopment)
{
    // 開発時専用でSwaggerを有効化
    magicOnion.AddJsonTranscoding();
    builder.Services.AddMagicOnionJsonTranscodingSwagger();
    builder.Services.AddSwaggerGen();
}

var app = builder.Build();
if (isDevelopment)
{
    // 開発時専用でSwaggerを有効化
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        // ルートパスでSwagger UIを表示する
        c.RoutePrefix = "";
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    });
}
// 後略

もしHTTPSでホストしていない場合、HTTP/2で動かしているとSwaggerUIが動作しないので、appsettings.jsonを修正します。

{
  "Kestrel": {
    "Endpoints": {
      "http": {
        "Url": "http://localhost:5110",
        "Protocols": "Http2"
+     },
+     "swagger": {
+       "Url": "http://localhost:5111",
+       "Protocols": "Http1"
      }
    }
  }
}

動かしてみる

Aspireで動かしてみます。動かし方はこちらの記事を参考にしてください。
https://zenn.dev/arika/articles/20250822-aspire-magiconion

起動すると以下のような表示になります。

で、http://localhost:5111にアクセスすると...

とこのようにAPIを叩けるようになります。これは便利。

例外発生時にスタックトレースを出す

このままだと例外発生時にスタックトレースが表示されません。具体的には以下のようなエラーが帰ってきます。

Debug実行していても例外発生で止まってくれないのも相まって、なかなか不便!
というわけで、スタックトレースを表示する方法を探しました。[2]

どうやら options.IsReturnExceptionStackTraceInErrorDetailを有効にすれば良さそう。
というわけで、以下のように追記します。

var isDevelopment = builder.Environment.IsDevelopment();
-var magicOnion = builder.Services.AddMagicOnion();
+var magicOnion = builder.Services.AddMagicOnion(option =>
+{
+    option.IsReturnExceptionStackTraceInErrorDetail = isDevelopment;
+});

すると……

いけました。これでデバッグが捗ります。[3]

クライアント側で表示する

これはドキュメントにも書いてありますが、以下のようにして受け取れます。

try {
    await sampleService.GetSampleData();
}
catch(RpcException ex) {
    // = StatusCode.Unknown
    Console.WriteLine($"Code: {ex.Status.StatusCode}");
    // この中にスタックトレースが入る
    Console.WriteLine($"Error: {ex.Status.Detail}");
}
脚注
  1. 公式ドキュメントは内容があまり無いので、探り探り…… ↩︎

  2. ソースコードを読んで探りました。そしてこの記事を書いてる途中にドキュメントの端に書いてあることに気づきました ↩︎

  3. 本番環境では無効にしておきましょう。言うまでもないことですが。 ↩︎

GitHubで編集を提案

Discussion