用XMLHTTP通过代理服务器从服务提取数据,比如说从WEBSERVICE、ASP、ASPX提取数据,我在用的时候曾经出现过一些不明问题,往往通不过代理认证。经过多次摸索,终于弄明白其中的原因,现分拿出来分享。
在VB中调用方法是这样的:
Dim objHTTP As New XMLHTTP
objHTTP.open "post", http://192.168.1.2/web.asmx, False
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.send (strRequest) '如果上面是“GET”方式发送的,这句是没有用的,所以得用“POST”方式
returnStr = objHTTP.responseText '以文本的方式返回数据
以前看到说是要用proxycfg.exe这个winhttp配置命令来进行配置,实际上这是不正确的,其实是没有必要的,设不设是一回事,至少在XP系统中是这样的,只要在IE浏器中设置了正确的代理服务器地址就OK。
而代理服务的用户名的密码曾经看到过是这样发送的:
objHTTP.open "post", http://192.168.1.2/web.asmx, False,username,password
实际上这是错误的,这个用户名和密码不是发往代理服务器认证,而是发往需要认证用户的IIS服务器的。代理服务器的用户名的密码是不需要设置的,它会像IE通过代理访问一样,在需要的时候会弹出用户名和密码的输入框。但我在测试中发现,不同的代理服务器会有所不同,一旦在代理服务器上将认证密码改动,调试的时候基本上不会调用成功,因为些时程序发往代理服务器的密码还是原来的,的情况下会有弹出框要求重新输入密码,如在用CCPROXY代理服务器的时候,但大多数好像不行。我曾这个地方折腾了好久,一直认为是自己的程序写得不对,后来发现只要把VB关掉重新打开,就会有输入框了。原来原因是这样的,一个程序在调用的时候,会记往原来的用户名和密码,如果在中途代理服务器改变了密码或用户名,一般情况下程序不会感知,但有些代理服务器可以告知程序重新输入,但我测试的大多数不行。这时只要重启程序就OK。
在.NET中情况差不多,我只用过通过WEB引用调用WEBSERVICE,如果有代理服务器,一定要在IE中设置正确,而且一定要先上一下网,把代理服务器的用户和密码输入正确后,在.NET中才能调用成功,因为这.NET中的用户名和密码是IE保持同步的,没用自动调出输入框来输入,如果不正确就出错误,所以调用的时候一定要用try语句。