C# post问题!希望大家能帮帮忙!【WebClient类的】

wlfbhdx 2011-06-08 06:33:49


下面这段代码!老是post登陆不成功!!易语言里面有个post模块 可以成功!!为什么在C#里面成功不了呢?请指教 谢谢!




public static bool LoadWeb(ref string Name,string Pass)
{
WebClient Wc = new WebClient();
Wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
byte[] data = Encoding.ASCII.GetBytes("loginname=FZZhlxWkI@163.com&loginpass=123456&action=login&token=8fb2b717");
data = Wc.UploadData("http://fanfou.com/login", data);
string Code= Encoding.UTF8.GetString(data);
System.Windows.Forms.MessageBox.Show(Code);//这里判断是否正常登陆网站!!
}



大家说的详细一点 能给个源码参照的 还会给大家加分 谢谢!!
...全文
978 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
netstray 2011-06-17
  • 打赏
  • 举报
回复
帮顶学习…………
wlfbhdx 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 sp1234 的回复:]
引用 35 楼 wlfbhdx 的回复:

问题解决了 但是不知道所以然 呵呵!

请问大哥是如何分析的?不然我只会照葫芦画瓢了!!!

希望大哥解释下!!

其实具体就是您是如何检测需要设置那些东西的?比如您说的重定向!


前后两个写饭其原理很明显完全不是一路,如果你把这个归结为“.net的封装问题”那我就郁闷了。

你之前使用的所谓UploadData,它访问网站既……
[/Quote]

您说的前后两个写法其原理很明显完全不是一路,您为我解释下吗?谢谢!本人新学C# 不久 还望各位高人指点!
  • 打赏
  • 举报
回复
Sorry,msdn的第二页还是解释说模式使用Post了,所以我给lz的“分析”过于武断了,没有仔细研究它的代码。

<<<<<<<<<<<<<<<<<<<<<<<<msdn如下:

此方法使用 STOR 命令上载 FTP 资源。 对于 HTTP 资源,使用 POST 方法。 如果基础请求不为服务器所理解,则所发生的情况将由基础协议类决定。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

那么就要细心看包装过的UploadPost源代码跟自己写一大堆代码的区别了。看来我还真是难以分心看csdn了。唉
ssjywhr 2011-06-12
  • 打赏
  • 举报
回复
帮顶,等待学习了。
  • 打赏
  • 举报
回复
我看了一下msdn:http://msdn.microsoft.com/zh-cn/library/system.net.webclient.uploaddata.aspx

它没有丝毫提到http Post。当然也没有特意告诉你它不是Http post。而你在这个问题的题目中就说这是“post问题”。我想只是你太随意了,或者是缺乏其它方法来了解.net。

msdn并不是给专业.net开发人员看的主要文档。专业开发人员如果有高一点的要求是要看源代码,msdn这类文档仅仅对业余开发人员而言才是比较高的要求。
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 wlfbhdx 的回复:]

问题解决了 但是不知道所以然 呵呵!

请问大哥是如何分析的?不然我只会照葫芦画瓢了!!!

希望大哥解释下!!

其实具体就是您是如何检测需要设置那些东西的?比如您说的重定向!
[/Quote]

前后两个写饭其原理很明显完全不是一路,如果你把这个归结为“.net的封装问题”那我就郁闷了。

你之前使用的所谓UploadData,它访问网站既不是使用http get也不是使用http post命令,而是访问网站并且直接硬塞进字节流。而之后的代码,它是使用http post命令来提交数据。对于稍微知道http通讯基础的人,完全想象不到会搞混。
  • 打赏
  • 举报
回复
[Quote=引用楼主 wlfbhdx 的回复:]
C# code


下面这段代码!老是post登陆不成功!!易语言里面有个post模块 可以成功!!为什么在C#里面成功不了呢?请指教 谢谢!




public static bool LoadWeb(ref string Name,string Pass)
{
WebClient Wc = new WebClient();
……
[/Quote]

你确定是ASCII编码吗?
机器人 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 wlfbhdx 的回复:]

问题解决了 但是不知道所以然 呵呵!

请问大哥是如何分析的?不然我只会照葫芦画瓢了!!!

希望大哥解释下!!

其实具体就是您是如何检测需要设置那些东西的?比如您说的重定向!
[/Quote]

下个Http抓包工具,对比分析,程序的和浏览器的
xcliang2004 2011-06-11
  • 打赏
  • 举报
回复
测试代码编辑
wlfbhdx 2011-06-11
  • 打赏
  • 举报
回复
问题解决了 但是不知道所以然 呵呵!

请问大哥是如何分析的?不然我只会照葫芦画瓢了!!!

希望大哥解释下!!

其实具体就是您是如何检测需要设置那些东西的?比如您说的重定向!
wlfbhdx 2011-06-10
  • 打赏
  • 举报
回复
楼上大哥,不好意思 一直在研究您的回答。没有回来讨论!

我用了您的代码 自己整理了下 还是不能解决问题,难道.net2.0真的POST有很多缺陷吗?
看了您的代码 还有觉得几个小问题想请教下
1、在获取Token的时候req.CookieContainer= CC ;这段代码有点不能理解(把CC赋值给req.CookieContainer,那么CC里面不还是空的吗??因为之前初始化了CC这里是不是位置反了呢?)

