【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で動かしてみます。動かし方はこちらの記事を参考にしてください。
起動すると以下のような表示になります。
で、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}");
}
-
公式ドキュメントは内容があまり無いので、探り探り…… ↩︎
-
ソースコードを読んで探りました。そしてこの記事を書いてる途中にドキュメントの端に書いてあることに気づきました ↩︎
-
本番環境では無効にしておきましょう。言うまでもないことですが。 ↩︎
Discussion