HttpWebRequest Content Length Error

Bij het downloaden van een bestand met HttpWebResponse is de door de server verzonden lengte van de inhoud onjuist en zorgt ervoor dat de HttpWebResponse stopt met het downloaden van het bestand halverwege. IE lijkt dit probleem niet te hebben wanneer u bladert. Elk idee over hoe HttpWebResponse te verkrijgen, negeert de lengte van de inhoud die de sever heeft verzonden of zou dat zelfs zinvol maken. Alle hulp die zou kunnen worden gegeven zou zeer op prijs worden gesteld.

--Voorbeeld

class Program
{
    static void Main(string[] args)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:59771/Default.aspx");
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        Console.WriteLine("Content length: " + response.ContentLength);

        int bytesRead = 0;
        long totalBytesRead = 0;

        byte[] data = new byte[1024 * 64];
        StringBuilder output = new StringBuilder();

        Stream responseStream = response.GetResponseStream();

        do
        {
            bytesRead = responseStream.Read(data, 0, 1024 * 64);
            totalBytesRead += bytesRead;

            output.Append(Encoding.ASCII.GetString(data, 0, bytesRead));
        }
        while (bytesRead > 0);

        Console.WriteLine("total read: " + totalBytesRead);
        Console.WriteLine("last content read: " + output.ToString());
    }

    protected void Page_Load(object sender, EventArgs e)
    {
       Response.Clear();
       Response.ClearHeaders();
       Response.AddHeader("Content-Length", "13");
       Response.Write("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    }
}

Probleem opgelost!

De server waar we de gegevens naar toe halen is een Cognos-server en het berekende de lengte van de inhoud alsof de string moest worden gecomprimeerd, maar we verzond de code niet naar de staat waarin we compressie konden accepteren, dus het zou ongecomprimeerde terugsturen gegevens, maar alleen voor de lengte van de compressie. IE had dit probleem niet omdat het beweerde dat het compressie kon accepteren. Code om probleem te verhelpen:

request2.Headers.Add("Accept-Encoding", "gzip,deflate");
3
Heeft u een URL die we kunnen bezoeken om zelf te zien? Wil je de code met ons delen?
toegevoegd de auteur Jon Skeet, de bron

2 antwoord

Probleem opgelost!

De server waar we de gegevens naar toe halen is een Cognos-server en het berekende de lengte van de inhoud alsof de string moest worden gecomprimeerd, maar we verzond de code niet naar de staat waarin we compressie konden accepteren, dus het zou ongecomprimeerde terugsturen gegevens, maar alleen voor de lengte van de compressie. IE had dit probleem niet omdat het beweerde dat het compressie kon accepteren. Code om probleem te verhelpen:

 request2.Headers.Add("Accept-Encoding", "gzip,deflate"); 
3
toegevoegd

HttpWebRequest heeft niets te maken met gegevens die van de server worden verzonden, alleen met de gegevens die u verzendt, dus ik neem aan dat u HttpWebResponse bedoelde.

HttpWebResponse maakt zich geen zorgen over de inhoud-lengte die door de server wordt verzonden, deze geeft het alleen ter informatie aan de klant in de eigenschap Headers aan de client.

U moet niet vertrouwen op de inhoudslengte van de server bij het lezen van de reactiestream, blijf gewoon lezen totdat de methode Stream.Read 0 retourneert.

0
toegevoegd
Ik denk niet dat Stream.Read 0 retourneert tot time-out van de server, wanneer Connection: Keep-Alive .
toegevoegd de auteur L.B, de bron