【问题标题】:Response.Redirect doesn't work in .Net 4.5Response.Redirect 在 .Net 4.5 中不起作用
【发布时间】:2013-10-29 17:39:05
【问题描述】:

我在验证登录凭据后调用 response.redirect 这一切在 .net framework 3.5 中都可以正常工作 但是当我升级到 .net 4.5 没发生什么事。它保持在同一页面上。

我尝试了各种排列方式

System.Web.HttpContext.Current.Response.Redirect("/");
System.Web.HttpContext.Current.Response.Redirect("/", false);
System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();

似乎没有任何效果 我已经尝试了它,并且在使用 false 时没有任何异常。

代码被一个 asp:button onClick 事件调用。在单击事件期间,我检查凭据是否正确,如果它们正确,我执行登录设置会话变量...并将它们重定向到其角色的适当登录页面。

更多信息 我把我的问题归结为一个基本场景。在以下场景中,两个按钮调用相同的函数 btnTemp_Click,该函数调用 Response.redirect。在 asp:button 的情况下,它在 HTML5 按钮的情况下不起作用。在这两种情况下,response.redirect 上的断点都会被执行。

<asp:Button ID="btnTemp" Text="Test Redirect" runat="server" OnClick="btnTemp_Click" />
<button id="btnTmp2" runat="server" onserverclick="btnTemp_Click" >button to Redirect</button>

protected void btnTemp_Click(object sender, EventArgs e)
{
        HttpContext.Current.Response.Redirect("http://www.google.com", false);
}

点击 button 后出现的其他奇怪的 asp:button 不再起作用

如果我创建了一个全新的 Web 应用程序,其中除了这两个按钮之外什么都没有,它对两者都适用。所以我必须有一些代码在 onserverclick 命中但 onclick 没有命中的地方做某事。

【问题讨论】:

  • 您能否提供有关此代码上下文的更多详细信息?它是用于 Web 窗体、MVC 还是其他东西?如果是 Web 表单,您在哪个事件中使用它(Load、Pre Init、LoadComplete 等)?不知道更多,很难回答。
  • Response.Redirect 总是抛出异常。这就是为什么您认为您需要try/catch。它没有与false 一起抛出的原因是因为第二个参数决定了线程是否被中止。现在,当你说它不起作用时,这就是可疑的部分。 你怎么知道它不起作用?
  • 尝试将Response.Redirect("/") 更改为Response.Redirect("~/")
  • Ryan 我在 asp:button onClick 事件中调用它。
  • 会不会有东西干扰了重定向?尝试创建一个新的 ASP.NET 4.5 项目,其中包含一个重定向到 Google 或其他内容的空白页面。

标签: c# asp.net


【解决方案1】:

使用 James Johnson 的回答 here 解决了它

问题基本上是如果您在更新面板中并且控件没有专门注册为回发触发器,那么您正在尝试重定向异步回发。

因此您必须将控件显式注册为回发触发器

詹姆斯写道:

假设您使用的是 UpdatePanel,请添加以下内容 ScriptModule 到您的 web.config:

<httpModules>
   <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules> 

您的另一个选择是将执行重定向的控件注册为回发控件。使用 UpdatePanel 你可以做 这通过添加 PostBackTrigger。您也可以使用脚本管理器:

ScriptManager.GetCurrent(Page).RegisterPostBackControl(Button1);

我无法让第一个解决方案工作(至少在调试模式下) 第二个解决方案在页面加载中调用 RegisterPostBackControl 效果很好。

【讨论】:

    【解决方案2】:

    不知道这是否是您问题的具体答案,但它可能会以一种迂回的方式解决它,并且可以节省很多人摸不着头脑的时间。

    我在 MS Ajax 弹出窗口中遇到了 NullReferenceException 的问题 - 具体来说,单击弹出窗口上的关闭应该返回到服务器,并且服务器端代码重定向到另一个页面,但是它给出了这个错误。

    查看堆栈跟踪,我可以看到异常本身是在 ScriptModule.HttpResponse_Redirecting 方法中引发的。

    谷歌上没有任何帮助,在 DotPeek 中查找并没有真正告诉我问题。

    然后我发现在 VS 2010 中可以实际加载 .NET Framework 代码的符号,所以我这样做了(工具->选项->启用 .NET Framework 源步进)。

    事实证明,原因是按钮单击被视为回调(而不是回发),Response.Reirect 不喜欢这样(即他们认为在 Page 时不应该调用 Response.Redirect .IsCallback 为真),并在内部引发异常。

    尽管这已被捕获(或者看起来如此),但这并不是在它失去内部填充 HttpResponse 对象的 RedirectLocation 属性的机会之前。

    脚本模块代码然后试图解析这个字符串,并吹嘘它是空的。

    因此,对我有用的解决方法是在调用 Redirect 之前立即显式设置 HttpResponse 对象的 RedirectLocation 属性。诚然,这不是一个特别优雅的解决方案,但是,让我们面对现实吧,MS Ajax 也不是(WebForms 也不是真的!;))

    【讨论】:

    • 感谢您的回复。我想我跟着你,但你有一些代码要显示吗?当您明确设置 RedirectLocation 时,是否会将按钮单击视为回发?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2013-01-27
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多