Как отобразить пользовательскую страницу ошибки, когда исключение, созданное в .net core 2.0 PageFilter, не перехвачено exceptionHandler (app.UseExceptionHandler ...) - PullRequest
0 голосов
/ 31 августа 2018

В моем Startup.cs,

  public virtual void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory,
        IMemoryCache cache, CountyServicePaymentsContext countyServicePaymentsContext, PortalContext portalContext, 
        IPortalCountyInfoService portalCountyInfoService, ICountyServicePaymentService countyServicePaymentService)
    {
        app.UseSession(); 

        // Route the errors to the proper place based upon Dev or NOT...
        if (env.IsDevelopment())
        {
            //app.UseBrowserLink();
            //app.UseDeveloperExceptionPage();

            loggerFactory.AddConsole();
            loggerFactory.AddDebug();
        }

        app.UseExceptionHandler("/Error");

        app.UseStatusCodePagesWithReExecute("/Errors/Error{0}");
        ...

Ниже мой фильтр страницы (который используется для загрузки некоторых данных из файла cookie) и перенаправления в случае, если файл cookie не создан,

    public class PortalInfoFilter : IPageFilter
{
    private readonly string _trackingId;
    private readonly ILogger<PortalInfoFilter> _logger;

    public PortalInfoFilter(IConfiguration configuration,
        ILoggerFactory loggerFactory)
    {
        _trackingId = configuration["GoogleAnalytics:TrackingID"];
        _logger = loggerFactory.CreateLogger<PortalInfoFilter>();
    }

    public void OnPageHandlerExecuting(PageHandlerExecutingContext context)
    {
        try {

            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            string pci = null;
            var curPage = string.Empty;

            if (context?.HttpContext?.Session != null)
            {
                if (string.IsNullOrEmpty(_trackingId))
                {
                    _logger.LogError("Google Analytics TrackingID is empty!");
                }

                context.HttpContext.Session.SetString(Constants.TrackingId, _trackingId);
                pci = context.HttpContext.Request.Cookies[Constants.CountyInfoCookieName];

                curPage = context.HttpContext.Request.Path.ToString().ToLower();
            }

            var portalCountyInfo = new PortalCountyInfoDto();

            if (pci != null)
            {
                if (pci.Length > 0)
                {
                    try
                    {
                        portalCountyInfo = JsonConvert.DeserializeObject<PortalCountyInfoDto>(pci);
                    }
                    catch (Exception ex)
                    {
                        _logger.LogCritical(
                            $"Unable to deserialize and initialize portalCountyInfo from cookie = {Constants.CountyInfoCookieName} {ex}.",
                            ex);
                        // If there is any issues on the portal county info, blank it...
                        portalCountyInfo = null;

                        throw new PageHandlerExecutionAsyncException("Something unexpected happened while attempting to deserialize PortalCountyInfo.", ex);
                    }
                }
            }
            else
            {
                portalCountyInfo = null;
            }

            if (portalCountyInfo != null)
            {
                ConfigurePortalCountyInfoContextSession(ref context, portalCountyInfo);
            }

            curPage = curPage.Trim();
            if (curPage.Equals("/") || curPage.Equals("/index")) curPage = "/home";

            context?.HttpContext?.Session?.SetString(Constants.CurrentPage, curPage);

            if ((curPage.InStr("/search") || curPage.InStr("/checkout")) && portalCountyInfo == null)
            {
                if (context != null)
                {
                    context.Result = new RedirectResult(Constants.HomePage);
                }
            }
        }
        catch (Exception ex)
        {
            _logger.LogCritical($"Something unexpected happened {ex}", ex);
            throw new PageHandlerExecutionAsyncException("Something unexpected happened.", ex);
        }
    }

Я создал фильтр исключений и могу отлавливать там исключения из фильтра страниц, но после этого исключение, похоже, не следует за промежуточным программным обеспечением и не обрабатывается

 app.UseExceptionHandler("/Error");

 app.UseStatusCodePagesWithReExecute("/Errors/Error{0}");

в Startup.cs

Я не совсем понимаю, что происходит после того, как это исключение выдается (поток через промежуточное ПО).

Может ли кто-нибудь помочь мне понять, что происходит с этим исключением после того, как оно было сгенерировано, и почему оно не обрабатывается моими пользовательскими страницами? Как отобразить страницу с пользовательской ошибкой при возникновении этого исключения?

Я попытался создать промежуточное ПО для пользовательских исключений, и это исключение не проходит через него.

Любая помощь приветствуется.

...