在上回合中,我们不痛不痒的把小泥鳅的数据库从只能供在Windows下运行的Access数据库改为支持跨平台的MYSQL数据库,毫无营养的修改,本回合中,我们将把我们修改后得来的项目往Linux中部署、调试,让它适应Linux.NET的运行环境。
在本回合中,我们将讨论研究:
1、由一个谎言引出另一个谎言
2、遭遇大量大小写问题怎么办
3、requestValidationMode?
4、同一个房顶,却是不同的房间
1、由一个谎言引出另外一个谎言
当我们把小泥鳅部署上Linux之后,首页一般是没有问题的(首页能够打开,并且能够阅读里面的文章),但是当我们点击后台管理时,页面就开始变得奇怪起来,它没有像我们想象那样,出现一个填写用户名密码的界面,而是如下图所示的“问题”页面:
通过阅读堆栈跟踪,我们大概知道程序用一个“AdminPage.CheckLoginAndPermission”的地方进去之后就开始报错,为此,我们需要先确定这个叫做“CheckLoginAndPermission”的东西到底是Mono或其他三方类库里的东西还是我们代码里的。
判断的方法也挺简单,对着Visual Studio 按“Ctrl+Shirt+F”,没错,就是查找功能,只要我们能够在项目中找到相关的代码,那就证明改方法是我们项目中自己的东西。
通过搜索,结果还真让我们找到症结的所在,于是,我们就顺藤摸瓜的进入到该方法里面,该方法的代码如下:
/// <summary> /// 检查登录和权限 /// </summary> protected void CheckLoginAndPermission() { if (!PageUtils.IsLogin) { HttpContext.Current.Response.Redirect("login.aspx?returnurl=" + HttpContext.Current.Server.UrlEncode(RequestHelper.CurrentUrl)); } UserInfo user = UserManager.GetUser(PageUtils.CurrentUserId); if (user == null) //删除已登陆用户时有效 { PageUtils.RemoveUserCookie(); HttpContext.Current.Response.Redirect("login.aspx?returnurl=" + HttpContext.Current.Server.UrlEncode(RequestHelper.CurrentUrl)); } if (StringHelper.GetMD5(user.UserId + HttpContext.Current.Server.UrlEncode(user.UserName) + user.Password) != PageUtils.CurrentKey) { PageUtils.RemoveUserCookie(); HttpContext.Current.Response.Redirect("login.aspx?returnurl=" + HttpContext.Current.Server.UrlEncode(RequestHelper.CurrentUrl)); } if (PageUtils.CurrentUser.Status == 0) { ResponseError("您的用户名已停用", "您的用户名已停用,请与管理员联系!"); } string[] plist = new string[] { "themelist.aspx", "themeedit.aspx", "linklist.aspx", "userlist.aspx", "setting.aspx" ,"categorylist.aspx","taglist.aspx","commentlist.aspx"}; if (PageUtils.CurrentUser.Type == (int)UserType.Author) { string pageName = System.IO.Path.GetFileName(HttpContext.Current.Request.Url.ToString()).ToLower(); foreach (string p in plist) { if (pageName == p) { ResponseError("没有权限", "您没有权限使用此功能,请与管理员联系!"); } } } }