【问题标题】:How to Reach the Custom Errors page in ASP.NET when Session State Provider is Down?会话状态提供程序关闭时如何访问 ASP.NET 中的自定义错误页面?
【发布时间】:2011-09-21 12:03:44
【问题描述】:

当数据库关闭时,我试图在 ASP.NET 中显示客户错误页面。我使用 SQL Server 模式来保存会话数据。问题是从未调用自定义错误页面。

由于会话数据和数据库在同一台服务器上,这不会重定向到自定义错误页面吗?我猜 Web 应用程序此时尚未加载?用户会看到会话状态连接失败的堆栈跟踪。

似乎我们需要在初始网站加载之前放置一些东西来检查与数据库的连接。关于如何实现这一点的任何想法?

【问题讨论】:

标签: c# asp.net sql-server session-state


【解决方案1】:

将类似的内容添加到您的 web.config 中?

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

您可以阅读更多信息here

如果是你的SqlSessionState失败了,你应该在Global.asaxApplication_Error事件中处理相应的错误

您可以阅读更多信息here

【讨论】:

  • DB宕机时如何知道statusCode?​​span>
  • 如果我在 Application_Error 事件中放置任何内容,它也不会达到调试点?
  • 如果您不指定状态码,您将被推送到默认重定向。
  • 我认为问题在于 IIS 尝试加载应用程序,但由于会话状态提供程序在连接数据库时失败,因此将其视为 web.config 文件中的配置错误,而不是应用程序错误。看我的回答:)
  • @jamiebarrow - AFAIK 你无法捕获配置错误。它们是由 CLR 抛出的,而不是在读取 web.config 时您的应用程序。如果由于初始化状态提供程序而导致配置错误,则需要更改方法。如果您希望任何应用代码运行,则 web.config 应该始终成功。
【解决方案2】:

我认为错误是由于您使用的是内存不足的会话状态提供程序(即数据库),并且数据库连接失败,因此实际上在 Web 配置中存在感知错误(不在应用程序中)。我有一个类似的问题,我正在为我的会话状态提供程序使用 AppFabric 缓存,但是当 AppFabric 缓存服务关闭时,我得到了配置错误页面。

因此,您不能像 FlyingStreudel 已经建议的那样使用 customErrors 解决方案,因为这不是您的应用程序中的错误,而是在加载配置时。

我四处寻找解决此问题的方法,但找不到任何方法。我希望这个问题能得到解答,它已经让我对各种错误配置选项感到困惑......

更新:现在调查了一段时间后,我的问题似乎来自 SessionStateModule 导致 AppFabric 缓存会话状态提供程序尝试连接到 DataCache(这不是可用),并且在某处抛出异常(可能是超时)。 因为这发生在 HTTP 模块的 Init 中,所以似乎没有办法绕过黄屏死机

如果原始发布者的问题是相同的,我不会感到惊讶 - 与 SQL 服务器的连接发生在 SessionStateModule 的初始化中。

【讨论】:

【解决方案3】:

因为错误页面是一个 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");     
                }

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 2012-08-23
    • 2011-06-09
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多