2016-02-11 3 views
0

У меня есть немного промежуточного программного обеспечения, написанное, что при обратном вызове проверяется, является ли ответ 500. Если это 500, я хочу вернуть исключение, которое было выбрано. Как получить исключение, которое было добавлено в приложение?Получите исключение, которое было выбрано ранее в приложении C#?

Startup.cs

... 
app.UseMiddleware<APIExceptionMiddleware>(); 

// Add MVC to the request pipeline. 
app.UseMvc(); 
... 

APIExceptionMiddleware.cs:

public class APIExceptionMiddleware 
    { 
     private readonly RequestDelegate _next; 

     public APIExceptionMiddleware(RequestDelegate next) 
     { 
      _next = next; 
     } 

     public async Task Invoke(HttpContext context) 
     { 
      context.Response.OnStarting(
       callback: (state) => 
       { 
        HttpResponse response = (HttpResponse)state; 
        if (response.StatusCode == 500) 
        { 
         // want to grab exception here turn it into JSON response place it in the response.Body but not sure how I access the exception. 
         return response.WriteAsync("An Error Occured"); 
        } 
        return Task.FromResult<object>(null); 
       }, state: context.Response); 


      await _next.Invoke(context); 
     } 
    } 

Так как запрос идет в UseMvc() У меня есть исключение, которое выдается. Я могу использовать app.UseDeveloperException(); и получить приятную дружественную HTML-страницу с помощью stacktrace и exception.

Я хочу почти повторить это, но сделаю его приятным дружественным ответом АИС для JSON для моего приложения. SO, если выбрано 500, я использую промежуточное ПО, где я собираюсь превратить это в симпатичный ответ json и отправить его в качестве своего ответа через запрос api. Моя проблема в том, как получить это исключение в промежуточном программном обеспечении?

Если UseDeveloperException() делает это, не должен ли я иметь возможность?

+0

context.Error? – pnm

+0

нет контекста.Error – allencoded

+0

Вы имеете в виду, что нет выставленного объекта недвижимости или его нет в наличии? – pnm

ответ

1

Посмотрите на код для DeveloperExceptionPageMiddleware ... в частности посмотрите на Invoke(HttpContext context) (показано ниже). Вместо использования этого промежуточного ПО по умолчанию, которое вы сейчас добавляете, используйте свой собственный, который вы начали. Это будет очень похоже на DeveloperExceptionPageMiddleware: поймать любое исключение, но вместо того, чтобы возвращать страницу с ошибкой, просто отформатируйте ответ JSON по желанию.

public async Task Invoke(HttpContext context) 
{ 
    try 
    { 
     await _next(context); 
    } 
    catch (Exception ex) 
    { 
     _logger.LogError(0, ex, "An unhandled exception has occurred while executing the request"); 

     if (context.Response.HasStarted) 
     { 
      _logger.LogWarning("The response has already started, the error page middleware will not be executed."); 
      throw; 
     } 

     try 
     { 
      context.Response.Clear(); 
      context.Response.StatusCode = 500; 

      await DisplayException(context, ex); 

      if (_diagnosticSource.IsEnabled("Microsoft.AspNetCore.Diagnostics.UnhandledException")) 
      { 
       _diagnosticSource.Write("Microsoft.AspNetCore.Diagnostics.UnhandledException", new { httpContext = context, exception = ex }); 
      } 

      return; 
     } 
     catch (Exception ex2) 
     { 
      // If there's a Exception while generating the error page, re-throw the original exception. 
      _logger.LogError(0, ex2, "An exception was thrown attempting to display the error page."); 
     } 
     throw; 
    } 
} 
+0

Это именно то, что я искал. – allencoded

+0

Имейте в виду, что утечка информации о вашей системе является риском для безопасности. – jltrem

+0

Да, у меня есть несколько горстка, я хочу передать не все из них. Я буду использовать решение передать те, кого я хочу игнорировать остальных. Благодаря! – allencoded

Смежные вопросы