【问题标题】:Response.Redirect results in "Object moved to here"Response.Redirect 导致“对象移至此处”
【发布时间】:2011-01-12 04:17:27
【问题描述】:

我正在处理一个 C# ASP.NET 页面,该页面通常最终会重定向到“file:”URL。在大多数情况下,这似乎在大多数情况下都可以正常工作,但偶尔(并且,在我的测试系统上,显然总是如此)而不是重定向到文件,我得到一个带有文本“对象移至此处”的页面,其中“here”是指向我试图重定向到的文件的链接,但冒号后有四个斜杠而不是两个(即“file:////testserver/docs/testdoc.doc”)

这通常伴随着“System.Threading.ThreadAbortException: Thread was being aborted”消息。

我在其他地方寻找了解决方案,并发现了一些关于 Response.Redirect 导致 ThreadAbort 异常的有趣内容,但这似乎不是根本问题 - 在我看来,实际问题是“对象已移动到这里”消息,这会导致抛出异常。

任何人有任何建议为什么我会得到那个......?

编辑:忘了提到我正在使用 IE Tab 运行 Firefox (3.5.7),所以当我想我最好在 IE 中尝试它时,我正要提到它,瞧 -它适用于 IE (7)。

【问题讨论】:

标签: c# asp.net exception abort


【解决方案1】:

仅供将来参考,发生这种情况的另一个原因是,如果您执行类似 Response.Redirect(null) 或类似的操作。我的情况是保存 URL 的变量为空,这就是我得到的。

【讨论】:

  • 在我的情况下,我将 null 参数发布到 REST api 并且响应被重定向到 null URL 而不是生成的 url
  • 这也适用于空字符串。今天刚经历过。
【解决方案2】:

这可能是由于将Response.Redirect() 方法放在try-catch 块中造成的。我提出的解决方案是通过将重定向标头刷新到客户端来结束响应虚拟。看看:

HttpResponse Response = HttpContext.Current.Response;
Response.StatusCode = 301; 
Response.StatusDescription = "Moved Permanently";
Response.RedirectLocation = "YourRedirectionUrlHere.aspx";
Response.Flush();

【讨论】:

  • 这对我很有用(用它来生成和返回 webcal:// 协议 iCal 文件)虽然我不需要设置 StatusDescription 属性
  • 这也是这个问题的答案:stackoverflow.com/questions/347281/…
【解决方案3】:

我刚刚遇到一个发生这种情况的案例。事实证明我们有一些有效的代码:

if (condition)
{
  Response.Redirect(page1);
}
Response.Redirect(page2);

显然写这篇文章的人(幸运的是不久前)没有意识到 Response.Redirect 默认情况下不会结束线程。

我不知道这样做的后果是什么,但这种情况的提琴手痕迹看起来显示了一个损坏的重定向。当然,这可能是巧合,但这是我们唯一看到此问题的地方。

【讨论】:

    【解决方案4】:

    这可能发生的另一个原因是您正在从 https 页面重定向到 http 页面。 将重定向 URL 更改为 https:// 为我解决了这个问题。

    【讨论】:

      【解决方案5】:

      当我看到这个问题时,这对我有用:

      [Route("/something/{param}", "GET")]
      public class MyRequestArg{
         public string param{get;set;}
      }
      
      public class MyRequestService
      {
          public object Get(MyRequestArg request)
          {
          var url = "http://www.zombo.com";
          var myCookieString = "anything is possible!";
      
          var result = new HttpResult
                       {
                         StatusCode = HttpStatusCode.Redirect,
                         Headers = {
                                    {HttpHeaders.Location, url},
                                    {HttpHeaders.SetCookie, myCookieString}
                                   }   
                       };
          return result;
          }
      }
      

      【讨论】:

        【解决方案6】:

        在 MVC 中,您可能会在 RedirectToRoute() 之后看到这一点。

        如果您使用 Fiddler 之类的工具,您应该会看到服务器响应存在问题。我注意到一个 500 错误

        在我的情况下,这是由于添加到 Session 的对象不可序列化

        【讨论】:

          【解决方案7】:

          将锚元素与runat=server一起使用

          <a runat="server" ID="anchor1">anything can be here</a>
          

          在后面的代码中:

          if (!ispostback)
            anchor1.href="whateveryoulink";
          

          试一试。

          它比以前的Status Code=301 方法工作得更好。

          【讨论】:

            【解决方案8】:

            我通过将全局字符串变量设置为静态来解决此问题,因为在我重定向时我的 URL 被重置为空。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-12-23
              • 2011-01-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多