Как открыть страницу пользовательских ошибок в ASP.NET, когда поставщик состояния сеанса не работает? - PullRequest
8 голосов
/ 23 июня 2011

Я пытаюсь показать страницу ошибок клиента в ASP.NET, когда база данных не работает.Я использую режим SQL Server для хранения данных сеанса.Проблема в том, что пользовательская страница ошибок никогда не вызывается.

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

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

Ответы [ 3 ]

1 голос
/ 17 августа 2011

Я полагаю, что ошибка связана с тем, что, поскольку вы используете провайдер состояния сеанса нехватки памяти (являющийся базой данных), и соединение с базой данных имеет сбой, то в веб-конфигурации фактически обнаруживается ошибка (нет в приложении). У меня похожая проблема, когда я использую AppFabric Cache для своего поставщика состояния сеанса, но когда служба AppFabric Cache не работает, я получаю страницу Ошибка конфигурации.

Из-за этого вы не можете использовать решение customErrors, как уже предложило FlyingStreudel, поскольку это не ошибка в вашем приложении, а скорее при загрузке конфигурации.

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

Обновление: После некоторого изучения этого момента, похоже, моя проблема связана с тем, что SessionStateModule заставляет поставщика состояния сеанса кэша AppFabric пытаться подключиться к DataCache (который недоступен). ), и где-то выбрасывается исключение (вероятно, тайм-аут). Поскольку это происходит в Init модуля HTTP, кажется, что нет никакого пути вокруг желтого экрана смерти .

Я не удивлюсь, если проблема оригинального плаката будет такой же - соединение с сервером SQL, возникающее при инициализации модуля SessionStateModule.

1 голос
/ 23 июня 2011

Добавить что-то подобное в ваш web.config?

<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
    <error statusCode="403" redirect="NoAccess.htm" />
    <error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>

Вы можете прочитать дополнительную информацию здесь

Если сбой происходит в вашем SqlSessionState, выследует обработать соответствующую ошибку в событии Application_Error в Global.asax

Более подробную информацию можно получить здесь

0 голосов
/ 26 июня 2018

Поскольку страница ошибки - это страница ASP.NET (я вижу это по вашему комментарию), она попадет в базу данных сеанса в жизненном цикле страницы. Вы должны установить ниже директиву на странице Error.aspx, чтобы указать ASP.Net не загружать информацию о сеансе для нее:

EnableSessionState="false"

Обратите внимание, это будет работать только в том случае, если вы не используете информацию о сеансе на странице ошибок.

Кроме того, я также управлял страницей Global.asax, как показано ниже:

    private static Exception startException;
     protected void Application_Start()
            {
                try
                {
                    AreaRegistration.RegisterAllAreas();
                    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                    RouteConfig.RegisterRoutes(RouteTable.Routes);
                    BundleConfig.RegisterBundles(BundleTable.Bundles);
                    ModelBinders.Binders.Add(typeof(DateTime), new MyDateTimeModelBinder());

                }
                catch (Exception ex)
                {
                    startException = ex;
                }
            }
  static HashSet<string> allowedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    ".js", ".css", ".png",".jpg",".jpeg",".gif",".bmp"
};

        public bool IsStaticFile(HttpRequest request)
     {  //My project was a mix of asp.net web forms & mvc so had to write this      
                if (Request.RawUrl.ToLower().Contains("/bundles/") || Request.RawUrl.ToLower().Contains("/frontendcss?") ||
                     Request.RawUrl.ToLower().Contains("/fonts/") 
//these are my css & js bundles. a bit of hack but works for me.
                     )
                {
                return true;
            }
            string fileOnDisk = request.PhysicalPath;
            if (string.IsNullOrEmpty(fileOnDisk))
            {
                return false;
            }

            string extension = Path.GetExtension(fileOnDisk).ToLower();

            return allowedExtensions.Contains(extension);
        }
     protected void Application_BeginRequest()
            {
                if (startException != null && Request.RawUrl.ToLower() == "/Error.aspx".ToLower())
                {
                    return;
                }
                if (startException != null && IsStaticFile(Request))
                {
                    return;
                }

                if (startException != null && Request.RawUrl.ToLower()!= "/Error.aspx".ToLower())
                {
                    //Response.Redirect("Error.aspx");
                    Server.Transfer("Error.aspx");
                    this.Context.AddError(startException);                
                    return;
                }


            }
        protected void Application_Error(object sender, EventArgs e)
                {
                   Exception exception = Server.GetLastError();
                     Response.Clear();
                    Server.ClearError(); 
                   Server.Transfer("Error.aspx");     
                }
...