问题描述
我正在尝试通过 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
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 (将#修改为@)