Обработка необработанных исключений в. Net Core 2.2 - PullRequest
0 голосов
/ 21 января 2020

Я делаю обработку исключений на уровне приложения в .NetCore 2.2. Но столкнулся с некоторой проблемой

Так что в моем файле startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        //app.UseDeveloperExceptionPage();
        app.UseExceptionHandler("/GlobalException");
        app.UseStatusCodePagesWithReExecute("/Error/{0}");
    }
    else
    {
        app.UseExceptionHandler("/GlobalException");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    //app.UseAuthentication();
    app.UseSession();
    //app.UseCookiePolicy();
    app.UseMiddleware<AuthenticationMiddleware>();
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Account}/{action=Index}/{id?}");
    });            
}

и ExceptionController.cs есть

public class ExceptionController : Controller
{
    [Route("Error/{statusCode}")]
    public IActionResult HttpStatusCodeHandler(int statusCode)
    {
        var statusCodeResult = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
        switch (statusCode)
        {
            case 404:
                ViewBag.ErrorMessage = "Sorry, the resource you requested could not be found";
                break;
            default:
                ViewBag.ErrorMessage = "Sorry, the resource you requested could not be found";
                break;
        }
        return View();
    }

    [AllowAnonymous]
    [Route("GlobalException")]
    public IActionResult GlobalException()
    {
        var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
        var exceptionPath = exceptionHandlerPathFeature.Path;
        var exceptionMessage = exceptionHandlerPathFeature.Error.Message;
        var exceptionStackTrace = exceptionHandlerPathFeature.Error.StackTrace;
        ViewBag.ErrorMessage = "Sorry, the resource you requested could not be found";

        //return await HttpContext.Response.Body.WriteAsync(JsonConvert.SerializeObject("he"));
        //return View("GlobalException");//"~/Views/Shared/HttpStatusCodeHandler.cshtml"
        return View("~/Views/Exception/GlobalException.cshtml");
    }
}

AuthenticationMiddleware.cs

public async Task Invoke(HttpContext context)
{
    bool isAjaxCall = context.Request.Headers["x-requested-with"] == "XMLHttpRequest";

    if(isAjaxCall)
    {
        // someAjax related functionality.
    }
    else if (!context.Request.Path.Value.Contains("/account/Index"))
    {
        if (context.Session.Keys.Contains("UserName"))
        {
            await _next.Invoke(context);
        }
        else
        {
            context.Response.Redirect("/account/Index");
        }
    }
    else if (context.Request.Path.Value.Contains("/GlobalException"))
    {
        await _next.Invoke(context);
    }
    await _next.Invoke(context);
}

Я могу перейти на все страницы исключений, когда я получаю 404, и другие ошибки. Но когда в приложении возникает любое исключение времени выполнения. GlobalException () выполняется, но в интерфейсе пользователя он не перемещается в этом представлении.

Попытка вызвать исключение для целей тестирования

public ActionResult RaiseException()
{
    throw new Exception();
}

Может кто-нибудь помочь мне с этим, так как я борюсь с двух дней. Пожалуйста, предоставьте мне лучший подход, если это возможно. Спасибо.

...