当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > WEB上调用HttpWebRequest奇怪问题的解决方法

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

ASP.NET 中的 WEB上调用HttpWebRequest奇怪问题的解决方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 55 ::
收藏到网摘: n/a

今天做了个在局域网的某客户端取得该局域网的公网IP的小程序,方法是通过登陆外网,让外网告诉你所在局域网的公网IP是多少,方法如下:
复制代码 代码如下:

Uri uri = new Uri("http://www.ruanchen.com/");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = 0;
req.CookieContainer = new CookieContainer();
req.GetRequestStream().Write(new byte [0], 0, 0);
HttpWebResponse res = (HttpWebResponse)(req.GetResponse());
StreamReader rs = new StreamReader(res.GetResponseStream(), System.Text.Encoding.GetEncoding("GB18030"));
string s = rs.ReadToEnd();
rs.Close();
req.Abort();
res.Close();
System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(s, @"ClientIP: \[(?<IP>[0-9\.]*)\]");
if (m.Success) IP = m.Groups["IP"].Value;

这个程序在应用程序上测试通过,可是到了WEB上,死活就是不过,报错误:为不能连接失败,不能到达远程服务器。
“不能连接到远程服务器”这种问题怎么可能发生呢,我明明可以上网的,而且应用程序说明了我的代码是正确的,开始想难道是端口问题?可是我是 localhost啊,改了本地虚拟站点端口也没用。然后就开始疯狂的baidu,google,查到的相似问题不少,没有解决的。
没办法,只好找应用程序和WEB的不同点,其实真相总是和自己擦肩而过,应用程序在调用这段代码时,会自动去调用IE的上网设置,如果本地是通过代理上网的话,它会通过代理来连接远程服务器;但恰恰WEB上和应用程序不同,注意下面图中的IE设置:
做WEB的都知道,我们在本地调试WEB时用的是localhost,如果这个也用代理的话那肯定调试不过,所以都会把最下面那个“对于本地地址不使用代理服务器”勾上。
现在可以明白了,原来是这个搞鬼,我在本地调试,不通过代理当然不能上外网。在代码中加入如下2句
IWebProxy iWebProxy = new WebProxy("172.17.85.16:8080", true);
req.Proxy = iWebProxy;
这样问题就解决了,可是这只是碰到问题解决问题,虽然解决,不代表这个方案可行。
其实作为服务端,根本没必要绕一大圈,还通过其他站点来使得本地获知自己的IP,我们服务端在本地发出请求时就知道了,只要简单一句话:Page.Request.UserHostAddress,我这里就不再赘诉,只说一个取得客户端真实IP的方法:
string IP = (Request.ServerVariables["HTTP_VIA"]!=null)
?Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString()
:Request.ServerVariables["REMOTE_ADDR"].ToString();