(HttpWebResponse)request.GetResponse()报错,必须先将 ContentLength 字节写入请求流,再调用...

hn_tzy 2014-11-23 02:57:14
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(“https://honors.libraries.psu.edu/browse/author/all/”);
request.CookieContainer = new CookieContainer();
CookieContainer cookie = request.CookieContainer;//如果用不到Cookie,删去即可

//以下是发送的http头,随便加,其中referer挺重要的,有些网站会根据这个来反盗链
request.Referer = "https://honors.libraries.psu.edu/browse/author/all/";
request.Accept = "text/html, application/xhtml+xml, */*";
request.Headers["Accept-Language"] = "en-US";
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)";
request.Headers["UA-CPU"] = "AMD64";
request.Headers["Accept-Encoding"] = "gzip, deflate";
request.Headers["Cache-Control"] = "no-cache";
request.KeepAlive = true;
//上面的http头看情况而定,但是下面俩必须加
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.Host = "honors.libraries.psu.edu";

Encoding encoding = Encoding.UTF8;//根据网站的编码自定义
string[] keys = dicParam.Keys.ToArray<string>();
string[] values = dicParam.Values.ToArray<string>();
int iCount = dicParam.Count;
string postDataStr = "";
for (int i = 0; i < iCount; i++)
{
postDataStr += keys[i] + "=" + values[i] + "&";
}
if (postDataStr.Length > 0)
{
postDataStr = postDataStr.Substring(0, postDataStr.Length - 1);
}
byte[] postData = encoding.GetBytes("csrfmiddlewaretoken=04696113ff3ee3e8220dd9044921e100&browse_start=all&browse_type=author&page=2&display=50&num_display_items=50");//postDataStr即为发送的数据,格式还是和上次说的一样
request.ContentLength = postData.Length*2;
Stream requestStream = request.GetRequestStream();
requestStream.Write(postData, 0, postData.Length);

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
//如果http头中接受gzip的话,这里就要判断是否为有压缩,有的话,直接解压缩即可
if (response.Headers["Content-Encoding"] != null && response.Headers["Content-Encoding"].ToLower().Contains("gzip"))
{
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}

StreamReader streamReader = new StreamReader(responseStream, encoding);
string retString = streamReader.ReadToEnd();

streamReader.Close();
responseStream.Close();
return retString;
}
catch(Exception exp)
{
MessageBox.Show(exp.Message);
return "";
}


执行到HttpWebResponse response = (HttpWebResponse)request.GetResponse();时报错:
"必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetResponse。"

求解决,谢谢!
...全文
963 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hn_tzy 2014-11-23
  • 打赏
  • 举报
回复
没有乘以2也是一样的
save4me 2014-11-23
  • 打赏
  • 举报
回复
你request.ContentLength = postData.Length*2;为什么要将长度乘以2?而你requestStream.Write(postData, 0, postData.Length)写入的是postData.Length,即程序会认为request还没有写完,改成request.ContentLength = postData.Length
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Collections; using System.IO; using System.Text.RegularExpressions; using RE = System.Text.RegularExpressions.Regex; using System.Security.Cryptography.X509Certificates; /*************************************************************************************************************************************************** * *文件名:HttpProc.cs * *创建人:HeDaode * *日 期:2007.09.01 * *描 述:实现HTTP协议中的GET、POST请求 * *使 用:HttpProc.WebClient client = new HttpProc.WebClient(); client.Encoding = System.Text.Encoding.Default;//默认编码方式,根据需要设置其他类型 client.OpenRead("http://www.baidu.com");//普通get请求 MessageBox.Show(client.RespHtml);//获取返回的网页源代码 client.DownloadFile("http://www.codepub.com/upload/163album.rar",@"C:\163album.rar");//下载文件 client.OpenRead("http://passport.baidu.com/?login","username=zhangsan&password=123456");//提交表单,此处是登录百度的示例 client.UploadFile("http://hiup.baidu.com/zhangsan/upload", @"file1=D:\1.mp3");//上传文件 client.UploadFile("http://hiup.baidu.com/zhangsan/upload", "folder=myfolder&size=4003550",@"file1=D:\1.mp3");//提交含文本域和文件域的表单 *****************************************************************************************************************************************************/ namespace HttpProc { /// ///上传事件委托 /// /// /// public delegate void WebClientUploadEvent(object sender, HttpProc.UploadEventArgs e); /// ///下载事件委托 /// /// /// public delegate void WebClientDownloadEvent(object sender, HttpProc.DownloadEventArgs e); /// ///上传事件参数 /// public struct UploadEventArgs { /// ///上传数据总大小 ///

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