Does .NET's HttpWebResponse uncompress automatically GZiped and Deflated responses?

前端 未结 4 1939
囚心锁ツ
囚心锁ツ 2020-11-28 10:40

I am trying to do a request that accepts a compressed response

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.Headers.Add(HttpReque         


        
相关标签:
4条回答
  • 2020-11-28 10:45

    For .NET Core things are a little more involved. A GZipStream is needed as there isn't a property (as of writing) for AutomaticCompression Consider the following GET example:

    var req = WebRequest.CreateHttp(uri);
    
    /*
     * Headers
     */
    req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
    
    /*
     * Execute
     */
    try
    {
        using (var resp = await req.GetResponseAsync())
        {
            using (var str = resp.GetResponseStream())
            using (var gsr = new GZipStream(str, CompressionMode.Decompress))
            using (var sr = new StreamReader(gsr))
    
            {
                string s = await sr.ReadToEndAsync();  
            }
        }
    }
    catch (WebException ex)
    {
        using (HttpWebResponse response = (HttpWebResponse)ex.Response)
        {
            using (StreamReader sr = new StreamReader(response.GetResponseStream()))
            {
                string respStr = sr.ReadToEnd();
                int statusCode = (int)response.StatusCode;
    
                string errorMsh = $"Request ({url}) failed ({statusCode}) on, with error: {respStr}";
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 10:53

    I think you have to decompress the stream yourself. Here's an article on how to do it:

    http://www.west-wind.com/WebLog/posts/102969.aspx

    0 讨论(0)
  • 2020-11-28 10:58

    GZIP and Deflate responses are not automatically handled. See this article for the details: HttpWebRequest and GZip Http Responses

    0 讨论(0)
  • 2020-11-28 11:00

    I found the answer.

    You can change the code to:

    var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    

    And you will have automatic decompression. No need to change the rest of the code.

    0 讨论(0)
提交回复
热议问题