2010-02-02 72 views
28

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

这通常伴随着“System.Threading.ThreadAbortException:线程被中止”消息。

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

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

编辑:忘了提,我运行Firefox(3.5.7)与IE浏览器选项卡,所以是要提的是,当我想我最好还是尝试在IE,瞧 - 它在IE (7)。

+0

这是否发生在多个浏览器?您是否尝试过运行Fiddler来监视请求/响应,以查看原始HTTP响应? – 2010-02-02 14:19:34

+0

您使用的是什么版本的.NET?这似乎是1.1天内的常见问题... – 2010-02-02 14:22:01

+0

以下是一些相关的SO帖子:[http://stackoverflow.com/questions/922648/response-redirect-not-always-redirecting](http:/ /stackoverflow.com/questions/922648/response-redirect-not-always-redirecting) [http://stackoverflow.com/questions/1497285/how-do-i-redirect-a-browser-to-a-local - 文件在asp网络](http://stackoverflow.com/questions/1497285/how-do-i-redirect-a-browser-to-a-local-file-in-asp-net) – 2010-02-02 14:23:37

回答

13

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

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

这对我很好用(用它来生成并返回一个webcal://协议iCal文件)虽然我不需要设置StatusDescription属性 – 2013-01-03 16:25:48

+1

这也是这个问题的答案:http://stackoverflow.com/questions/347281/asp-net-custom-404-returns-200-ok-404-not- – 2013-07-26 12:08:15

22

只是以供将来参考的另一个原因可能发生这种情况是,如果你这样做的Response.Redirect(空)或类似。我有一个情况,我的变量持有的URL是空的,这就是我得到的。

+0

在我的情况下,我发布了null参数给一个'REST api',并且响应被重定向到了空URL代替生成的网址 – stom 2015-12-08 17:10:21

5

我刚刚遇到过这种情况。事实证明,我们有一些代码,有效地做到:

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

显然谁(前幸运了好一会儿)写这个的人并没有意识到,一个Response.Redirect的不,默认情况下,结束线程。

我不知道这样做的后果是什么,但这种情况的提琴手痕迹显示出腐败的重定向。这可能是一个共同发生的过程,但这是我们见过这个问题的唯一地方。与runat=server

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

在后面的代码

0

使用锚元素:

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

试试看吧。

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

1

在MVC中,您可能会在RedirectToRoute()之后看到此内容。

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

在我而言,这是由物体引起的被添加到会议这是不可序列

2

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

+0

这也是我的问题,谢谢! – Guven 2016-07-18 20:03:19

2

这奏效了我,当我看到这个问题:

[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; 
    } 
} 
0

我通过我的全局字符串变量设置为静态固定的这个问题,因为我的网址被复位,当我重定向到空。