如何在 HttpRequest 中处理事件流分块响应

问题描述

我正在尝试通过 C# 中的 Http 请求从 url 获取响应。但我没有得到任何回应。当我分析 fiddler 中的流量时,我在响应标头中得到以下信息:-

HTTP/1.1 200 OK
Server: Nginx/1.15.9
Date: Wed,03 Mar 2021 06:45:23 GMT
Content-Type: text/event-stream
transfer-encoding: chunked
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Strict-Transport-Security: max-age=15724800; includeSubDomains

我正在使用以下代码从 Http 请求中获取响应:-

HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(strURL);
                objRequest.Method = strMethod;
                objRequest.Proxy = hWebproxy;
                objRequest.AllowAutoRedirect = true;
             
                objRequest.Timeout = 160000;
                objRequest.KeepAlive = true;
                objRequest.SendChunked = true;
                objRequest.AllowWriteStreamBuffering = false;
                objRequest.AllowReadStreamBuffering = false;
                objRequest.ProtocolVersion = HttpVersion.Version11;
                objRequest.Accept = strAccept;
                if (!string.IsNullOrEmpty(strContentType))
                    objRequest.ContentType = strContentType;
                if (!string.IsNullOrEmpty(strRefr))
                    objRequest.Referer = strRefr;
                if (httpRequestHeaderColl != null)
                {
                    foreach (keyvaluePair<string,string> kvp in httpRequestHeaderColl)
                    {
                        if (kvp.Key != "User-Agent")
                        {
                            objRequest.Headers.Add(kvp.Key,kvp.Value);
                        }
                        else
                        {
                            objRequest.UserAgent = kvp.Value;
                        }
                    }
                }
                if (strRefr != null)
                {
                    objRequest.Referer = strRefr;
                }
                if (CookiekeyvaluePair != null)
                {
                    objRequest.Headers["Cookie"] = CookiekeyvaluePair;
                }
                if (strPost != null && (strMethod == "POST" || strMethod.ToLower().Contains("put")))
                {
                    try 
                    {
                        objRequest.ContentLength = strPost.Length;
                        myWriter = new StreamWriter(objRequest.GetRequestStream());
                        myWriter.Write(strPost);
                    }
                    catch
                    {

                    }
                    finally
                    {
                        myWriter.Close();
                    }
                }
                
               
                HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

                Encoding encoding;
                Charset = objResponse.CharacterSet;
                if (string.IsNullOrEmpty(Charset))
                {
                    encoding = Encoding.UTF8;
                }
                else
                {
                    
                    encoding = Encoding.GetEncoding(Charset);
                }
                Stream _ResponseStream = objResponse.GetResponseStream();
                if (objResponse.ContentEncoding != null)
                {
                    if (objResponse.ContentEncoding.ToLower().Contains("gzip"))
                        _ResponseStream = new GZipStream(_ResponseStream,CompressionMode.Decompress);
                    else if (objResponse.ContentEncoding.ToLower().Contains("deflate"))
                        _ResponseStream = new DeflateStream(_ResponseStream,CompressionMode.Decompress);
                }
                CookiekeyvaluePair = objResponse.GetResponseHeader("Set-Cookie").ToString();
                strLocation = Convert.ToString(objResponse.GetResponseHeader("Location"));
                using (StreamReader sr = new StreamReader(_ResponseStream,encoding))
                {
                    if (sr != null)
                    {
                       
                        result += sr.ReadToEnd();
                        sr.Close();
                        objResponse.Close();
                    }
                }
                
            }
            
            catch (Exception ex)
            {

            }

但是此代码挂在 sr.ReadToEnd() 上,然后永远不会返回。在网上搜索后,我找到了这段代码来获得分块响应:-

 Byte[] buf = new byte[8196];
            int count = 0;
              do
                {
                    count = _ResponseStream.Read(buf,buf.Length);
                    if (count != 0)
                    {
                        sb.Append(encoding.GetString(buf,count));
                       
                    }
                } while (count > 0);

但是在循环的 2 或 3 次迭代之后,此代码也挂在 ResponseStream.Read(buf,buf.Length)

I do not kNow the content length of the response in advance because when I checked the content length property of the response object it shows -1.  I am confused how to get the complete response here.  Can anybody help me on this ?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)