Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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
C# 重定向(URL,false)-后重定向事件管理_C#_Asp.net_Session_Response.redirect - Fatal编程技术网

C# 重定向(URL,false)-后重定向事件管理

C# 重定向(URL,false)-后重定向事件管理,c#,asp.net,session,response.redirect,C#,Asp.net,Session,Response.redirect,可能重复: ASP/C#.NET(web表单,而不是MVC) 更新:刚找到一篇相关文章(可能是重复的): ~~~ 经过一番研究,我了解到,一般来说,在使用Response.Redirect()时,最好将FALSE传递给第二个参数,以避免System.Threading.ThreadAbortException。() 我的问题是,“当为第二个参数传递false时,是否有一种推荐的方法(模式)用于管理(即跳过)重定向后触发的页面事件中的处理?” 当我在Page_Load()中检查并重定向过期会话时

可能重复:

ASP/C#.NET(web表单,而不是MVC)

更新:刚找到一篇相关文章(可能是重复的):

~~~

经过一番研究,我了解到,一般来说,在使用Response.Redirect()时,最好将FALSE传递给第二个参数,以避免System.Threading.ThreadAbortException。()

我的问题是,“当为第二个参数传递false时,是否有一种推荐的方法(模式)用于管理(即跳过)重定向后触发的页面事件中的处理?”

当我在Page_Load()中检查并重定向过期会话时,这对我来说是个问题。每次我重定向时都必须设置一个“_Redirected”标志,然后在每个事件的顶部检查该标志,这似乎非常乏味。过去我不必担心这个问题,因为我总是将第二个参数的值传递为TRUE,而不知道更好的结果

下面是一些代码,显示了我不想做的事情(在处理每个事件之前检查重定向)。也许我正在寻找一种更好的会话过期处理模式

如有任何关于如何改进此处理的建议,将不胜感激

private bool _Redirected = false;    

protected void Page_Load(object sender, EventArgs e)
{
  if (Session["key"] == null)
  {
    Response.Redirect("SessionExpired.aspx", false);
    Context.ApplicationInstance.CompleteRequest();

    _Redirected = true;
  }       
}

protected void Page_PreRender(object sender, EventArgs e)
{
  if (!_Redirected)
  {
    // do Page_PreRender() stuff...
  }
}

protected void Button1_Click(object sender, EventArgs e)
{
  if (!_Redirected)
  {
    // do Button1_Click() stuff...

    Response.Redirect("Button1Page.aspx", false);
    Context.ApplicationInstance.CompleteRequest();

    _Redirected = true;
  }
}

protected void Button2_Click(object sender, EventArgs e)
{
  if (!_Redirected)
  {
    // do Button2_Click() stuff...

    Response.Redirect("Button2Page.aspx", false);
    Context.ApplicationInstance.CompleteRequest();

    _Redirected = true;
  }
}
~~~

[01/24/2013]为了回应(谢谢你,顺便说一句),这里有一个简化的代码,我相信它与你测试的代码类似。我仍然看到Button1_Click()在返回响应后执行。在页面_Load()中使用.CompleteRequest()重定向(url,false)

我在上面的更新中提到的类似帖子的回复证实了这种行为


知道我做错了什么会导致页面在重定向后继续执行吗

您引用了一篇相当不错的文章,但您的代码没有反映作者建议的“正确”实现这一点的方法。即:

protected void Page_Load(object sender, EventArgs e)
{
  if (Session["key"] == null)
  {
    Response.Redirect("SessionExpired.aspx", false);
    Context.ApplicationInstance.CompleteRequest();
  }       
}
更新
我编写了一个非常简单的示例应用程序。它只有两页表格。
第一个页面上有一个按钮,可以执行response.write。我在这行上放了一个断点。在page_load方法中,我放置了一个重定向,然后立即调用
CompleteRequest
。此重定向已设置为在页面发回时发生

第二页所做的只是发出“你好”

然后我运行了应用程序,它调出了第一个表单。我按了一下按钮。断点从未被击中,它被重定向。这正是我所期望的。即,page_load方法捕获回发,执行重定向并立即完成请求,而无需进一步处理页面


这意味着绝对没有理由在每次单击按钮时都添加
if(!\u Redirected)
代码。你所需要做的就是复制/粘贴我在答案顶部的代码。这将阻止调用这些单击。

感谢您的回复。你是对的;我忘记在示例代码中包含“Contect.ApplicationInstance.CompleteRequest()”。我已经加上了。我仍然被如何处理剩余事件所困扰,这些事件在重定向后仍然会触发。使用类似于此的检查来包装所有事件是否常见?从Page_Load()重定向只是一种不好的做法吗?不管怎样,再次感谢!注意:
CompleteRequest
始终不会立即完全停止执行。它将继续执行一段时间,直到ASP.Net终止线程。最好在之后放置一个无限循环,以避免这种情况,并等待线程完成killed@ChrisLively再次感谢您,但我没有看到您描述的行为——请参阅我在上面的帖子中的更新,我在这里添加了与您描述的类似的代码。即使在.CompleteRequest()的.Redirect()之后,button click事件仍在为我执行。@jweekes尝试在末尾放置一个无限循环。杀死正在执行的线程并不总是instantUm,我认为无限循环可能比我试图避免的异常更糟糕,但是谢谢,@Earlz。这段代码与我测试的代码几乎完全相同。奇怪的我使用的是asp.NET4.5Curious。我用的是4。也许他们用4.5做了些神奇的事。2010年我仍然是4.0,所以我认为我不能测试4.5。
protected void Page_Load(object sender, EventArgs e)
{
  if (Session["key"] == null)
  {
    Response.Redirect("SessionExpired.aspx", false);
    Context.ApplicationInstance.CompleteRequest();
  }       
}