最近一直在看牛腩老师的新闻发布系统.到现在感觉最大的就是非常地想总结。一是B/S中涉及到的html,css,asp.net,javascript,jquery,ajax等等,他们究竟是什么,我只是能通过这个系统有一个模糊的想法,他们之间的关系是怎么样的,还理不清。现在跟着做了一遍,但是很多该了解的东西还没有掌握。这是我接下来该做得事情---建立B/S的全局观。二是在做得过程中由于工具和语言的发展,很多的地方已经不一样了。边做边调bug。下面我总结了一下我做得过程中出现的bug,以及解决办法。
1.获取客户端IPv4地址
在视频牛腩老师采用这种方法取出客户端ip:Request.ServerVariables["REMOTE_ADDR"];在我这里测试出的结果是"::1".而不是想象的类似于"127.0.0.1"这样的格式的IP地址.这是因为我使用的window8的系统,默认取出的是IPv6的地址。我们可以将网络连接中 IPv6的协议勾掉(这点在网上找到的办法,没有测试过)。我采用的是另一种办法,将ipv6的地址转为ipv4的。这里还需要注意一点:代理服务器.
在 ASP 中使用 Request.ServerVariables("REMOTE_ADDR") 来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 来读取。但是也不是每个代理服务器都能用此方法获得.如果客户端没有通过代理服务器来访问,那么用 Request.ServerVariables ("HTTP_X_FORWARDED_FOR") 取到的值将是空的.可以这么处理:
...... userip = Request.ServerVariables("HTTP_X_FORWARDED_FOR") If userip = "" Then userip = Request.ServerVariables("REMOTE_ADDR") ......
public string GetClientIPv4() '获取客户端Ipv4地址。 { string ipv4 = String.Empty; foreach (IPAddress ip in Dns.GetHostAddresses(GetClientIP())) '调用下面的方法获取IP。 { if (ip.AddressFamily.ToString() == "InterNetwork") { ipv4 = ip.ToString(); break; } } if (ipv4 != String.Empty) { return ipv4; } foreach (IPAddress ip in Dns.GetHostEntry(GetClientIP()).AddressList) { if (ip.AddressFamily.ToString() == "InterNetwork") { ipv4 = ip.ToString(); break; } } return ipv4; } /// <summary> /// 取得客户端地址 /// </summary> public string GetClientIP() { if (null == HttpContext.Current.Request.ServerVariables["HTTP_VIA"]) '使用代理服务器了吗? { return HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; '是,采用REMOTE_ADDR这种方法。 } else { return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; '不是,采用HTTP_X-FORWARDED_FOR这种方法。 } }
2.将密码转换为MD5码
牛腩老师的视频中需要将密码加密为MD5码,他的方法为:
string Password = FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox1.Text.ToString(), "MD5");我的vs2012中出现此方法已过时的错误提示。下面是我的解决方案:需要引用命名空间: System.Web.Security;
//将字符加密为MD5码 public String md5(String s) { System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s); bytes = md5.ComputeHash(bytes); md5.Clear(); string ret = ""; for (int i = 0; i < bytes.Length; i++) { ret += Convert.ToString(bytes[i], 16).PadLeft(2, '0'); } return ret.PadLeft(32, '0'); }
3.引用第三方控件FreeTextBox
在视频中引用了第三方控件FreeTextBox后,编译出现错误:错误"Lc.exe 已退出,代码 -1 ".
解决方案:
1、就是把Properties文件下的license.licx给删除,重新编译。
2、如果还出现这个问题的话,必须将你的破解版的哪个组件使用lidism给翻译成il语言,然后用ilasm重新编译成dll,在编译的时候加入 /key=[你的强名称文件].snk 参数,自己加入强名称签名,然后使用vs2005重新编译,就可以成功了。
4.添加asp.net 的验证控件时弹出的错误。如下:
([ASP.NET]WebForms UnobtrusiveValidationMode 需要 'jquery' 的ScriptResourceMapping。请加入 ScriptResourceMapping 命名的 jquery (区分大小写)。)
解决办法:在page_load事件中加入下面这句话:UnobtrusiveValidationMode = UnobtrusiveValidationMode.None; 就可以了。(原因还不了解。)