在我的全局中,我有以下代码来处理错误发生时
//[..] 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)
{
}
}
答案 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点。同时检查SessionState
中IIS
是否设置正确。
详情见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