得益网登录客户端
概述
在NetYi程序的1.0版本开发过程中和从1.0版本到2.0版本的升级过程中,遇到了几处挫折,也曾经另辟路径,暂时解决问题,其实1.0版本就是如此形成的。但是,感觉总是不尽完美,这才有了2.0版本的开发,这次终于完美的解决了问题(在我认为)。
编写这种程序总是离不开网络数据包的分析,我用的是WIT(网络数据嗅探器),这个软件你可以在下载栏目中找到。
坎坷经历
CSDN上有一款用VC编写的Netyi登陆器,我从中醒悟到:原来要用Post方式发送数据!
我一贯认为:
别人能写出来的,我就能写出来!
所以我才有了升级到2.0版本的动力。
可恨的拦路虎
拦路虎之一:授权许可
问题出现
不知你们遇到过不:通过IE浏览器或者WebBrowser组件就可以访问网址,但是通过WebClient类或者HttpWebRequest类访问就会遇到错误:"(407) 需要代理身份验证。"
问题分析
这是因为防火墙的原因造成的,这种现象在内部网中会经常遇到,例如有的公司对网络的使用限制比较严密。这肯定是我们在使用WebClient类或HttpWebRequest类时没有指定代理权限造成的。通过IE或者WebBrowser组件能够访问,那么肯定在系统的哪里存在着这样的授权设置,我们只要借用IE的授权许可就行了。
问题解决
代理可以通过WebProxy来定义,通过调用GetDefaultProxy方法可以获取IE的缺省代理权限,然后赋值给HttpWebRequest的Proxy属性即可。需要注意的是,代理权限的信息是分2个步骤来获取的,具体的见下面的代码:
//这里获取了代理服务器的地址和端口
WebProxy myProxy = WebProxy.GetDefaultProxy();
//这里获取了代理服务器的权限(用户名和密码)
myProxy.Credentials = CredentialCache.DefaultCredentials;
myHttpWebRequest.Proxy = myProxy;
放松之后的感言
这第一只拦路虎就让我另辟他途,设计出1.0版本的技术,从技术上讲,1.0版本采用的技术也不可不算一种另类的解决方式,描述的是一种网页的自动化操作过程。
后面有专门讲述1.0版本技术的章节。
拦路虎之二:Post发送方式
问题出现
当攻克了第一只拦路虎之后,按照我的想法调用,总是登录不成功,一开始我总以为是那个guid的问题,后来看了 VC版的登陆器源码。没发现他涉及到guid的计算,反而发现他采用的是Post发送方式。于是,我从网上下载了WIT,开始跟踪从IE发送和从VC版登陆器发送的数据,发现都是用Post方式发送的,而HttpWebRequest默认采用的是Get发送方式。
问题分析
这个问题的原因,一方面是我的疏忽,另一方面是我对http的请求理解模糊。而HttpWebRequest类默认采用的是Get方式,所以一直没有发现问题所在。
问题解决
既然问题清楚了,那么解决就非常简单了,设置HttpWebRequest类的Method属性就可以了。Method属性是一个String类型,可以的取值为:GET、HEAD、POST、PUT、DELETE、TRACE 或 OPTIONS。
//设置Method属性为Post
myHttpWebRequest.Method = "POST";
//设置ContentType为application/x-www-form-urlencoded
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
放松之后的感言
能够发现问题才是关键的,有时一个很简单的问题就能引导你进入误区,例外,合适的工具是很有益处的。
拦路虎之三:Cookie应用
问题出现
上面的问题都解决了,还是无法得到正确的结果。通过WIT发现,两者都有Cookie这个东西。而我自己的代码执行却不存在Cookie。
问题分析
后来发现,当Netyi登录的时候,存在一次2次跳转,这个时候程序需要Cookie的支持。
问题解决
解决这个问题也是很简单的。只要创建一个Cookie容器,并赋给HttpWebRequest即可。
1.0版本的临时解决方案
这个1.0版本的程序,在我的机器上运行了将近3个月的时间,他就放在我的启动菜单里,每天开机运行。
开发感言
当开发完成了,看着那关键的几十行代码,再回顾过去开发的历程,不仅感慨到:就这些代码断断续续的花费了我近三个月的时间,看来开发的精粹在于过程,那个不断发现问题,不断找到解决问题途径的过程。
通过代码量来判断一个人的成果的观念,对于我们来说是错误的。
开发的快乐之处在于开发的过程。
在NetYi程序的1.0版本开发过程中和从1.0版本到2.0版本的升级过程中,遇到了几处挫折,也曾经另辟路径,暂时解决问题,其实1.0版本就是如此形成的。但是,感觉总是不尽完美,这才有了2.0版本的开发,这次终于完美的解决了问题(在我认为)。
编写这种程序总是离不开网络数据包的分析,我用的是WIT(网络数据嗅探器),这个软件你可以在下载栏目中找到。
坎坷经历
CSDN上有一款用VC编写的Netyi登陆器,我从中醒悟到:原来要用Post方式发送数据!
我一贯认为:
别人能写出来的,我就能写出来!
所以我才有了升级到2.0版本的动力。
可恨的拦路虎
拦路虎之一:授权许可
问题出现
不知你们遇到过不:通过IE浏览器或者WebBrowser组件就可以访问网址,但是通过WebClient类或者HttpWebRequest类访问就会遇到错误:"(407) 需要代理身份验证。"
问题分析
这是因为防火墙的原因造成的,这种现象在内部网中会经常遇到,例如有的公司对网络的使用限制比较严密。这肯定是我们在使用WebClient类或HttpWebRequest类时没有指定代理权限造成的。通过IE或者WebBrowser组件能够访问,那么肯定在系统的哪里存在着这样的授权设置,我们只要借用IE的授权许可就行了。
问题解决
代理可以通过WebProxy来定义,通过调用GetDefaultProxy方法可以获取IE的缺省代理权限,然后赋值给HttpWebRequest的Proxy属性即可。需要注意的是,代理权限的信息是分2个步骤来获取的,具体的见下面的代码:
//这里获取了代理服务器的地址和端口
WebProxy myProxy = WebProxy.GetDefaultProxy();
//这里获取了代理服务器的权限(用户名和密码)
myProxy.Credentials = CredentialCache.DefaultCredentials;
myHttpWebRequest.Proxy = myProxy;
放松之后的感言
这第一只拦路虎就让我另辟他途,设计出1.0版本的技术,从技术上讲,1.0版本采用的技术也不可不算一种另类的解决方式,描述的是一种网页的自动化操作过程。
后面有专门讲述1.0版本技术的章节。
拦路虎之二:Post发送方式
问题出现
当攻克了第一只拦路虎之后,按照我的想法调用,总是登录不成功,一开始我总以为是那个guid的问题,后来看了 VC版的登陆器源码。没发现他涉及到guid的计算,反而发现他采用的是Post发送方式。于是,我从网上下载了WIT,开始跟踪从IE发送和从VC版登陆器发送的数据,发现都是用Post方式发送的,而HttpWebRequest默认采用的是Get发送方式。
问题分析
这个问题的原因,一方面是我的疏忽,另一方面是我对http的请求理解模糊。而HttpWebRequest类默认采用的是Get方式,所以一直没有发现问题所在。
问题解决
既然问题清楚了,那么解决就非常简单了,设置HttpWebRequest类的Method属性就可以了。Method属性是一个String类型,可以的取值为:GET、HEAD、POST、PUT、DELETE、TRACE 或 OPTIONS。
//设置Method属性为Post
myHttpWebRequest.Method = "POST";
//设置ContentType为application/x-www-form-urlencoded
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
放松之后的感言
能够发现问题才是关键的,有时一个很简单的问题就能引导你进入误区,例外,合适的工具是很有益处的。
拦路虎之三:Cookie应用
问题出现
上面的问题都解决了,还是无法得到正确的结果。通过WIT发现,两者都有Cookie这个东西。而我自己的代码执行却不存在Cookie。
问题分析
后来发现,当Netyi登录的时候,存在一次2次跳转,这个时候程序需要Cookie的支持。
问题解决
解决这个问题也是很简单的。只要创建一个Cookie容器,并赋给HttpWebRequest即可。
1.0版本的临时解决方案
这个1.0版本的程序,在我的机器上运行了将近3个月的时间,他就放在我的启动菜单里,每天开机运行。
开发感言
当开发完成了,看着那关键的几十行代码,再回顾过去开发的历程,不仅感慨到:就这些代码断断续续的花费了我近三个月的时间,看来开发的精粹在于过程,那个不断发现问题,不断找到解决问题途径的过程。
通过代码量来判断一个人的成果的观念,对于我们来说是错误的。
开发的快乐之处在于开发的过程。
评论
发表评论