From 7d0c5a0ee534375c1a07dac45bfcbfca5fdc1379 Mon Sep 17 00:00:00 2001 From: TekH Date: Thu, 11 Jun 2026 13:40:30 +0200 Subject: [PATCH] Improve error handling and logging for envelope receiver Added a null check in `EnvelopeReceiverPage.razor` to log a warning when `_envelopeReceiver` is null. Updated `ReportViewer.razor` to wrap `EnvelopeReceiverService.GetAsync` in a `try-catch` block, logging `HttpRequestException` errors and allowing the UI to handle null values gracefully. Enhanced `EnvelopeReceiverService.GetAsync` to throw detailed `HttpRequestException` on API failures, including status code and reason phrase. Added `using System.Net;` to support HTTP-related classes. Updated method documentation to reflect the new behavior. These changes improve error diagnostics, logging, and maintainability across the codebase. --- .../Pages/EnvelopeReceiverPage.razor | 4 ++++ .../Pages/Example/ReportViewer.razor | 8 +++++++- .../Services/EnvelopeReceiverService.cs | 15 ++++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/EnvelopeGenerator.ReceiverUI/Pages/EnvelopeReceiverPage.razor b/EnvelopeGenerator.ReceiverUI/Pages/EnvelopeReceiverPage.razor index 4f303d57..b1525967 100644 --- a/EnvelopeGenerator.ReceiverUI/Pages/EnvelopeReceiverPage.razor +++ b/EnvelopeGenerator.ReceiverUI/Pages/EnvelopeReceiverPage.razor @@ -576,6 +576,10 @@ const int MaxThumbnailWidth = 400; _signatures = signatures.Convert(UnitOfLength.Point); _envelopeReceiver = await EnvelopeReceiverService.GetAsync(EnvelopeKey); + if (_envelopeReceiver is null) + { + logger.LogWarning("Envelope receiver data is null for envelope {EnvelopeKey}", EnvelopeKey); + } await JSRuntime.InvokeVoidAsync("console.log", "Loaded signatures:", _signatures); diff --git a/EnvelopeGenerator.ReceiverUI/Pages/Example/ReportViewer.razor b/EnvelopeGenerator.ReceiverUI/Pages/Example/ReportViewer.razor index be0b6253..6e5f275e 100644 --- a/EnvelopeGenerator.ReceiverUI/Pages/Example/ReportViewer.razor +++ b/EnvelopeGenerator.ReceiverUI/Pages/Example/ReportViewer.razor @@ -343,7 +343,13 @@ Shown="OnPopupShownAsync"> } _annotations = await AnnotationService.GetAnnotationsAsync(EnvelopeKey); - _envelopeReceiver = await EnvelopeReceiverService.GetAsync(EnvelopeKey); + + try { + _envelopeReceiver = await EnvelopeReceiverService.GetAsync(EnvelopeKey); + } catch (HttpRequestException ex) { + // Log error but continue - UI will handle null envelope receiver gracefully + Console.WriteLine($"Failed to load envelope receiver: {ex.Message}"); + } if (!AppOptions.Value.UsePredefinedReports && !string.IsNullOrWhiteSpace(EnvelopeKey)) { try { diff --git a/EnvelopeGenerator.ReceiverUI/Services/EnvelopeReceiverService.cs b/EnvelopeGenerator.ReceiverUI/Services/EnvelopeReceiverService.cs index ff275789..944c77a8 100644 --- a/EnvelopeGenerator.ReceiverUI/Services/EnvelopeReceiverService.cs +++ b/EnvelopeGenerator.ReceiverUI/Services/EnvelopeReceiverService.cs @@ -1,3 +1,4 @@ +using System.Net; using System.Net.Http.Json; using System.Text.Json; using EnvelopeGenerator.ReceiverUI.Models; @@ -14,13 +15,25 @@ public class EnvelopeReceiverService(HttpClient http, IOptions apiOp { private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); + /// + /// Fetches the envelope receiver data for the given envelope key from the API. + /// Throws HttpRequestException on failure with appropriate status code. + /// + /// Thrown when the API request fails. public async Task GetAsync(string envelopeKey, CancellationToken cancel = default) { var url = $"{apiOptions.Value.BaseUrl}/api/EnvelopeReceiver/{Uri.EscapeDataString(envelopeKey)}"; var response = await http.GetAsync(url, cancel); if (!response.IsSuccessStatusCode) - return null; + { + var statusCode = (int)response.StatusCode; + var reasonPhrase = response.ReasonPhrase ?? "Unknown error"; + throw new HttpRequestException( + $"Failed to load envelope receiver data. Status: {statusCode} ({reasonPhrase})", + null, + response.StatusCode); + } return await response.Content.ReadFromJsonAsync(_jsonOptions, cancel); }