Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 响应。会话中的重定向启动不';行不通_Asp.net_Session_Redirect_Response - Fatal编程技术网

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