RSS 2.0 Feed
2007-01 Entries
摘要:数据库的自动安装、升级是一个非常实用的功能,在初次安装软件,升级软件的时候可以节省大量的时间和无趣的工作,而且也节省了给用户写数据库升级指导的说明。 要实现数据库的自动安装、升级,其实并不难。我们在肥猫博客中,提供了这样的功能。每次程序升级,自己用起来都觉得非常地爽,不用繁琐的指导用户,也不用无趣的操作。那么在这里我们就介绍下如何像肥猫博客一样在asp.net中提供这样的功能。 首先,我们要对sql语句非常熟悉,数据库的自动安装和升级都是基于sql脚本的,准备好脚本文件是必须的。 一般来讲,会存在多个脚本文件: 1.         第一次安装所需要的脚本文件 2.         每一次升级所需要的脚本文件。这个升级脚本文件只需要提供从上一版本升级过来所需要的Sql语句就可以,其他的都不需要。 建立一份版本历史文件,这一般可以是一个xml文件,类似如下: <?xml version="1.0" encoding="utf-8"?> <sqlscripts>     <sqlscript dbversion="1.1" dspt="V1.0到V1.10的升级包:增加了皮肤的数据" filename="v1_1.sql" />     <sqlscript dbversion="1.11" dspt="V1.10到V1.11的升级包:增加了订阅中最新文章的处理" filename="v1_11.sql" />     <sqlscript dbversion="1.2" dspt="V1.11到V1.20的升级包:增加了垃圾信息、IP管理" filename="v1_2.sql" />     <sqlscript dbversion="1.3" dspt="V1.20到V1.30的升级包:增加了流量统计分析" filename="v1_3.sql" />     <sqlscript dbversion="1.4" dspt="V1.30到V1.40的升级包:增加了我读,我看" filename="v1_4.sql" /> </sqlscripts> dbversion指的是数据库的版本号,dspt是对应的说明,filename就是上面提到的Sql脚本文件了。我们每次升级程序中的功能时,如果有数据库的升级,都应该增加对应的数据和Sql脚本文件。 另外还要做的准备工作是,要在程序中记录当前程序的版本codeversion,在数据库中记录当前数据库的版本dbversion。需要升级哪些sql脚本,是通过比较这两个版本值决定的。也就是根据codeversion和dbversion的值来确定我们应该执行上面列出的哪些脚本文件。 上面说的都是一些准备工作,下面我们可以开始具体的数据库自动安装、升级的程序开发了。 1.         提供类似如下的界面,告诉用户当前的版本,以及将会进行哪些升级工作。         private void ShowVersion()         {             // 显示当前的程序版本号、数据库版本号             double dbversion = fmPage.Provider.GetDatabaseVersion();             LabelCodeVersion.Text = fmUtility.CodeVersion.ToString("F2");             LabelDbVersion.Text = dbversion.ToString("F2");               XmlDocument doc = new XmlDocument();               // 读取版本历史文件             string filepath = HttpContext.Current.Request.MapPath("/admin/setup/history.xml");             doc.Load(filepath);               TextScripts.Text = string.Empty;               foreach(XmlNode node in doc.DocumentElement.ChildNodes)             {                 double nodeversion = double.Parse(node.Attributes["dbversion"].Value);                   // 比较数据库版本和程序版本,找出需要更新的列表                 if(nodeversion > dbversion && nodeversion <= fmUtility.CodeVersion)                 {                     TextScripts.Text += "版本号: " + nodeversion.ToString("F2") + "\n";                     TextScripts.Text += "       " + node.Attributes["dspt"].Value +......[阅读全文]

posted @ | Feedback (2) |

摘要:UrlRewriter是我们现在做博客系统基本上必用的功能,除了对搜索引擎友好外,人也比较容易记,看着也舒服。关于UrlRewriter的文章其实也是非常多,由于有网友提出想了解肥猫博客使用的UrlRewriter技术,因此这里主要针对在肥猫博客中使用的UrlRewriter技术做一个介绍。这个实现主要是针对ASP.NET 1.1体系的,可能你要说ASP.NET 2.0都出来了,还要谈1.1,可是我一直用的是1.1,也没有接触过2.0,所以针对ASP.NET 2.0的UrlRewriter技术不在这里阐述。   UrlRewriter有多种实现方式,常用的有:HttpModule,HttpHandler和Application_BeginRequest方式处理。对于前2种,现在都有很成熟的解决方法,比较有名的就是UrlRewriter.NET,我建议你如果要用到UrlRewriter首先就应该优先考虑这种成熟的解决方案。UrlRewriter.NET在这里不作介绍。 在肥猫博客中,我使用的是Global.ascx文件中的Application_BeginRequest方式。对于这种方式,我们需要做3个工作: 1.         定义UrlRewriter的重写方式,一般这可以是一个xml文件来定义你需要用到的所有重写URL。 该文件的内容大致如下: <?xml version="1.0" encoding="utf-8" ?> <pages>     <page name="" url="^/admin(.*)$" rewriter="/admin$1" />     <page name="" url="^/control(.*)$" rewriter="/control$1" />       <page name="" url="^/([A-Za-z0-9]+)/default\.aspx$" rewriter="/default.aspx?m=$1" />     <page name="BlogHome" url="^/([A-Za-z0-9]+)/blog/default\.aspx$" rewriter="/blog/default.aspx?m=$1" /> </pages>        这个文件中最主要的定义是url和rewriter,其他的都是程序中辅助用到的字段。url定义的是友好的地址,比如:http://www.fmblog.cn/jasper/feed/default.aspx,而rewriter定义的则是根据这个友好地址如何生成对应的实际地址,比如上面那个友好地址对应的实际地址为:http://www.fmblog.cn/feed/default.aspx?m=jasper        所有系统中用到的重写url都必须实现定义好,而且我建议用到正则表达式来定义。 2.       使用HttpContext.Current.RewritePath(url)方法来将友好地址变成实际地址 有了上面第一步的url定义,接着就在Global.ascx的Application_BeginRequest方法中将友好地址转变为实际地址。             foreach(fmblog.Data.Config.UrlRule item in fmblog.Data.Config.Url.Rules)             {                 Regex regex = new Regex(item.Url, RegexOptions.IgnoreCase);                   if(regex.IsMatch(Request.RawUrl))                 {                     string url = regex.Replace(Request.RawUrl, item.Rewriter);                       HttpContext.Current.RewritePath(url);                                         return;                 }             } 这个方法很简单,fmblog.Data.Config.Url.Rules读取的就是第1步中的所有url重写规则,我们看这个方法就是很简单的把实际地址得到后,进行了一个RewritePath操作,这样就完成了我们需要的重写功能。不过,这会带来一个小问题。 3.         带来的小问题就是所有HtmlForm的Action都是实际地址,而不是友好地址 为了解决这个HtmlForm的Action问题,我们需要自己写一个MyForm从HtmlForm继承过来,并且在输出的时候,将action改成我们需要的实际地址。这个我们通过重载MyForm的RenderAttributes方法实现,如下所示:         protected override void RenderAttributes(System.Web.UI.HtmlTextWriter writer)         {             writer.WriteAttribute("name", this.Name);             base.Attributes.Remove("name");               writer.WriteAttribute("method", this.Method);             base.Attributes.Remove("method");               this.Attributes.Render(writer);               writer.WriteAttribute("action", this.Page.Request.RawUrl);             base.Attributes.Remove("action");               if (base.ID != null)             {                 writer.WriteAttribute("id", base.ClientID);             }         }   然后将页面上用到的Form都改成这个MyForm就好了。   这种实现方式,还有1个小问题,就是登陆转向的问题。如果你没有登陆,但是访问了一个需要登陆认证的页面,在ASP.NET中会自动将你导航到登陆页面,并且在登陆后会重定向到需要访问的页面。   如果你的后台页面也用到了UrlRewriter,那么转向登陆页面后,其Url就会变成实际地址。如果要解决这个问题,请采用其他的方法,比如UrlRewriter.NET。在肥猫博客中,后台页面都是使用的实际页面,所以为了控制代码我们采用了这种自己写代码的简单处理方式。 其实,UrlRewriter现在是一个很成熟的东西,网上有很多内容肯定能够符合你的需求,这里只是简单的介绍一个可行的方案,还有其他很多成熟方案可以采用,所以在使用UrlRewriter之前,先在网上找些资料好对症下药。 不管怎样,最简单的还是直接使用成熟的UrlRewriter控件。  ...[阅读全文]

posted @ | Feedback (5) |