2009-09-11 9 views
8

Przeglądam jakiś staroświecki kod i znalazłem błąd, który powoduje, że odpowiedź jest wyświetlana w nieskończoność.Czy należy ustawić długość treści w nagłówku odpowiedzi?

Oto podstawowa idea:

Response.Content-Type = "application/octet-stream" 
Response.AddHeader("Content-Disposition", "attachment; filename" & someFileName) 
Response.AddHeader("Content-Length", someStoredLength) 
Response.BinaryWrite(someByteArray) 
Response.Flush() 
Response.End() 

Problemem jest to, że someStoredLength jest znacznie większy niż rzeczywisty rozmiar someByteArray, więc klient po prostu siedzi tam czeka na pobranie pliku, podczas gdy przeglądarka po prostu kręci.

Zastanawiam się nad usunięciem AddHeadera, który określa długość zawartości, ponieważ kiedy to robię, wszystko działa dobrze, ale martwię się, że czegoś nie rozumiem.

Czy mogę usunąć ten AddHeader, czy powinienem wymyślić lepszy sposób na rozwiązanie tego problemu?

+0

Co to za język? Jaką klasą jest obiekt Response w powyższym kodzie? – noctonura

+0

@RichAmberale: To nie ma znaczenia dla pytania. Problem występuje w przeglądarce z powodu nagłówków HTTP. –

+0

Kod znajduje się w VB.NET, ale mogę go znaleźć w innych miejscach, gdzie dziedzictwo jest wykonywane w klasycznej ASP – Joseph

Odpowiedz

8

zmienić linię Content-Length na następujące kwestie:

Response.AddHeader("Content-Length", someByteArray.Length.ToString()) 
+0

Myślałem o zrobieniu tego również. Zastanawiałem się, czy to byłaby dobra alternatywa. Jeśli mam tablicę bajtów, właściwość Length zawsze da mi prawidłowy rozmiar? – Joseph

+0

Tak. Nagłówek długości treści wskazuje liczbę bajtów w treści. Twoja zawartość to tablica bajtów, więc jesteś dobry. – Stephen

10

Twoja aplikacja SHOULD (przewiń w dół do Content-Length) zdefiniuj ją, jednak nie jest to wymagane.

Oto decent discussion możliwych opcji.

+2

Proponowane rozwiązanie w połączonym artykule ("ustaw tylko długość jakiejś arbitralnej wartości, która będzie prawdopodobnie zbyt duża") wygląda na NAPRAWDĘ zły pomysł. Nawet jeśli nic nie zepsuje z bieżącymi programami użytkownika, podważy to całą koncepcję nagłówka "Długość treści" i może przerwać niecodzienne, ale całkowicie zgodne z normami biblioteki klienta HTTP. Jeśli rozmiar pliku nie jest znany z góry, kodowane kodowanie transferu powinno być używane we wszystkich przypadkach (i musi być używane, jeśli połączenie ma zostać ponownie użyte (podtrzymanie)). – lxgr

+0

Bezpośredni link do [Content-Length] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13), patrz także [HttpBis] (http://tools.ietf.org /html/draft-ietf-httpbis-p1-messaging25 .section -.3.3.2) – paulkmoore