2010-02-02 7 views
28

Pracuję na stronie C# ASP.NET, która zwykle kończy przekierowanie do URL "plik:". To wydaje się działać dobrze przez większość czasu, w większości przypadków, ale czasami (i, w moim systemie testowym, widocznie zawsze) zamiast przekierowania do pliku, otrzymuję stronę z tekstem "Obiekt przeniesiony tutaj" , gdzie "tutaj" jest linkiem do pliku, do którego próbowałem przekierować, ale z czterema ukośnikami po dwukropku zamiast dwóch (tj. "file: ////testserver/docs/testdoc.doc")Response.Redirect wyniki w "Obiekt przeniesiony tutaj"

Zwykle towarzyszy temu komunikat "System.Threading.ThreadAbortException: Thread was aborted".

Szukałem rozwiązania w innym miejscu i dowiedziałem się kilka interesujących rzeczy na temat Response.Redirect powodujących wyjątki ThreadAbort, ale to nie wydaje się być podstawowym problemem - wydaje mi się, że rzeczywistym problemem jest "Obiekt przeniesiono tutaj "wiadomość, która powoduje zgłoszenie wyjątku.

Ktoś ma jakieś sugestie, dlaczego dostaję to ...?

EDIT: Zapomniałem wspomnieć używam Firefox (3.5.7) z IE Tab, więc miał wspomnieć, że kiedy pomyślałem, że lepiej spróbować go w IE i voila - to działa w IE (7).

+0

Czy dzieje się to w wielu przeglądarkach? Czy próbowałeś uruchomić Fiddlera, aby monitorować żądanie/odpowiedź, aby zobaczyć nieprzetworzoną odpowiedź HTTP? –

+0

Jakiej wersji .NET używasz? Wydaje się, że był to typowy problem w ciągu 1.1 dni ... –

+0

Oto kilka powiązanych ze sobą wpisów 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-redred--browser-to-a-local -file-in-asp-net] (http://stackoverflow.com/questions/1497285/how-do-i-redred--browser-to-a-local-file-in-asp-net) –

Odpowiedz

13

Może to być spowodowane przez zablokowanie metody Response.Redirect() w bloku. Rozwiązaniem, które do mnie przyszło było zakończyć odpowiedź wirtualnie poprzez opróżnienie nagłówka przekierowania do klienta. spójrz:

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

To działa doskonale dla mnie (użyłem go do wygenerowania i zwrócenia pliku iCal protokołu webcal: //), chociaż nie było potrzeby ustawiania właściwości StatusDescription. –

+1

To jest również odpowiedź na to pytanie: http://stackoverflow.com/questions/347281/asp-net-custom-404-return-200-ok-zamiast-404-nie znaleziono –

22

Tylko dla przyszłości kolejny powód, to może wystąpić, jeśli jest coś takiego response.redirect (null) lub podobny. Miałem sytuację, w której moja zmienna trzymająca adres URL była zerowa i to właśnie dostałem.

+0

w moim przypadku wysłałem parametr null do 'REST api', a odpowiedź została przekierowana do pustego adresu URL w zamiast wygenerowanego adresu URL – stom

5

Właśnie natknąłem się na przypadek, w którym tak się dzieje. Okazuje się, że mieliśmy jakiś kod, który skutecznie robiłam:

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

Oczywiście osoba, która napisała ten (dobry czas temu na szczęście) nie zdawał sobie sprawy, że Response.Redirect nie domyślnie zakończyć wątek.

Nie mam pojęcia, jakie są tego konsekwencje, ale ślad skrzypka tego zdarzenia wygląda na korupcyjne przekierowanie. Oczywiście może to być współwystępowanie, ale jest to jedyne miejsce, w którym widzieliśmy ten problem.

0

Zastosowanie elementem kotwica z runat=server

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

w kodzie za:

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

Spróbować.

Działa lepiej niż poprzednia metoda Status Code=301.

1

W MVC możesz zobaczyć to po RedirectToRoute().

Jeśli używasz narzędzia takiego jak Fiddler, powinien pojawić się problem z odpowiedzią serwera. Zauważyłem błąd .

W moim przypadku było to spowodowane przez obiekt jest dodawany do Sesji który był NIE Serializable.

2

Innym powodem może to być przekierowanie ze strony https na stronę http. Zmiana adresu URL przekierowania również na https: // naprawiła problem.

+0

To był problem także dla mnie, dzięki! – Guven

2

To załatwiło sprawę do mnie, kiedy zobaczyłem ten problem:

[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

naprawiłem ten problem przez ustawienie mojego zmiennej ciąg do globalnego statyczne, ponieważ mój URL został resetowania opróżnić kiedy przekierowanie.

Powiązane problemy