Server.Transfer导致会话异常

时间:2014-02-14 14:14:46

标签: c# asp.net session server.transfer

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

//[..] 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)
                {
                }
            }

9 个答案:

答案 0 :(得分:2)

由于您还没有发布太多代码。所以没有看到你已经完成的实际实现。我可以建议你低于分数。

第1点。首先,您需要检查SessionState是否为enabled页面。您可以在web.config文件中全局设置它们。在snippet

中尝试下面给出的web.config
<configuration>   
   <system.web>
   <pages enableSessionState="true" />
  </system.web>
</configuration>

第2点。并将Redirection放入Application_Error Global.asax

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

第3点。同时检查SessionStateIIS是否设置正确。

详情见MSDN to enable sessionstate

希望这有帮助.. !!!

答案 1 :(得分:1)

根据我的理解,Server.Transfer将另一个页面的内容发送到客户端而不是请求的内容。如果是这种情况,那么我想知道它是否与将母版页应用于错误页面没有关系?几年前我用早期的技术发生了类似的错误,结果发现主页不喜欢我想做的事情。

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

答案 2 :(得分:1)

以下是问题所在:

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

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

尝试使用HttpContext.Current.RewritePath。那个应该解决所有这些问题。无论出于何种原因,RewritePath()并不关心页面是否还没有完成渲染。

答案 3 :(得分: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>

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你为什么不尝试这样:

Server.Transfer方法还有第二个参数 - “preserveForm”。如果将此设置为True,则使用Server.Transfer(“WebForm2.aspx”,True)等语句,现有的查询字符串和任何表单变量仍可用于要传输的页面。

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

Server.Transfer("~/Error.aspx?ErrorID=" + errorId,True);

答案 6 :(得分:0)

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

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之前处理。

答案 7 :(得分:0)

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

答案 8 :(得分: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