最近一直在看牛腩老师的新闻发布系统.到现在感觉最大的就是非常地想总结。一是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")
......
我的解决办法(取出真正的IPv4地址):需要引用命名空间:System.Net
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; 就可以了。(原因还不了解。)