Response.Redirect приводит к «Объект переехал сюда» - PullRequest
35 голосов
/ 02 февраля 2010

Я работаю над страницей на C # ASP.NET, которая обычно перенаправляет на URL-адрес «file:». Похоже, что это работает нормально в большинстве случаев, но иногда (и в моей тестовой системе, по-видимому, всегда) вместо перенаправления в файл я получаю страницу с текстом «Объект перемещен сюда» где «здесь» - это ссылка на файл, который я пытался перенаправить, но с двумя слешами после двоеточия вместо двух (т. е. «file: ////testserver/docs/testdoc.doc»)

Обычно это сопровождается сообщением «System.Threading.ThreadAbortException: поток был прерван».

Я искал решение в другом месте и обнаружил некоторые интересные вещи о Response.Redirect, вызывающие исключения ThreadAbort, но это не кажется фундаментальной проблемой - мне кажется, что настоящей проблемой является «Объект перемещен to here "сообщение, которое вызывает исключение.

Кто-нибудь получил какие-либо предложения, почему я получаю это ...?

РЕДАКТИРОВАТЬ: Забыл упомянуть, что я использую Firefox (3.5.7) с вкладкой IE, поэтому собирался упомянуть, что, когда я подумал, что мне лучше попробовать его в IE, и вот - работает в IE (7).

Ответы [ 8 ]

28 голосов
/ 19 июня 2012

Просто для дальнейшего использования, другая причина, по которой это может произойти, - это если вы делаете что-то вроде Response.Redirect (null) или подобное. У меня была ситуация, когда моя переменная, содержащая URL, была нулевой, и это то, что я получил.

16 голосов
/ 02 мая 2012

Это может быть вызвано помещением метода Response.Redirect() в блок try-catch.Решение, которое я нашел, состояло в том, чтобы завершить ответ практически , сбросив заголовок перенаправления на клиент.посмотрите:

HttpResponse Response = HttpContext.Current.Response;
Response.StatusCode = 301; 
Response.StatusDescription = "Moved Permanently";
Response.RedirectLocation = "YourRedirectionUrlHere.aspx";
Response.Flush();
7 голосов
/ 01 марта 2013

Я только что натолкнулся на случай, когда это происходит. Оказывается, у нас был некоторый код, который эффективно сделал:

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

Очевидно, что человек, который написал это (к счастью, давно), не осознал, что Response.Redirect по умолчанию не завершает поток.

Я понятия не имею, каковы последствия этого, но след от этого происшествия выглядит как показ перенаправленного повреждения. Конечно, это может быть совпадением, но это единственное место, где мы видели эту проблему.

3 голосов
/ 13 апреля 2016

Это помогло мне, когда я увидел эту проблему:

[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;
    }
}
3 голосов
/ 24 июня 2015

Другая причина, по которой это может произойти, заключается в том, что вы перенаправляете со страницы https на страницу http. Изменение URL-адреса перенаправления также на https: // устранило проблему для меня.

1 голос
/ 02 августа 2013

В MVC вы можете увидеть это после RedirectToRoute () .

Если вы используете такой инструмент, как Fiddler , вы должны увидеть проблему с ответом сервера. Я заметил 500 Ошибка .

В моем случае это было вызвано добавлением объекта в Сеанс , который был НЕ Сериализуем .

0 голосов
/ 21 августа 2017

Я исправил эту проблему, установив для моей глобальной строковой переменной значение static, поскольку при перенаправлении мой URL-адрес сбрасывался на пустой.

0 голосов
/ 16 марта 2013

Использовать элемент привязки с runat=server

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

В коде:

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

Дайте ему попытку.

Работает лучше, чем предыдущий Status Code=301 метод.

...