スポンサーリンク

Blazor Server で Exception を処理する

.NET CoreBlazor Server 5.0C#Visual Studio 2019

Exception が発生した際に、ログ出力、画面出力しています。
ユーザーにはメッセージのみ表示し、ソースコードはログを見ないと確認できないようにすることで、ソースコードの漏洩を防ぎ、尚且つ、バグなどで予期せず処理に失敗したことをユーザーへ通知しています。
ソースコードはGitHubで公開しています。

実装方式について

ASP.NET Core Blazor アプリのエラーを処理する | Microsoft Docs を参考に作った機能です。
ユーザが限られる業務系システム向けに作ったものなので例外メッセージを表示していますが、コンシューマ向けシステムで使う場合は例外メッセージの表示は避け、定型のエラーメッセージが表示されるように修正してから使った方が良いです。

全てのイベントハンドラに、この try-catch 処理を加えることで、「An unhandled exception has occurred. See browser dev tools for details. Reload」の表示を防げる。
「An unhandled exception has occurred. See browser dev tools for details. Reload」エラーが開発時に表示されるのは構わないが、本環境へリリース後、ユーザーにも表示されると、「Reload」先の画面でソースコードが漏洩し、セキュリティリスクが生まれてしまう。

ソースコード構成

Blazor Server で使える、使い勝手の良い MessageBoxBlazor Server でログを出力する を加えたものをベースに、 Exception処理を追加しています。

ソースコード変更内容を解説

Shared/UnexpectedException.razor

・Exception を処理する共通部品。
・Exceptionをパラメータとして受け取り、 Exception の Message と StackTrace を、Visual Studio の「出力」ウィンドウとログファイルへ出力し、Exception の Message のみをユーザーに表示している。
・RenderFragment、CascadingValue を利用することで、共通部品を使用する側のソースコードを最小限にしている。

App.razor

・UnexpectedException共通部品を全画面で使えるように、外側へ追加している。

Pages/Counter.razor

・イベントハンドラに try-catch を追加し、Exception を UnexpectedException共通部品で処理している。
・throw new NotImplementedException() はデモ用に加えた処理。

コメント

タイトルとURLをコピーしました