17

在我的全局中,当发生错误时,我有以下代码要处理

//[..] code goes here
  Server.Transfer("~/Error.aspx?ErrorID=" + errorId);

它曾经是一个Response.Redirect完美的工作,除了它改变了网址(这就是我想使用的原因Server.Transfer

不幸的是,现在当它尝试加载错误页面时,当它尝试引用Session

HttpException:
会话状态只能在 enableSessionState 设置为 true 时使用,无论是在配置文件中还是在 Page 指令中。还请确保 System.Web.SessionStateModule 或自定义会话状态模块包含在应用程序配置的 \\ 部分中。

我的配置和页面中都有 enableSessionState 。

我还发现了一些建议使用 Context.RewritePath 的链接——这只会为我加载一个空白页面。

使用Response.Redirect完美且符合预期,所以我认为Server.Transfer这是这里的问题。它是什么?

编辑代码:

protected void Application_Error(object sender, EventArgs e)
        {

            lock (_lockMe)
            {
                Exception ex = Server.GetLastError();

                if (ex != null)
                {
                    if (ex.InnerException != null)
                        ex = ex.InnerException;

                    ErrorLoggingManager.AddError(ex, new MembershipData(), ...); //etc
                }

                Server.ClearError();

                   //Some other database code for cleaning up some stuff when an error happens

                }

                try
                {
                    if (Response != null)
                    {
                        //Get the last error logged
                        MyDataContext db = new MyDataContext();
                        int errorId = db.LoggedErrors.OrderByDescending(le => le.ErrorId).Select(le => le.ErrorId).FirstOrDefault();

                        Server.Transfer("~/Error.aspx?ErrorID=" + errorId); 
                    }
                }
                catch (Exception)
                {
                }
            }
4

9 回答 9

2

因为您没有发布太多代码。所以没有看到你所做的实际实现。我可以建议你以下几点。

Point 1.首先,您需要检查是否SessionStateenabled页面。web.config您可以在文件中全局设置它们。试试snippet下面给出的web.config

<configuration>   
   <system.web>
   <pages enableSessionState="true" />
  </system.web>
</configuration>

第 2 点。然后把你放进RedirectionApplication_ErrorGlobal.asax

public void Application_Error(object sender, EventArgs e)
{
     HttpApplication app = (HttpApplication)sender;
     app.Server.Transfer("~/Error.aspx?ErrorID=" + errorId,true);
 }

第 3 点。还要检查你SessionState的设置是否正确IIS

详细信息在MSDN 上以启用 sessionstate

希望这可以帮助..!!!

于 2014-02-19T08:40:14.357 回答
1

据我了解, Server.Transfer 将另一个页面的内容发送给客户端,而不是请求的内容。如果是这种情况,那么我想知道它是否与将母版页应用于错误页面无关?几年前,我在使用早期技术时也遇到过类似的错误,结果发现母版页不喜欢我尝试做的事情。

我希望这至少有助于指出解决方案。

于 2014-02-20T05:02:33.263 回答
1

这就是问题所在:

如果存在页面呈现异常(例如“找不到文件”),则 Server.Transfer 会破坏会话。这与在页面渲染期间调用它有关。

只要您在错误发生之前不附加标头, Response.Redirect 就可以正常工作;但是,如果您使用 Response.AppendHeader 则 Response.Redirect 在页面呈现期间将不起作用。

尝试改用 HttpContext.Current.RewritePath。这应该可以解决所有这些问题。无论出于何种原因,RewritePath() 都不关心页面尚未完成渲染。

于 2015-11-09T20:43:07.203 回答
0

不久前,我在不同的环境中遇到了同样的问题。我不知道是不是你的情况,但如果你在 Windows 2008 上使用 IIS7,除了enableSessionState=true在 web.config 中设置之外,你还必须将模块放在该<system.webServer>部分中,而不是<system.web>. 改变这个小东西为我解决了它。

于 2014-02-18T17:57:57.473 回答
0

@user2110845:几个月前我遇到过类似的问题。问题在于网站名称中有下划线。我们在 IIS 中部署了一个具有两个不同主机名的网站(通过网站上的“编辑绑定”选项添加两个条目)。提供的主机名是 abc_ts、abc_is。删除下划线后,会话问题得到解决。网站主机名中似乎不允许使用某些字符。检查这是否是您的问题。我在这里找到了答案:链接(检查文章中的“更新 2”)

于 2014-02-20T04:49:56.047 回答
0

您没有提及您使用的是哪个版本的 ASP.NET,但在 2.0 和 3.5 之间,未处理的异常如何通过 ASP.NET Web 应用程序和 IIS 冒泡出现了一些变化。

在其他一些可能的情况下,当您清除未设置的错误Context.Response.TrySkipIisCustomErrors = true;虽然此特定标志可能与您的问题无关(并且仅适用于 3.5+),但它也可以帮助处理潜在的两个错误页面掩盖真正问题的场景。无论如何,它会为您节省很多其他潜在问题的痛苦(至少如果您运行的是 3.5+)。查看我几年前写的两篇文章,它们可能会有所帮助:虽然它们没有涵盖会话处理,但它们确实涵盖了我必须遵循的多个歌舞例程,以便在各种版本的 ASP 中正确处理 500 和 404 。网。有可能你会遇到一些能让你更进一步的事情,如果不是一直到那里的话。

http://www.andornot.com/blog/post/Errors-Sending-the-Right-Message-(Redux-Covering-ASPNET-3540).aspx

http://www.andornot.com/blog/post/Errors-Sending-the-Right-Message.aspx

于 2014-02-25T08:18:19.820 回答
0

你为什么不试试这样:

Server.Transfer 方法还有第二个参数——“preserveForm”。如果将此设置为 True,使用诸如 Server.Transfer("WebForm2.aspx", True) 之类的语句,现有的查询字符串和任何表单变量仍可用于您要转移到的页面。

所以我认为这样做你的会话不会过期。

Server.Transfer("~/Error.aspx?ErrorID=" + errorId,True);
于 2014-02-19T11:09:35.657 回答
0

为什么不在 web.config 中使用 customErrors 来进行重定向?

<customErrors mode="Off" defaultRedirect="~/Common/Error.aspx">
  <error statusCode="403" redirect="~/SM_AccessDenied.aspx" />
  <error statusCode="404" redirect="~/Common/FileNotFound.aspx" />
</customErrors>
于 2014-02-18T17:57:07.343 回答
0

您遇到的错误是因为您使用的是查询字符串参数。根据 msdn 文档

However, the path parameter must not contain a query string, or ASP returns an error.

http://msdn.microsoft.com/en-us/library/ms525800%28v=vs.90%29.aspx

它大约是要求上方页面下方的 3/4。

即使这里的文档提到了 asp。而不是 asp.net,请记住会话状态是 IIS 的一项功能,并且在调用 asp.net 之前就已处理。

于 2014-02-20T04:34:40.717 回答