From 0e74ad730c7e51570f2c03c1e2d9bf713acc710a Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Fri, 4 Jul 2025 14:57:25 +0700 Subject: [PATCH] fix Middleware --- ...ombinedErrorHandlerAndLoggingMiddleware.cs | 57 +++++++++++++++++-- .../Controllers/LeaveBeginningController.cs | 2 +- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/BMA.EHR.Domain/Middlewares/CombinedErrorHandlerAndLoggingMiddleware.cs b/BMA.EHR.Domain/Middlewares/CombinedErrorHandlerAndLoggingMiddleware.cs index cd27ee75..48626f19 100644 --- a/BMA.EHR.Domain/Middlewares/CombinedErrorHandlerAndLoggingMiddleware.cs +++ b/BMA.EHR.Domain/Middlewares/CombinedErrorHandlerAndLoggingMiddleware.cs @@ -222,6 +222,38 @@ namespace BMA.EHR.Domain.Middlewares var response = context.Response; var statusCode = response.StatusCode; + + + string? message = null; + string? responseBodyJson = null; + if (memoryStream.Length > 0) + { + memoryStream.Seek(0, SeekOrigin.Begin); + var responseBody = new StreamReader(memoryStream).ReadToEnd(); + + var jsonOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + WriteIndented = true, + Converters = { new DateTimeFixConverter() } + }; + responseBodyJson = + JsonSerializer.Serialize(JsonSerializer.Deserialize(responseBody), jsonOptions); + + var json = JsonSerializer.Deserialize(responseBody); + if (json.ValueKind == JsonValueKind.Array) + { + message = "success"; + } + else + { + if (json.TryGetProperty("message", out var messageElement)) + { + message = messageElement.GetString(); + } + } + } Console.WriteLine($"FormatResponse: StatusCode={statusCode}, HasStarted={response.HasStarted}"); @@ -230,7 +262,7 @@ namespace BMA.EHR.Domain.Middlewares { Console.WriteLine($"Formatting response for status: {statusCode}"); - var responseModel = CreateResponseModel(statusCode); + var responseModel = CreateResponseModel(statusCode,message); // Clear memory stream และเขียน response ใหม่ memoryStream.SetLength(0); @@ -246,6 +278,10 @@ namespace BMA.EHR.Domain.Middlewares }; var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions); var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse); + + // กำหนด Content-Length ให้ตรงกับขนาดจริง + response.ContentLength = bytes.Length; + await memoryStream.WriteAsync(bytes, 0, bytes.Length); Console.WriteLine($"Response formatted successfully: {jsonResponse}"); @@ -255,7 +291,7 @@ namespace BMA.EHR.Domain.Middlewares { Console.WriteLine($"Creating response body for {statusCode} status"); - var responseModel = CreateResponseModel(statusCode); + var responseModel = CreateResponseModel(statusCode,message); response.ContentType = "application/json; charset=utf-8"; var jsonOptions = new JsonSerializerOptions @@ -265,6 +301,10 @@ namespace BMA.EHR.Domain.Middlewares }; var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions); var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse); + + // กำหนด Content-Length ให้ตรงกับขนาดจริง + response.ContentLength = bytes.Length; + await memoryStream.WriteAsync(bytes, 0, bytes.Length); Console.WriteLine($"Response body created: {jsonResponse}"); @@ -304,8 +344,8 @@ namespace BMA.EHR.Domain.Middlewares var responseModel = new ResponseObject { Status = response.StatusCode, - Message = GlobalMessages.ExceptionOccured, - Result = GetErrorMessage(error) + Message = GetErrorMessage(error), + Result = null }; var jsonOptions = new JsonSerializerOptions @@ -315,6 +355,11 @@ namespace BMA.EHR.Domain.Middlewares }; var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions); var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse); + + // กำหนด Content-Length ให้ตรงกับขนาดจริง + response.ContentLength = bytes.Length; + + await memoryStream.WriteAsync(bytes, 0, bytes.Length); Console.WriteLine($"Exception response formatted: {jsonResponse}"); @@ -456,7 +501,7 @@ namespace BMA.EHR.Domain.Middlewares statusCode == (int)HttpStatusCode.InternalServerError; } - private static ResponseObject CreateResponseModel(int statusCode) + private static ResponseObject CreateResponseModel(int statusCode,string? error) { var message = statusCode switch { @@ -473,7 +518,7 @@ namespace BMA.EHR.Domain.Middlewares return new ResponseObject { Status = statusCode, - Message = message + Message = error ?? message }; } diff --git a/BMA.EHR.Leave/Controllers/LeaveBeginningController.cs b/BMA.EHR.Leave/Controllers/LeaveBeginningController.cs index 7de56dc6..e37ab06a 100644 --- a/BMA.EHR.Leave/Controllers/LeaveBeginningController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveBeginningController.cs @@ -303,7 +303,7 @@ namespace BMA.EHR.Leave.Service.Controllers if (oldData is not null) { - return Error("ไม่สามารถบันทึกข้อมูล เนื่องจากมีข้อมูลในระบบแล้ว",StatusCodes.Status400BadRequest); + return Error("ไม่สามารถบันทึกข้อมูล เนื่องจากมีข้อมูลในระบบแล้ว"); } var leaveBeginning = new LeaveBeginning();