Web API for the bulk printing desktop application.

ExceptionHandlerMiddleware.cs 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using MAX;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.Extensions.Logging;
  4. using Newtonsoft.Json;
  5. using System;
  6. using System.Threading.Tasks;
  7. namespace BulkPrintingAPI.Middleware
  8. {
  9. public class ExceptionHandlerMiddleware
  10. {
  11. private readonly RequestDelegate _next;
  12. private ILogger _logger;
  13. private class ErrorResponse
  14. {
  15. public ErrorResponse(string message)
  16. {
  17. code = null;
  18. error = message;
  19. }
  20. public ErrorResponse(MAXException e)
  21. {
  22. code = e.ErrorCode;
  23. error = e.Message;
  24. }
  25. public int? code { get; set; }
  26. public string error { get; set; }
  27. }
  28. public ExceptionHandlerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
  29. {
  30. _next = next;
  31. _logger = loggerFactory.CreateLogger(GetType().FullName);
  32. }
  33. public async Task Invoke(HttpContext context)
  34. {
  35. try
  36. {
  37. await _next(context);
  38. }
  39. catch (Exception e)
  40. {
  41. if (context.Response.HasStarted)
  42. {
  43. _logger.LogWarning("Response has already started; exception will be rethrown");
  44. throw;
  45. }
  46. _logger.LogError(0, e, "Unhandled exception");
  47. ErrorResponse response;
  48. if (e is MAXException)
  49. {
  50. response = new ErrorResponse((MAXException)e);
  51. }
  52. else
  53. {
  54. // Don't want to leak arbitrary exception messages to the user
  55. response = new ErrorResponse("The server encountered an unexpected error");
  56. }
  57. context.Response.StatusCode = 500;
  58. context.Response.ContentType = "application/json";
  59. await context.Response.WriteAsync(JsonConvert.SerializeObject(response));
  60. }
  61. }
  62. }
  63. }