session_start中的asp.net response.redirect不起作用

时间:2011-05-17 10:57:23

标签: asp.net session redirect response

我有一个简单的Session_Start代码,如下所示:

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    Dim sid = Session.SessionID
    Response.Redirect("~/Blog.aspx")
    dim dummy=4/0
End Sub

它没有按预期工作。通常在我的整个站点中,每当调用Response.Redirect()时,它也会终止代码执行。而在这里,即使页面最终重定向,也会执行dim dummy=4/0行。

这导致我在Session_Start()调用的其他代码中出现问题,我假设重定向是一个退出点。

我还尝试将endResponse重载方法中的Response.Redirect(url, endResponse)设置为truefalse,但这也不起作用。

3 个答案:

答案 0 :(得分:10)

深入研究了框架源代码,我可以解释为什么Response.Redirect(url, true)Session_Start()中调用后继续执行代码,而不是在后面的常规代码中执行代码。

Response.Redirect()最终调用Redirect()的内部重载方法:

internal void Redirect(string url, bool endResponse, bool permanent)
{
  // Miscellaneous goings on

  if (endResponse)
  {
    this.End();
  }
}

在此方法结束时,如果endResponse为真,则调用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_Start()内设置断点并检查当前上下文的IsInCancellablePeriod不可见成员,我们会看到:

enter image description here

这意味着请求的线程不会被中止,因此Response.Redirect()之后的代码将被执行,无论您是否设置endResponse

如果我们在ASPX页面的Page_Load()事件中设置断点,我们会看到不同的东西:

enter image description here

当前上下文的IsInCancellablePeriod非可见成员设置为true,因此Thread.CurrentThread.Abort()将被调用,Response.Redirect()之后将不再执行任何代码。

这种行为差异的原因是我怀疑保护会话状态的完整性:

  

Don't redirect after setting a Session variable (or do it right)

如果您需要阻止代码在Response.Redirect() Session_Start()之后执行,那么您需要使用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

答案 1 :(得分:0)

是的。.Redirect不会像其他senario中那样终止线程,但是您仍然可以在重定向之后手动添加HttpContext.Current.Response.End()来停止处理任何页面。

答案 2 :(得分:-1)

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

public void Redirect (
    string url,
    bool endResponse
)
  • url - 目标位置。
  • endResponse - 指示当前页面的执行是否应该终止。