using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Shared; using Microsoft.AspNetCore.Http; using System.Net; using System.Text.Json; namespace BMA.EHR.Domain.Middlewares { public class ErrorHandlerMiddleware { private readonly RequestDelegate _next; public ErrorHandlerMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { try { await _next(context); var response = context.Response; var statusCode = response.StatusCode; // ตรวจสอบว่า response ยังไม่ถูกส่งและเป็น status code ที่ต้องการจัดการ if (!response.HasStarted && (statusCode == (int)HttpStatusCode.Unauthorized || statusCode == (int)HttpStatusCode.Forbidden)) { var responseModel = new ResponseObject { Status = statusCode, Message = statusCode == (int)HttpStatusCode.Unauthorized ? GlobalMessages.NotAuthorized : GlobalMessages.ForbiddenAccess }; response.ContentType = "application/json"; // ใช้ JsonSerializer แทน WriteAsJsonAsync เพื่อความปลอดภัย var jsonResponse = JsonSerializer.Serialize(responseModel); await response.WriteAsync(jsonResponse); } } catch (Exception error) { await HandleExceptionAsync(context, error); } } private static async Task HandleExceptionAsync(HttpContext context, Exception error) { var response = context.Response; // ตรวจสอบว่า response ยังไม่ถูกส่งไป if (response.HasStarted) { // ถ้า response เริ่มแล้ว ไม่สามารถแก้ไขได้ แค่ log Console.WriteLine("Cannot write error response, stream already started."); Console.WriteLine($"Error: {error}"); return; } try { // Clear response เฉพาะเมื่อยังไม่ได้เริ่มส่ง response.Clear(); response.ContentType = "application/json"; response.StatusCode = (int)HttpStatusCode.InternalServerError; // สร้าง error message var msg = error.Message; var inner = error.InnerException; while (inner != null) { msg += $" {inner.Message}\r\n"; inner = inner.InnerException; } var responseModel = new ResponseObject { Status = response.StatusCode, Message = GlobalMessages.ExceptionOccured, Result = msg }; // ใช้ JsonSerializer และ WriteAsync เพื่อหลีกเลี่ยงปัญหา stream var jsonResponse = JsonSerializer.Serialize(responseModel); await response.WriteAsync(jsonResponse); } catch (Exception writeError) { // ถ้าเขียน response ไม่ได้ ให้ log error Console.WriteLine("Failed to write error response:"); Console.WriteLine($"Original Error: {error}"); Console.WriteLine($"Write Error: {writeError}"); } } } } // using BMA.EHR.Domain.Common; // using BMA.EHR.Domain.Shared; // using Microsoft.AspNetCore.Http; // using System.Net; // // namespace BMA.EHR.Domain.Middlewares // { // public class ErrorHandlerMiddleware // { // private readonly RequestDelegate _next; // // public ErrorHandlerMiddleware(RequestDelegate next) // { // _next = next; // } // // public async Task Invoke(HttpContext context) // { // try // { // await _next(context); // // var response = context.Response; // var statusCode = response.StatusCode; // // if (!response.HasStarted && // (statusCode == (int)HttpStatusCode.Unauthorized || statusCode == (int)HttpStatusCode.Forbidden)) // { // var responseModel = new ResponseObject // { // Status = statusCode, // Message = statusCode == (int)HttpStatusCode.Unauthorized // ? GlobalMessages.NotAuthorized // : GlobalMessages.ForbiddenAccess // }; // // response.ContentType = "application/json"; // await response.WriteAsJsonAsync(responseModel); // } // } // catch (Exception error) // { // var response = context.Response; // // if (!response.HasStarted) // { // response.Clear(); // response.ContentType = "application/json"; // response.StatusCode = (int)HttpStatusCode.InternalServerError; // // var msg = error.Message; // var inner = error.InnerException; // while (inner != null) // { // msg += $" {inner.Message}\r\n"; // inner = inner.InnerException; // } // // var responseModel = new ResponseObject // { // Status = response.StatusCode, // Message = GlobalMessages.ExceptionOccured, // Result = msg // }; // // await response.WriteAsJsonAsync(responseModel); // } // else // { // // logging กรณีที่ response เริ่มถูกส่งแล้ว // Console.WriteLine("Cannot write error response, stream already started."); // Console.WriteLine(error); // } // } // } // } // }