Глобальный обработчик исключений - перенаправление с данными - PullRequest
0 голосов
/ 28 февраля 2019

Я хотел бы спросить, как перенаправить из обработчика исключений, например, в действие ErrorPage из Error контроллера с сообщением об исключении в качестве параметра этого метода?

Пока я пробовал это, но строкав методе контроллера нуль

app.UseExceptionHandler(
options =>
 {
     options.Run(
     async httpcontext =>
     {
         httpcontext.Response.ContentType = "text/html";
         var ex = httpcontext.Features.Get<IExceptionHandlerFeature>();
         if (ex != null)
         {
             httpcontext.Items.Add.("error", ex.Error.Message);
             httpcontext.Response.Redirect("/Error/ErrorPage/");
         }
     });
});

Протестировано с этим:

public IActionResult ErrorPage()
{
    var err = HttpContext.Items.ContainsKey("error") ? HttpContext.Items["error"] : "Error";
    // other logic
    return View("ExceptionView", err);
}

и этот:

public IActionResult ErrorPage(string error)
{
    // other logic
    return View("ExceptionView", error);
}

Также пробовал таким образом:

app.UseExceptionHandler(
options =>
{
     options.Run(
     async httpcontext =>
     {
         httpcontext.Response.ContentType = "text/html";
         var ex = httpcontext.Features.Get<IExceptionHandlerFeature>();
         if (ex != null)
         {
             //httpcontext.Request.Path = "/Error/ErrorPage/";
             //httpcontext.Request.QueryString = new QueryString($"?error={ex.Error.Message}");

             await httpcontext.Response.WriteAsync(JsonConvert.SerializeObject(new
             {
                 error = ex.Error.Message
             }));

             httpcontext.Response.Redirect("/Error/ErrorPage/");
         }
     });
});

С обоими: с и без [FromBody]

public IActionResult ErrorPage([FromBody] string error)
{
    // other logic
    return View("ExceptionView", error);
}

Весь контроллер

public class Error : ControllerBase
{
    public Error(Context context)
    {
        _context = context;
    }

    public IActionResult ErrorPage([FromBody] string error)
    {
        return View("ExceptionView", error);
    }
}

1 Ответ

0 голосов
/ 28 февраля 2019

Вот наши настройки:

Startup.cs

public virtual void Configure(
        IApplicationBuilder app,
        IHostingEnvironment env,
        ILoggerFactory loggerFactory,
        IApplicationLifetime lifetime)
    {

        ... 

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Errors");
        }
        ...
}

ErrorsController.cs:

public class ErrorsController : Controller
{
    private readonly ILogger<ErrorController> _logger;
    private readonly IHostingEnvironment _environment;
    private readonly IHttpContextAccessor _httpContext;
    private readonly JiraSettings _jiraSettings;

    public ErrorController(
        ILogger<ErrorController> logger,
        IHostingEnvironment environment,
        IHttpContextAccessor httpContext)
    {
        _logger = logger;
        _environment = environment;
        _httpContext = httpContext;
    }

    [HttpGet]
    public IActionResult Get()
    {
        var exception = HttpContext.Features.Get<IExceptionHandlerFeature>();
        if (exception?.Error == null)
        {
            return NoContent();
        }

        var errorMessage = $"An error occurred while processing your request {exception.Error.GetErrorId()}";
        if (_environment.IsProduction() || _environment.IsStaging())
        {
            return Json(errorMessage);
        }

        errorMessage += $"\n{exception.Error.StackTrace}";
        return Json(errorMessage);
    }

Магия IExceptionHandlerFeature, которая дает вам доступк оригинальному объекту исключения.Как вы можете видеть, мы выводим ошибки в виде строки, как мы делаем угловое приложение, в котором javascript получает строку сообщения об ошибке.Вместо этого вы можете создать модель представления и вернуть представление.Мы не отображаем информацию об исключениях в производственной или промежуточной среде.GetErrorId() - это метод расширения, который мы написали, который получает уникальный идентификатор для исключения.Идентификатор ошибки отображается как для пользователя, так и записывается в журналах (в других местах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...