Asp.net 响应。会话中的重定向启动不';行不通
我有一个简单的Asp.net 响应。会话中的重定向启动不';行不通,asp.net,session,redirect,response,Asp.net,Session,Redirect,Response,我有一个简单的会话\u Start代码,如下所示: 子会话_启动(ByVal发送方作为对象,ByVal e作为事件参数) Dim sid=Session.SessionID Response.Redirect(“~/Blog.aspx”) 尺寸虚拟=4/0 端接头 它没有像预期的那样工作。通常在我的整个站点中,每当调用Response.Redirect()时,它也会终止代码执行。而在这里,即使页面最终重定向,也会执行dim dummy=4/0行 这在从Session\u Start()调用的其
会话\u Start
代码,如下所示:
子会话_启动(ByVal发送方作为对象,ByVal e作为事件参数)
Dim sid=Session.SessionID
Response.Redirect(“~/Blog.aspx”)
尺寸虚拟=4/0
端接头
它没有像预期的那样工作。通常在我的整个站点中,每当调用Response.Redirect()
时,它也会终止代码执行。而在这里,即使页面最终重定向,也会执行dim dummy=4/0
行
这在从Session\u Start()
调用的其他代码中给我带来了问题,在这里我假设重定向是一个退出点
我还尝试将Response.Redirect(url,endResponse)
重载方法中的endResponse
设置为true
或false
,但这也不起作用。
- url-目标位置
- endResponse-指示当前页的执行是否应终止
响应。重定向(url,true)
在会话_Start()
中被调用后继续执行代码,但不是在常规代码中
Response.Redirect()
最终调用Redirect()
的内部重载方法:
在该方法的末尾,如果endResponse
为true,则调用Response.end()
。当我们查看Response.End()
时,我们会看到以下代码:
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
该方法检查当前上下文的IsInCancellablePeriod
值的状态。此值是内部值,但我们可以在调试器中看到它:
如果我们在Session\u Start()
内设置一个断点,并检查当前上下文的IsInCancellablePeriod
不可见成员,我们会看到:
这意味着不会中止请求的线程,因此无论是否设置了endResponse
,都将执行Response.Redirect()之后的代码
如果我们在ASPX页面的page\u Load()
事件中设置断点,我们会看到一些不同的情况:
当前上下文的IsInCancellablePeriod
不可见成员被设置为true,因此Thread.CurrentThread.Abort()
将被调用,并且在响应.Redirect()之后不再执行代码
这种行为差异的原因可能与保护会话状态完整性有关:
如果需要在会话启动()
中的响应.Redirect()
后阻止代码执行,则需要使用If…then…Else
:
If <some_condition_we_have_to_redirect_for> Then
Response.Redirect("~/Blog.aspx")
Else
// Normal session start code goes here
End If
If-Then
Response.Redirect(“~/Blog.aspx”)
其他的
//正常会话启动代码在这里
如果结束
是,.Redirect不会像在其他senarios中那样终止线程,但您仍然可以在重定向后手动添加一个HttpContext.Current.Response.End()
以停止任何页面的处理。OP已经在他的问题中指出“我尝试将EndResponse设置为true或false。不可以。”.感谢您的详细回复;-)我想我现在必须将我的代码重组为u,或者因为我所有的重定向都通过了一个全局子节点,也许我只是做了一个响应。结束了吗?或者这会扼杀会话内容吗?我想我得试试这些选择。再次感谢@伊斯曼-谢谢你:)。因为线程没有被中止(我猜它在很多年前在Framework1.0中就已经使用了,但是我没有可用的版本来检查代码),所以会话应该保持完整。但和往常一样,我会测试这个来确定。谢谢。现在,在u确认问题后,我只是在所讨论的重定向
之后添加了exit sub
。如果它在别的地方再次发生,我也会在那里补充。不是最好的,但已经足够好了。
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
If <some_condition_we_have_to_redirect_for> Then
Response.Redirect("~/Blog.aspx")
Else
// Normal session start code goes here
End If