2、setCookie = get.Headers["Set-Cookie"];这段代码,既然前面已经用CC来容纳Cookie了,应该产生的Cookie都包含进去了,为什么还要捕捉这个Cookie呢?

3、您说的重定向小弟不是很能理解,我把HttpWebRequest.AllowAutoRedirect给禁用后返回的是空的本文。(我不知道重定向是什么概念,找了资料也没有找到!呵呵,希望您能帮我详细解释下!)


以上是小弟的疑问。唉。问的POST难题没有解决,新的知识点又难住了!呵呵!希望大哥给我解释下这三点,感激不尽!同时这个POST还请大哥研究下 困扰我好多天了!以前我不是学C#的!有点菜!!

wlfbhdx 2011-06-10
  • 打赏
  • 举报
回复
恩 在控制台下是可以了!!我待会转到窗口程序中看看!!感觉C#在某些问题上封装还不是很成功!呵呵!!!
谢谢你了 有问题我在跟帖请教 好好研究下您的代码!!!真心感谢!!
机器人 2011-06-10
  • 打赏
  • 举报
回复
req.CookieContainer = cc; 去掉!
wlfbhdx 2011-06-10
  • 打赏
  • 举报
回复
我将您的代码完完整整的拷贝进去 在Concole下编译!返回的还是没有登录的代码!

很奇怪!您那里能行?
机器人 2011-06-10
  • 打赏
  • 举报
回复
这个是微软WebRequest的一个bug,当返回的cookie的domain和url域名不匹配的话,
就算CookieContainer里有,也不会提交!

机器人 2011-06-10
  • 打赏
  • 举报
回复
sorry,我贴的代码也有点问题!

req.CookieContainer = cc; 这个不要了!!在做POST之前的这句代码!
机器人 2011-06-10
  • 打赏
  • 举报
回复
1. CookieContainer 在Response时填充,一开始要new一个。
以后接着使用就会附带cookie提交。

2. 因为前面我说了,这个网站的cookie由于domain和path的原因,再次提交Request时,
虽然CC有值,但Request实际不带任何取到的Cookie,导致token在服务端验证不通过
所以直接自己ResetCookie,从Response Header里取返回的Cookie
再自己加到Request Header里去。

3. 重定向,查查Http协议:StatusCode=302

4. 上面的代码,你新建一个Console工程,拷贝进去,先跑通再研究。
我在.net2.0下没有问题,如果这样下去我咋解释也不对。
wlfbhdx 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fangxinggood 的回复:]

string username = "xxx";
string passwd = "xxx";
string token = GetToken();
string args = "loginname={0}&loginpass={1}&action=login&token={2}";
// HttpUtility.UrlEncode 需要添加 System.Web……
[/Quote]

还是不行 唉!您帮帮看下我这段代码吧!看对不对!



//这是Post登陆的代码
public static bool LoadWeb(ref string Name,string Pass)
{

string UserName = "FZZhlxWkI@163.com";
string PassWord = "123456";
string Ck = null;
string Token = GetToken(ref Ck);//这个是利用正则表达式提取Token的子程序
//System.Windows.Forms.Application.DoEvents();
//System.Windows.Forms.MessageBox.Show(Token);
string Args = "loginname={0}&loginpass={1}&action=login&token={2}";
Args = string.Format(Args, System.Web.HttpUtility.UrlDecode(UserName), PassWord, Token);

WebClient Wc = new WebClient();
Wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
Wc.Headers.Add("Cookie", Ck);
byte[] data = Encoding.ASCII.GetBytes(Args);
data = Wc.UploadData("http://fanfou.com/login", data);
string Code= Encoding.UTF8.GetString(data);
System.Windows.Forms.MessageBox.Show(Code);//查看返回的文件就可以知道是否登录成功!


}




//下面是GetToken子程序的代码


public static string GetToken(ref string CK)
{
WebClient Wb = new WebClient();
System.Text.RegularExpressions.Regex bds = new System.Text.RegularExpressions.Regex("token\" value=\"(.*?)\"");
byte[] data = Wb.DownloadData("http://fanfou.com/login");
System.Windows.Forms.Application.DoEvents();
String cookie = Wb.ResponseHeaders["Set-Cookie"];
CK= cookie;//获取到Cookie
string Code= Encoding.UTF8.GetString(data);
System.Text.RegularExpressions.Match Mt= bds.Match(Code);
return Mt.Value.Replace("token\" value=\"", null).Replace("\"",null);


}


机器人 2011-06-09
  • 打赏
  • 举报
回复
另外你 GetToken 应该能取到一个cookie,但每次new WebClient 就没有cookie了。
比较怀疑服务端是否能对应上你这token。
机器人 2011-06-09
  • 打赏
  • 举报
回复
string username = "xxx";
string passwd = "xxx";
string token = GetToken();
string args = "loginname={0}&loginpass={1}&action=login&token={2}";
// HttpUtility.UrlEncode 需要添加 System.Web.dll 引用。
args = string.Format(args, HttpUtility.UrlEncode(username), passwd, token);

byte[] data = Encoding.ASCII.GetBytes(args);
加载更多回复(24)

110,570

社区成员

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

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

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