• Discuz2.5菜鸟解析-2


    接着上一节我们讲到的Install,我们接着来看第二步的实现。

    检测

    在这个页面中检测的功能,主要是通过以下这段代码来实现检测功能,呵呵,还是用的字符串拼接输出,呵呵,晕没有办法,Discuz的程序员就是这样写的。》

       1:  <%
       2:       bool err = false;
       3:       string result = SetupPage.InitialSystemValidCheck(ref err);
       4:       Response.Write("<font color=red>"+result+"</font>");
       5:  %>

    具体的实现代码如下:

       1:  public static string InitialSystemValidCheck(ref bool error)
       2:  {
       3:      error = false;
       4:      StringBuilder sb = new StringBuilder();
       5:      sb.Append("<table cellSpacing='0' cellPadding='0' width='90%' align='center' border='0' 
       6:                 bgcolor='#666666' style='font-size:12px'>");
       7:   
       8:      HttpContext context = HttpContext.Current;
       9:   
      10:      string filename = null;
      11:      if (context != null)
      12:          filename = context.Server.MapPath("/DNT.config");
      13:      else
      14:          filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DNT.config");
      15:   
      16:      //系统BIN目录检查
      17:      sb.Append(IISSystemBINCheck(ref error));
      18:   
      19:   
      20:      //            GetRootDntconfigPath();
      21:      //检查Dnt.config文件的有效性
      22:      if (!GetRootDntconfigPath())
      23:      {
      24:          sb.Append("<tr style=\"height:15px\"><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' 
      25:                     width='16' height='16'></td><td bgcolor='#ffffff' width='95%'> DNT.config 
      26:                     不可写或没有放置正确, 相关问题详见安装文档!</td></tr>");
      27:          error = true;
      28:      }
      29:      else
      30:      {
      31:          sb.Append("<tr style=\"height:15px\"><td bgcolor='#ffffff' width='5%'><img src='images/ok.gif' 
      32:                     width='16' height='16'></td><td bgcolor='#ffffff' width='95%'>对 DNT.config 验证通过!</td>
      33:                    </tr>");
      34:      }
      35:   
      36:   
      37:      //检查系统目录的有效性
      38:      string folderstr = "admin,aspx,avatars,cache,config,editor,images,templates,upload";
      39:      foreach (string foldler in folderstr.Split(','))
      40:      {
      41:          if (!SystemFolderCheck(foldler))
      42:          {
      43:              sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
      44:                        </td><td bgcolor='#ffffff' width='95%'>对 " + foldler + " 目录没有写入和删除权限!</td>
      45:                        </tr>");
      46:              error = true;
      47:          }
      48:          else
      49:          {
      50:              sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/ok.gif' width='16' height='16'>
      51:                </td><td bgcolor='#ffffff' width='95%'>对 " + foldler + " 目录权限验证通过!</td></tr>");
      52:          }
      53:      }
      54:      string filestr = "admin\\xml\\navmenu.config,javascript\\mymenu.js,install\\systemfile.aspx,upgrade
      55:                       \\systemfile.aspx";
      56:      foreach (string file in filestr.Split(','))
      57:      {
      58:          if (!SystemFileCheck(file))
      59:          {
      60:              sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
      61:                        </td><td bgcolor='#ffffff' width='95%'>对 " + file.Substring(0,file.LastIndexOf('\\')) +
      62:                        " 目录没有写入和删除权限!</td></tr>");
      63:              error = true;
      64:          }
      65:          else
      66:          {
      67:              sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/ok.gif' width='16' height='16'>
      68:              </td><td bgcolor='#ffffff' width='95%'>对 " + file.Substring(0, file.LastIndexOf('\\')) + 
      69:              " 目录权限验证通过!</td></tr>");
      70:          }
      71:      }
      72:   
      73:     if(!TempTest())
      74:     {
      75:         sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
      76:                  </td><td bgcolor='#ffffff' width='95%'>您没有对 " + Path.GetTempPath() + 
      77:                  " 文件夹访问权限,详情参见安装文档.</td></tr>");
      78:         error = true;
      79:     }
      80:     else
      81:     {
      82:      if (!SerialiazeTest())
      83:      {
      84:          sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
      85:                     </td><td bgcolor='#ffffff' width='95%'>对config文件反序列化失败,详情参见安装文档.</td>
      86:                    </tr>");
      87:          error = true;
      88:      }
      89:      else
      90:      {
      91:          sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/ok.gif' width='16' height='16'>
      92:                 </td><td bgcolor='#ffffff' width='95%'>反序列化验证通过!</td></tr>");
      93:      } 
      94:     }
      95:      sb.Append("</table>");
      96:   
      97:      return sb.ToString();
      98:  }

    在以上程序中,它首先会去检测DNT.Config文件的有效性

       1:    string filename = null;
       2:     if (context != null)
       3:                  filename = context.Server.MapPath("/DNT.config");
       4:     else
       5:                  filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DNT.config");

    接着再去检测IIS目录中的DLL是否存在的有效性:

       1:   public static string IISSystemBINCheck(ref bool error)
       2:   {
       3:       string binfolderpath = HttpRuntime.BinDirectory;
       4:   
       5:       string result = "";
       6:       try
       7:       {
       8:           string[] assemblylist = new string[] { "Discuz.Aggregation.dll", "Discuz.Cache.dll", 
       9:                                                  "Discuz.Common.dll", "Discuz.Config.dll", 
      10:               "Discuz.Control.dll", "Discuz.Data.dll", "Discuz.Data.SqlServer.dll","Discuz.Entity.dll",
      11:               "Discuz.Event.dll", "Discuz.Forum.dll",
      12:               "Discuz.Install.dll", "Discuz.Plugin.dll","Discuz.Plugin.Preview.Jpg.dll",
      13:               "Discuz.Plugin.Spread.dll", "Discuz.Web.Admin.dll",
      14:               "Discuz.Web.dll", "Discuz.Web.Services.dll","Interop.SQLDMO.dll","Newtonsoft.Json.dll" };
      15:           bool isAssemblyInexistence = false;
      16:           ArrayList inexistenceAssemblyList = new ArrayList();
      17:           foreach (string assembly in assemblylist)
      18:           {
      19:               if (!File.Exists(binfolderpath + assembly))
      20:               {
      21:                   isAssemblyInexistence = true;
      22:                   error = true;
      23:                   inexistenceAssemblyList.Add(assembly);
      24:               }
      25:           }
      26:           if (isAssemblyInexistence)
      27:           {
      28:               foreach (string assembly in inexistenceAssemblyList)
      29:               {
      30:                       result += "<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' 
      31:                                 width='16' height='16'></td><td bgcolor='#ffffff' width='95%'>" + assembly + 
      32:                                " 文件放置不正确<br/>请将所有的dll文件复制到目录 " + binfolderpath + 
      33:                                " 中.</td></tr>";
      34:               }
      35:           }
      36:       }
      37:       catch
      38:       {
      39:           result += "<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
      40:                     </td><td bgcolor='#ffffff' width='95%'>请将所有的dll文件复制到目录 " + binfolderpath 
      41:                      + " 中.</td></tr>";
      42:           error = true;
      43:       }
      44:   
      45:       return result;
      46:   }
    在以上代码中用到了一些不常用的类,比如HttpRuntime类,我们过HttpRuntime这个类中的BinDirectory这个属性找到WEB程序所用到的bin目录,
    之后用IO中的File.Exist来检测这个文件是否存在,不过我再一次的问一下,难道Discuz的程序员不知道@号的存在???,再一个就是对StringBuilder
    在程序中的性能问题表示怀疑。

    再接下来是检测Dnt.config文件的有效性:

       1:   public static bool GetRootDntconfigPath()
       2:   {
       3:       try
       4:       {
       5:   
       6:           HttpContext context = HttpContext.Current;
       7:           string webconfigfile = "";
       8:           if (!Utils.FileExists(webconfigfile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DNT.config"))
       9:               && (!Utils.FileExists(webconfigfile = Path.Combine(context.Request.PhysicalApplicationPath, "dnt.config")))
      10:               && (!Utils.FileExists(webconfigfile = Utils.GetMapPath("../dnt.config")))
      11:               && (!Utils.FileExists(webconfigfile = Utils.GetMapPath("http://www.cnblogs.com/dnt.config")))
      12:               && (!Utils.FileExists(webconfigfile = Utils.GetMapPath("http://www.cnblogs.com/../dnt.config"))))
      13:           {
      14:               return false;
      15:           }
      16:           else
      17:           {
      18:               StreamReader sr = new StreamReader(webconfigfile);
      19:               string content = sr.ReadToEnd();
      20:               sr.Close();
      21:               content += " ";
      22:               StreamWriter sw = new StreamWriter(webconfigfile, false);
      23:               sw.Write(content);
      24:               sw.Close();
      25:               return true;
      26:           }
      27:       }
      28:       catch
      29:       {
      30:           return false;
      31:       }
      32:   }
    在这个检测的过程中用到了Discuz.Common中的Utils.cs这个类,这个类中主要是提供了一些工具类的支持,呵呵。其中有一些真的是不错的,以后可以
    拿来借鉴一下。

    为了方便 大家理解我做了一张思维图,供大家分析。

     Install所用到的所有类

    其中的SerialiazeTest()成员方法中用到了序列化的功能。在下一小节中再继续分析。

  • 相关阅读:
    集合的整理
    js中用tagname和id获取元素的3种方法
    浏览器的工作原理
    在浏览器中输入URL按下回车键后发生了什么
    浏览器内核、渲染引擎、js引擎
    浏览器的重绘、回流及网页优化
    SQL SERVER大话存储结构(1)
    SQL SERVER大话存储结构(2)
    SQL SERVER大话存储结构(3)
    基于binlog来分析mysql的行记录修改情况(python脚本分析)
  • 原文地址:https://www.cnblogs.com/chu888chu888/p/1256630.html
Copyright © 2020-2023  润新知