关于C#用post方式请求asp.net服务器返回异常问题

tuzibai 2016-04-20 08:58:13
public string getHtml()
{
string _url = "http://www.qdnggzy.cn/qdnztb/jyxx/056002/056002001/MoreInfo.aspx?CategoryNum=056002001";
HtmlWeb htmlWeb = new HtmlWeb();
HtmlAgilityPack.HtmlDocument htmlDoc = htmlWeb.Load(_url);
HtmlNode htmlNode = htmlDoc.DocumentNode.SelectSingleNode("//input[@id='__VIEWSTATE']");
string viewStateValue = htmlNode.Attributes["value"].Value;

StringBuilder sb = new StringBuilder();
CookieContainer cookieContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url);
request.Method = "GET";
request.CookieContainer = cookieContainer;

using (WebResponse response = request.GetResponse())
{

using (StreamReader reader = new StreamReader(response.GetResponseStream(),Encoding.GetEncoding("gb2312")))
{
reader.ReadToEnd();
}
CookieCollection cookies = cookieContainer.GetCookies(new Uri(_url));
if (cookies != null)
{
foreach (System.Net.Cookie cookie in cookies)
sb.AppendLine(cookie.ToString());
}

string tbViewState =viewStateValue;


string postdt = "__VIEWSTATE=" + tbViewState + "&__EVENTTARGET=MoreInfoList1$Pager&__EVENTARGUMENT=2";
string finalHtml = readPostData(_url, postdt, cookies, "");



return finalHtml;
}
=====post方法=====
public static string readPostData(string Url, string postDataStr, CookieCollection cookies,string referer)
{
HttpWebRequest request = null;
if (Url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(Url) as HttpWebRequest;
//创建证书文件
System.Security.Cryptography.X509Certificates.X509Certificate objx509 = new System.Security.Cryptography.X509Certificates.X509Certificate(Application.StartupPath + @"\\licensefile\zjs.cer");
//添加到请求里
request.ClientCertificates.Add(objx509);
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = (HttpWebRequest)WebRequest.Create(Url);
}
//随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
if (!string.IsNullOrEmpty(referer))
{
request.Referer = referer;
}
//postDataStr = System.Web.HttpUtility.UrlEncode(postDataStr);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
//byte[] data = encoding.GetBytes(postData);
request.ContentLength = postDataStr.Length;
Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
// myStreamWriter.Write(data,0,data.Length);
myStreamWriter.Write(postDataStr);
myStreamWriter.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("gb2312"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
//测试一下如果是Unicode则直接转换成文字
retString = UnicodeToString(retString);

return retString;
}

网址:http://www.qdnggzy.cn/qdnztb/jyxx/056002/056002001/MoreInfo.aspx?CategoryNum=056002001

要求:用程序动态获取各个页面的信息(比如,第二页,第三页……)

我已经试了很多次,cookie,post数据都带上了啊,就是post不成功,请大侠们帮忙看看是咋回事。。愿意奉上仅有的70分
...全文
537 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
oydzmss 2016-06-30
  • 打赏
  • 举报
回复
楼主问题解决了吗?能否告知下具体解决方法?
tuzibai 2016-04-23
  • 打赏
  • 举报
回复
我现在在怀疑是不是对获取到的viewstate没有进行URL转码,我要重新试试看看啥情况。
tuzibai 2016-04-23
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
贴出你的 http 调试。

webforms


cookies


raw


我对post的数据也进行了URL转码,还是不行,


看post的结果


正确的结果应该是http://www.qdnggzy.cn/qdnztb/jyxx/056002/056002001/MoreInfo.aspx?CategoryNum=056002001的第二页数据
tuzibai 2016-04-23
  • 打赏
  • 举报
回复
引用 7 楼 hanjun0612 的回复:
接口端,应该返回给你什么样的数据格式?
正确的结果应该是http://www.qdnggzy.cn/qdnztb/jyxx/056002/056002001/MoreInfo.aspx?CategoryNum=056002001的第二页数据
正怒月神 版主 2016-04-21
  • 打赏
  • 举报
回复
接口端,应该返回给你什么样的数据格式?
  • 打赏
  • 举报
回复
贴出你的 http 调试。
tuzibai 2016-04-21
  • 打赏
  • 举报
回复
引用 2 楼 FoxDave 的回复:
什么异常??
没有异常,只是把数据post过去了,得不到服务器返回的结果,返回的只是几行简单的HTML代码
tuzibai 2016-04-21
  • 打赏
  • 举报
回复
引用 1 楼 myhope88 的回复:
直接用get就行了吧
网站信息里面,查看下一页的时候就是用的post方法,我模拟操作,肯定是要用post了,还可以直接用get吗?
Justin-Liu 2016-04-21
  • 打赏
  • 举报
回复
什么异常??
myhope88 2016-04-21
  • 打赏
  • 举报
回复
直接用get就行了吧

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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