Soru Response.Redirect () aradığımda neden "HTTP üstbilgileri gönderildikten sonra yeniden yönlendirilemiyor" iletisi alıyorum?


Aradığımda Response.Redirect(someUrl) Bir HttpException alıyorum: "HTTP üstbilgileri gönderildikten sonra yeniden yönlendirilemiyor".

Bunu neden aldım? Ve bu sorunu nasıl giderebilirim?


76
2017-10-01 20:22


Menşei




Cevaplar:


MSDN belgelerine göre Response.Redirect(string url)"HTTP üstbilgileri gönderildikten sonra yeniden yönlendirme denendiğinde" bir HttpException atar. Dan beri Response.Redirect(string url) Http "Konum" yanıt başlığını kullanır (http://en.wikipedia.org/wiki/HTTP_headers#Responses), çağrılması, başlıkların müşteriye gönderilmesine neden olacaktır. Bu, eğer ikinci kez çağırırsanız, ya da başlıkların başka bir şekilde gönderilmesini sağladıktan sonra çağırırsanız, HttpException'ı alacağınız anlamına gelir.

Response.Redirect () işlevini birden çok kez çağırmaya karşı korunmanın bir yolu, Response.IsRequestBeingRedirected çağırmadan önce özellik (bool).

// Causes headers to be sent to the client (Http "Location" response header)
Response.Redirect("http://www.stackoverflow.com");
if (!Response.IsRequestBeingRedirected)
    // Will not be called
    Response.Redirect("http://www.google.com");

112
2017-10-01 20:25



Tam olarak. Bu, ASP.NET MVC 4 ve İstisna filtreleri vb. İle oldukça kolay olur. Ayrıca, 301/302 yönlendirmesi yayınlandıktan sonra HTTP Yanıtı Durum Kodunu değiştiremezsiniz. - Jaans
Sayfamdaki tüm özellikleri 'statik' yaparak sorunu çözdüm - Sal
özelliklerinizi statik yapmak tehlikeli bir çözümdür - prospector
ThreadAbortException (ilk kez) yakalanmadığı sürece yönlendirme ikinci kez nasıl çağrılabilir? :} "Yönlendirme Yönlendirme, ikinci parametreyle Yönlendirmeyi çağırmakla eşdeğerdir (endResponse) true olarak ayarlanmış. - user2864740
Bu garip, ancak eski bir web formları uygulamasında Response.IsRequestBeingRedirected yanlıştır ve yine de aynı istisnaları alıyorum (içerde Application_EndRequest Global.asax'da olay yöntemi). Nedenini anlamıyorum. - Alisson


İstemciye herhangi bir içerik gönderdiğinizde, HTTP başlıkları zaten gönderildi. bir Response.Redirect() çağrı, tarayıcının farklı bir URL sormasını sağlayan başlıklardaki özel bilgileri göndererek çalışır.

Başlıklar zaten gönderilmiş olduğundan, asp.net ne istediğinizi yapamaz (üstbilgileri değiştirir)

Bunu a) ya da başka bir şey yapmadan önce Yönlendirme'yi yaparak, ya da b) kullanmayı deneyebilirsiniz. Response.Buffer = true Başka bir şey yapmadan önce, tüm sayfa yürütülene kadar istemciye hiçbir çıkışın gönderilmediğinden emin olmak için.


16
2017-10-01 20:27





Bir Yönlendirme sadece bir HTTP mesajındaki ilk satır "iseHTTP/1.x 3xx Redirect Reason".

Eğer zaten aradıysanız Response.Write() veya bazı üstbilgileri ayarla, bir yönlendirme için çok geç olacak. Aramayı deneyebilirsiniz Response.Headers.Clear() Yönlendirmeden önce bunun yardımcı olup olmadığını görmek için.


7
2017-10-01 20:24





Sadece tamponlama seçeneğini false olarak ayarladığınızdan emin olun (varsayılan olarak doğru). Response.redirect çalışması için

  1. Arabellek doğru olmalı,
  2. varsayılan arabellek boyutunu aşan response.write kullanarak daha fazla veri göndermemelisiniz (bu durumda, başlıkların gönderilmesine neden olacak şekilde kendini temizleyecektir) ve böylece sizi yönlendirmeye izin vermeyeceksiniz.

3
2018-05-01 09:27





kullanma return RedirectPermanent(myUrl) benim için çalıştı


2
2018-03-23 08:45





Bunun için basit bir cevap var: Başlığınızı göndermeden önce, metin gibi bir şey veya sayfanızdan çıkışla ilgili herhangi bir şey çıktı. Bu, bu hatayı neden aldığınızı etkiler.

Sadece kodunuzu pozitif çıktı için kontrol edin ya da başlığını metotunuzun üstüne koyabilirsiniz, böylece ilk önce gönderilecektir.


1
2018-01-14 03:07





Sorunum, işlenmek üzere İstisna İşleyici ekleyerek çözüldü "HTTP üstbilgileri gönderildikten sonra yönlendirilemiyor". aşağıdaki kodda gösterildiği gibi bu hata

catch (System.Threading.ThreadAbortException)
        {
            // To Handle HTTP Exception "Cannot redirect after HTTP headers have been sent".
        }
        catch (Exception e)
        {//Here you can put your context.response.redirect("page.aspx");}

1
2018-01-08 12:02





Problemi kullanarak çözdüm: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); Response.Redirect yerine.


1
2017-10-31 16:43





Yönlendirme işlevi muhtemelen 'yenileme' http üstbilgisini (ve belki de 30X kodu kullanarak) kullanarak çalışır. Üstbilgiler istemciye gönderildikten sonra, sunucunun bu yönlendirme komutunu ekleyebilmesi için çok geç yoktur.


0
2018-05-01 09:07





Başlıklar gönderildikten sonra yeniden yönlendirmeye çalışıyorsanız (örneğin, kısmen oluşturulan bir sayfadan bir hata yönlendirme yapıyorsanız), bazı istemci Javascript'i (location.replace veya location.href, vb.) Gönderebilirsiniz. İstediğiniz herhangi bir URL'ye yönlendirmek için. Elbette, bu HTML'nin daha önce gönderildiği şeye bağlı.


0
2018-02-18 21:29