1、按照Windows2003安装光盘的提示安装,默认情况下2003没有把IIS6.0安装在系统里面。2、IIS6.0的安装 开始菜单—>控制面板—>添加或删除程序—>添加/删除Windows组件 应用程序 ———ASP.NET(可选) |——启用网络 COM+ 访问(必选) |——Internet 信息服务(IIS)———Internet 信息服务管理器(必选) |——公用文件(必选) |——万维网服务———Active Server pages(必选) |——Internet 数据连接器(可选) |——WebDAV 发布(可选) |——万维网服务(必选) |——在服务器端的包含文件(可选) 然后点击确定—>下一步安装。(具体见本文附件1)3、系统补丁的更新 点击开始菜单—>所有程序—>Windows Update 按照提示进行补丁的安装。4、备份系统 用GHOST备份系统。5、安装常用的软件 例如:杀毒软件、解压缩软件等;安装完毕后,配置杀毒软件,扫描系统漏洞,安装之后用GHOST再次备份系统。6、先关闭不需要的端口 开启防火墙 导入IPSEC策略在”网络连接”里,把不需要的协议和服务都删掉,这里只安装了基本的Internet协议(TCP/IP),由于要控制带宽流量服务,额外安装了Qos数据包计划程序。在高级tcp/ip设置里--"NetBIOS"设置"禁用tcp/IP上的NetBIOS(S)"。在高级选项里,使用"Internet连接防火墙",这是windows 2003 自带的防火墙,在2000系统里没有的功能,虽然没什么功能,但可以屏蔽端口,这样已经基本达到了一个IPSec的功能。修改3389远程连接端口修改注册表. 开始--运行--regedit 依次展开 HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTROLSET/CONTROL/ TERMINAL SERVER/WDS/RDPWD/TDS/TCP 右边键值中 PortNumber 改为你想用的端口号.注意使用十进制(例 10000 ) HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTROLSET/CONTROL/TERMINAL SERVER/ WINSTATIONS/RDP-TCP/ 右边键值中 PortNumber 改为你想用的端口号.注意使用十进制(例 10000 ) 注意:别忘了在WINDOWS2003自带的防火墙给+上10000端口修改完毕.重新启动服务器.设置生效.二、用户安全设置 1、禁用Guest账号 在计算机管理的用户里面把Guest账号禁用。为了保险起见,最好给Guest加一个复杂的密码。你可以打开记事本,在里面输入一串包含特殊字符、数字、字母的长字符串,然后把它作为Guest用户的密码拷进去。 2、限制不必要的用户 去掉所有的Duplicate User用户、测试用户、共享用户等等。用户组策略设置相应权限,并且经常检查系统的用户,删除已经不再使用的用户。这些用户很多时候都是黑客们入侵系统的突破口。 3、把系统Administrator账号改名 大家都知道,Windows 2003 的Administrator用户是不能被停用的,这意味着别人可以一遍又一遍地尝试这个用户的密码。尽量把它伪装成普通用户,比如改成Guesycludx。 4、创建一个陷阱用户 什么是陷阱用户?即创建一个名为“Administrator”的本地用户,把它的权限设置成最低,什么事也干不了的那种,并且加上一个超过10位的超级复杂密码。这样可以让那些 Hacker们忙上一段时间,借此发现它们的入侵企图。 5、把共享文件的权限从Everyone组改成授权用户 任何时候都不要把共享文件的用户设置成“Everyone”组,包括打印共享,默认的属性就是“Everyone”组的,一定不要忘了改。 6、开启用户策略 使用用户策略,分别设置复位用户锁定计数器时间为20分钟,用户锁定时间为20分钟,用户锁定阈值为3次。 (该项为可选)7、不让系统显示上次登录的用户名 默认情况下,登录对话框中会显示上次登录的用户名。这使得别人可以很容易地得到系统的一些用户名,进而做密码猜测。修改注册表可以不让对话框里显示上次登录的用户名。方法为:打开注册表编辑器并找到注册表“HKLM\Software\Microsoft\Windows T\CurrentVersion\Winlogon\Dont-DisplayLastUserName”,把REG_SZ的键值改成1。 密码安全设置 1、使用安全密码 一些公司的管理员创建账号的时候往往用公司名、计算机名做用户名,然后又把这些用户的密码设置得太简单,比如“welcome”等等。因此,要注意密码的复杂性,还要记住经常改密码。 2、设置屏幕保护密码 这是一个很简单也很有必要的操作。设置屏幕保护密码也是防止内部人员破坏服务器的一个屏障。 3、开启密码策略 注意应用密码策略,如启用密码复杂性要求,设置密码长度最小值为6位 ,设置强制密码历史为5次,时间为42天。 4、考虑使用智能卡来代替密码 对于密码,总是使安全管理员进退两难,密码设置简单容易受到黑客的攻击,密码设置复杂又容易忘记。如果条件允许,用智能卡来代替复杂的密码是一个很好的解决方法。三、系统权限的设置1、磁盘权限 系统盘及所有磁盘只给 Administrators 组和 SYSTEM 的完全控制权限 系统盘\Documents and Settings 目录只给 Administrators 组和 SYSTEM 的完全控制权限 系统盘\Documents and Settings\All Users 目录只给 Administrators 组和 SYSTEM 的完全控制权限 系统盘\Windows\System32\cacls.exe、cmd.exe、net.exe、net1.exe、ftp.exe、tftp.exe、telnet.exe 、 […]
View Details服务器安全设置 1、系统盘和站点放置盘必须设置为NTFS格式,方便设置权限。 2、系统盘和站点放置盘除administrators 和system的用户权限全部去除。 3、启用windows自带防火墙,只保留有用的端口,比如远程和Web、Ftp(3389、80、21)等等,有邮件服务器的还要打开25和130端口。 4、安装好SQL后进入目录搜索 xplog70 然后将找到的三个文件改名或者删除。 5、更改sa密码为你都不知道的超长密码,在任何情况下都不要用sa这个帐户。 6、改名系统默认帐户名并新建一个Administrator帐户作为陷阱帐户,设置超长密码,并去掉所有用户组。(就是在用户组那里设置为空即可。让这个帐号不属于任何用户组—样)同样改名禁用掉Guest用户。 7、配置帐户锁定策略(在运行中输入gpedit.msc回车,打开组策略编辑器,选择计算机配置-Windows设置-安全设置-账户策略-账户锁定策略,将账户设为“三次登陆无效”,“锁定时间30分钟”,“复位锁定计数设为30分钟”。) 8、在安全设置里本地策略-安全选项将 网络访问:可匿名访问的共享; 网络访问:可匿名访问的命名管道; 网络访问:可远程访问的注册表路径; 网络访问:可远程访问的注册表路径和子路径; 以上四项清空。 9、在安全设置里 本地策略-安全选项 通过终端服务拒绝登陆 加入 以下为引用的内容:ASPNET GuestIUSR_*****IWAM_*****NETWORK SERVICESQLDebugger (****表示你的机器名,具体查找可以点击 添加用户或组 选 高级 选 立即查找 在底下列出的用户列表里选择. 注意不要添加进user组和administrators组 添加进去以后就没有办法远程登陆了。) 10、去掉默认共享,将以下文件存为reg后缀,然后执行导入即可。 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters] "AutoShareServer"=dword:00000000 "AutoSharewks"=dword:00000000 11、 禁用不需要的和危险的服务,以下列出服务都需要禁用。 Alerter 发送管理警报和通知 Computer Browser:维护网络计算机更新 Distributed File System: 局域网管理共享文件 Distributed linktracking client 用于局域网更新连接信息 Error reporting service 发送错误报告 Remote Procedure Call (RPC) Locator RpcNs*远程过程调用 (RPC) Remote Registry 远程修改注册表 Removable storage 管理可移动媒体、驱动程序和库 Remote Desktop Help Session Manager 远程协助 Routing and Remote Access 在局域网以及广域网环境中为企业提供路由服务 Messenger […]
View Details大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的。 什么是并发访问:同一时间有多个用户访问同一资源,并发用户中如果有用户对资源做了修改,此时就会对其它用户产生某些不利的影响,例如: 1:脏读,一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。 2:不可重复读,一个用户的一个操作是一个事务,这个事务分两次读取同一条记录,如果第一次读取后,有另外用户修改了这个数据,然后第二次读取的数据正好是其它用户修改的数据,这样造成两次读取的记录不同,如果事务中锁定这条记录就可以避免。 3:幻读,指用户读取一批记录的情况,用户两次查询同一条件的一批记录,第一次查询后,有其它用户对这批数据做了修改,方法可能是修改,删除,新增,第二次查询时,会发现第一次查询的记录条目有的不在第二次查询结果中,或者是第二次查询的条目不在第一次查询的内容中。 为什么会在查询的表后面加nolock标识?为了避免并发访问产生的不利影响,SQL Server有两种并发访问的控制机制:锁、行版本控制,表后面加nolock是解决并发访问的方案之一。 1> 锁,每个事务对所依赖的资源会请求不同类型的锁,它可以阻止其他事务以某种可能会导致事务请求锁出错的方式修改资源。当事务不再依赖锁定的资源时,锁将被释放。 锁的类型:1:表类型:锁定整个表;2:行类型:锁定某个行;3:文件类型:锁定某个数据库文件;4:数据库类型:锁定整个数据库;5:页类型:锁定8K为单位的数据库页。 锁的分类还有一种分法,就是按用户和数据库对象来分: 1). 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁 1:共享 (S) :用于不更改或不更新数据的操作(只读操作),一般常见的例如select语句。 2:更新 (U) :用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 3:排它 (X) :用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 2). 从程序员的角度看:分为乐观锁和悲观锁。 1:乐观锁:完全依靠数据库来管理锁的工作。 2:悲观锁:程序员自己管理数据或对象上的锁处理。 一般程序员一看到什么锁之类,觉的特别复杂,对专业的DBA当然是入门级知识了。可喜的是程序员不用去设置,控制这些锁,SQLServer通过设置事务的隔离级别自动管理锁的设置和控制。锁管理器通过查询分析器分析待执行的sql语句,来判断语句将会访问哪些资源,进行什么操作,然后结合设定的隔离级别自动分配管理需要用到的锁。 2>:行版本控制:当启用了基于行版本控制的隔离级别时,数据库引擎 将维护修改的每一行的版本。应用程序可以指定事务使用行版本查看事务或查询开始时存在的数据,而不是使用锁保护所有读取。通过使用行版本控制,读取操作阻止其他事务的可能性将大大降低。也就是相当于针对所有的表在查询时都会加上nolock,同样会产生脏读的现象,但差别在于在一个统一管理的地方。说到了基于行版本控制的隔离级别,这里有必要说下隔离级别的概念。 隔离级别的用处:控制锁的应用,即什么场景应用什么样的锁机制。 最终目的:解决并发处理带来的种种问题。 隔离级别的分类: 1:未提交读,隔离事务的最低级别,只能保证不读取物理上损坏的数据; 2:已提交读,数据库引擎的默认级; 3:可重复读; 4:可序列化;隔离事务的最高级别,事务之间完全隔离。 小结:NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别 。nolock确实在查询时能提高速度,但它并不是没有缺点的,起码它会引起脏读。 nolock的使用场景(个人观点): 1:数据量特别大的表,牺牲数据安全性来提升性能是可以考虑的; 2:允许出现脏读现象的业务逻辑,反之一些数据完整性要求比较严格的场景就不合适了,像金融方面等。 3:数据不经常修改的表,这样会省于锁定表的时间来大大加快查询速度。 综上所述,如果在项目中的每个查询的表后面都加nolock,这种做法并不科学,起码特别费时间,不如行版本控制来的直接有效。而且会存在不可预期的技术问题。应该有选择性的挑选最适合的表来放弃共享锁的使用。 最后说下nolock和with(nolock)的几个小区别: 1:SQL05中的同义词,只支持with(nolock); 2:with(nolock)的写法非常容易再指定索引。 跨服务器查询语句时 不能用with (nolock) 只能用nolock 同一个服务器查询时 则with (nolock)和nolock都可以用 比如 SQL code select * from [IP].a.dbo.table1 with (nolock) 这样会提示用错误select * from a.dbo.table1 with (nolock) 这样就可以 转自:http://hi.baidu.com/gabriel/item/11f32132593557c31a96961a
View Details第一部分 入门 第一章 ■■■ 建立一个drupal7站点 本杰明 梅兰肯 丹 哈基姆扎德 达妮 诺丁著 “好吧,我们能用艰难的方法完成这事,或者我们可以用Drupal的方法完成这事。” 弗莱斯特 玛斯(红茶菌) 本书通过介绍使用Drupal 7创建网站的所有各个方面的内容,将会使你在Drupal的学习中少走弯路:它将会涉及结构和配置,模块开发,前台开发,持续运行项目,以及贡献Drupal的代码,文档,还有社区等等。 在第一章中还有什么比创建一个完整的站点更好的方法开始呢?在27页中,你要每小时从零点走到60英里(或每小时100公里,视情况而定)。在后面的章节中,你要使用Views【视图】的动态页面添加涡轮增压器,主题化赛车的条纹;以及Jquery奖杯的获得者;你还要执行一些商业方面花哨的练习等等。 在整本书中,我们将设法引导你以Drupal的方法做事。从来就没有只有一种方法能达到目地,但是有些方法忽视乃至反对Drupal的产品。相比之 下,Drupal的方式在Drupal的优点基础上是任何方式无法相比的。(第8章讲述了其中的优点之--一个活跃的在课程中能够持续给你提供帮助的社 区。) 在本章中你要创建的这个站点会允许用户轻松地创建和分类内容。方案不是假设的。本书需要一个网站,而你正在创建它!你将要: […]
View Details用SQLYog进行数据导入的时候出错:MySql Error Code: 2006 – MySQL 服务器已离线 解决: 1.在mysql的配置文件最后添加:max_allowed_packet = 100M 2.如果还不行,就再添加以下两行: interactive_timeout=28800000 wait_timeout=28800000
View DetailsApplication_Init:在每一个HttpApplication实例初始化的时候执行。 Application_Disposed:在每一个HttpApplication实例被销毁之前执行。 Application_Error:所有没有处理的错误都会导致这个方法的执行。 Application_Start:在程序初始化的时候执行。在Web应用程序的生命周期里就执行一次(自动的重新启动算另外一次生命周期),这里只能放一些公用的信息,比如HttpApplicationState。 Application_End:应用程序结束时,在最后一个HttpApplication销毁之后执行。对应Application_Start,在整个生命周期里面也是只执行一次。 执行顺序:Application_BeginRequest:BeginRequest是在收到Request时第一个触发的事件,这个方法自然就是第一个执行的了。 Application_AuthenticateRequest:当安全模块已经建立了当前用户的标识后执行。 Application_AuthorizeRequest:当安全模块已经验证了当前用户的授权时执行。 Application_ResolveRequestCache:当ASP.NET完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过处理程序(页面或者是WebService)的执行。这样做可以改善网站的性能,这个事件还可以用来判断正文是不是从Cache中得到的。 Application_AcquireRequestState:当ASP.NET获取当前请求所关联的当前状态(如Session)时执行(真是拗口啊,msdn上就这样写的,我自己想不出什么好句子了)。 Application_PreRequestHandlerExecute:当ASP.Net即将把请求发送到处理程序对象(页面或者是WebService)之前执行。这个时候,Session就可以用了。 Application_PostRequestHandlerExecute:当处理程序对象(页面或者是WebService)工作完成之后执行。 Application_ReleaseRequestState:在ASP.NET执行完所有请求处理程序后执行。ReleaseRequestState事件将使当前状态数据被保存。 Application_UpdateRequestCache:在ASP.NET执行完处理程序后,为了后续的请求而更新响应缓存时执行。 Application_EndRequest:同上,EndRequest是在响应Request时最后一个触发的事件,这个方法自然就是最后一个执行的了。 另外两个: 这两个事件的顺序是无法确定的,按照MSDN的说法,它们随时都可能发生。 下面就按这个顺序来解释一下它们在Global.asax.cs中相应的事件处理方法的含义。 整理自:http://hi.baidu.com/czh8888/item/7371eea8ddcaaa9e151073df
View Details大家可以到http://www.icsharpcode.net/opensource/sharpziplib/ 下载SharpZiplib的最新版本,本文使用的版本为0.86.0.518,支持Zip, GZip, BZip2 和Tar格式,其实没啥好说的直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
/// <summary> /// Zip压缩与解压缩 /// </summary> public class ZipHelper { /// <summary> /// 压缩单个文件 /// </summary> /// <param name="fileToZip">要压缩的文件</param> /// <param name="zipedFile">压缩后的文件</param> /// <param name="compressionLevel">压缩等级</param> /// <param name="blockSize">每次写入大小</param> public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize) { //如果文件没有找到,则报错 if (!System.IO.File.Exists(fileToZip)) { throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); } using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) { using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) { using (System.IO.FileStream StreamToZip = new System.IO.FileStream(fileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read)) { string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); ZipEntry ZipEntry = new ZipEntry(fileName); ZipStream.PutNextEntry(ZipEntry); ZipStream.SetLevel(compressionLevel); byte[] buffer = new byte[blockSize]; int sizeRead = 0; try { do { sizeRead = StreamToZip.Read(buffer, 0, buffer.Length); ZipStream.Write(buffer, 0, sizeRead); } while (sizeRead > 0); } catch (System.Exception ex) { throw ex; } StreamToZip.Close(); } ZipStream.Finish(); ZipStream.Close(); } ZipFile.Close(); } } /// <summary> /// 压缩单个文件 /// </summary> /// <param name="fileToZip">要进行压缩的文件名</param> /// <param name="zipedFile">压缩后生成的压缩文件名</param> public static void ZipFile(string fileToZip, string zipedFile) { //如果文件没有找到,则报错 if (!File.Exists(fileToZip)) { throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); } using (FileStream fs = File.OpenRead(fileToZip)) { byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close(); using (FileStream ZipFile = File.Create(zipedFile)) { using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) { string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); ZipEntry ZipEntry = new ZipEntry(fileName); ZipStream.PutNextEntry(ZipEntry); ZipStream.SetLevel(5); ZipStream.Write(buffer, 0, buffer.Length); ZipStream.Finish(); ZipStream.Close(); } } } } /// <summary> /// 压缩多层目录 /// </summary> /// <param name="strDirectory">The directory.</param> /// <param name="zipedFile">The ziped file.</param> public static void ZipFileDirectory(string strDirectory, string zipedFile) { using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) { using (ZipOutputStream s = new ZipOutputStream(ZipFile)) { ZipSetp(strDirectory, s, ""); } } } /// <summary> /// 递归遍历目录 /// </summary> /// <param name="strDirectory">The directory.</param> /// <param name="s">The ZipOutputStream Object.</param> /// <param name="parentPath">The parent path.</param> private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath) { if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar) { strDirectory += Path.DirectorySeparatorChar; } Crc32 crc = new Crc32(); string[] filenames = Directory.GetFileSystemEntries(strDirectory); foreach (string file in filenames)// 遍历所有的文件和目录 { if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 { string pPath = parentPath; pPath += file.Substring(file.LastIndexOf("\\") + 1); pPath += "\\"; ZipSetp(file, s, pPath); } else // 否则直接压缩文件 { //打开压缩文件 using (FileStream fs = File.OpenRead(file)) { byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string fileName = parentPath + file.Substring(file.LastIndexOf("\\") + 1); ZipEntry entry = new ZipEntry(fileName); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; s.PutNextEntry(entry); s.Write(buffer, 0, buffer.Length); } } } } /// <summary> /// 解压缩一个 zip 文件。 /// </summary> /// <param name="zipedFile">The ziped file.</param> /// <param name="strDirectory">The STR directory.</param> /// <param name="password">zip 文件的密码。</param> /// <param name="overWrite">是否覆盖已存在的文件。</param> public void UnZip(string zipedFile, string strDirectory, string password, bool overWrite) { if (strDirectory == "") strDirectory = Directory.GetCurrentDirectory(); if (!strDirectory.EndsWith("\\")) strDirectory = strDirectory + "\\"; using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile))) { s.Password = password; ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { string directoryName = ""; string pathToZip = ""; pathToZip = theEntry.Name; if (pathToZip != "") directoryName = Path.GetDirectoryName(pathToZip) + "\\"; string fileName = Path.GetFileName(pathToZip); Directory.CreateDirectory(strDirectory + directoryName); if (fileName != "") { if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName))) { using (FileStream streamWriter = File.Create(strDirectory + directoryName + fileName)) { int size = 2048; byte[] data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); if (size > 0) streamWriter.Write(data, 0, size); else break; } streamWriter.Close(); } } } } s.Close(); } } } |
代码来自网络,略作修改,修改为静态方法,修改文件夹递归压缩时的bug.. 转自:http://www.cnblogs.com/xuanye/archive/2011/10/19/2217211.html
View DetailsLabel 控件通常在用户界面 (UI) 中提供信息。一直以来,Label 只包含文本,但由于 Windows Presentation Foundation (WPF) 附带的 Label 是一个 ContentControl,所以它可以包含文本或 UIElement。 Label 为快捷键提供功能性和可视化支持。它常用于实现对控件(如 TextBox)的快速键盘访问。若要为 Control 指定 Label,请将 Label..::.Target 属性设置为当用户按下快捷键时应获得焦点的控件。 下图演示了一个目标为 ComboBox 的 Label“主题”。当用户按下 Alt+T 时,ComboBox 将获得焦点。 示例 下面的示例演示如何创建一个 Label,该控件使用 AccessText 并且绑定到目标 TextBox。 示例 为标签添加文本换行 Label 控件不支持文本换行。如果您需要一个多次换行的标签,可以嵌套一个支持文本换行的元素,并将该元素放在标签内。下面的示例演示如何使用 TextBlock 创建一个进行多次文本换行的标签。 为标签添加访问键和文本换行 如果您需要一个具有访问键(助记键)的 Label,则可以使用 Label 中的 AccessText 元素。 Label、Button、RadioButton、CheckBox、MenuItem、TabItem、Expander 和 GroupBox 等控件具有默认的控件模板。这些模板包含一个 ContentPresenter。您可以为 ContentPresenter 设置的属性之一是 RecognizesAccessKey="true",您可以使用该属性为控件指定访问键。 下面的示例演示如何创建一个具有访问键并支持文本换行的 Label。为了实现文本换行,本示例设置了 TextWrapping 属性并使用下划线字符指定访问键。(紧跟下划线字符后面的字符就是访问键。)
View DetailsDrupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。截止2011年底,共有13,802位WEB专家参加了Drupal的开发工作;228个国家使用181种语言的729,791位网站设计工作者使用Drupal。著名案例包括:联合国、美国白宫、美国商务部、纽约时报、华纳、迪斯尼、联邦快递、索尼、美国哈佛大学、Ubuntu等。 Drupal诞生于2000年,是一个基于PHP语言编写的开发型CMF(内容管理框架),即:CMS+ framework。其中 framework是指Drupal内核中的功能强大的PHP类库和PHP函数库,以及在此基础上抽象的Drupal API。在网站开发能力上,Drupal和Yii、CodeIgniter、Zend、CakePHP等业界顶级PHP框架同样强大。形象的说,Drupal是一个附带CMS的PHP开发框架。Drupal创始人Dries Buytaert创办的美国Acquia公司的开发人员甚至戏称:Drupal是一个用于开发网站的“操作系统”(webOS),而且此称法被业界广泛接受。很多Drupaler(即Drupal开发者)信奉这样一条真理:既然Drupal已经为我们写好了CMS,那么我们为什么还要选择那些不含有CMS的PHP开发框架呢? Drupal是一套开源系统,全球数以万计的WEB开发专家都在为Drupal技术社区贡献代码。因此,Drupal的代码在安全性、健壮性上具有世界最高水平。这也是美国白宫、美国商务部、法国政府、纽约时报、SONY等著名政府和机构纷纷采用Drupal建设网站的最重要的原因。 Drupal不等于模板建站系统,他们之间有着本质的区别。Drupal的学习曲线相当漫长和陡峭,比PHP难度大得多,要求也高的多。事实上,只有精通XHTML、CSS、Javascript、PHP、MySql的开发人员,经过长期刻苦的学习,才有可能真正的驾驭Drupal,Drupal是给经验丰富的程序员用的,而不是给一般普通用户用的。模板建站系统则不同,模板系统根本不需要任何学习,不需要任何编程知识就可以使用,只适合初级用户搭建一些简单的网站。 Drupal具有业内最强的定制能力和灵活性,这也是造成Drupal学习难度太大的根本原因,这也是没有办法的事情,灵活性的提高必然使复杂程度提高。因此,Drupal技术圈内有一句名言——“Drupal有难度,学习需谨慎。” Drupal强大的定制开发能力,也使其成为众多有技术实力的网站建设公司优先选用的网站开发平台。因为,任何网站建设公司自己开发的系统,在技术上都无法达到Drupal的水平,这正是开源软件的优势所在:全世界的WEB专家都在为Drupal贡献自己的智慧,这是某个公司内部技术团队永远也无法享受到的。是否具有Drupal技术的开发能力也成为鉴别网站建设公司实力的试金石。没有技术实力的公司,根本没有能力驾驭Drupal。 Drupal的架构由三大部分组成:内核、模块、主题。三者通过Hook机制紧密的联系起来。其中,内核部分由世界上多位著名的WEB开发专家组成的团队负责开发和维护。 Drupal综合了强大并可自由配置的功能,能支持从个人博客(PersonalWeblog)到大型社区驱动(Community-Driven)的网站等各种不同应用的网站项目。Drupal最初是由DriesBuytaert所开发的一套社群讨论软件。之后,由于它的灵活的架构,方便的扩展等特性,使得世界上成千上万个程序员加入了Drupal的开发与应用中。今天,它已经发展成为一套强大的系统,很多大型机构都采用基于Drupal的框架建站,包括The Onion,Ain't ItCool News,SpreadFirefox,Ourmedia,KernelTrap,NewsBusters等等。它特别常见于社区主导的网站。 Drupal目前的最高版本是7.9,官方网站下载页面最近释出的版本为7.17,是官方推荐的稳定版。该版本由7.1版修复而来,修正了大量BUG,没有太多新功能,适合学习Drupal的新手安装。下载页面同时提供了Drupal 6.22等旧版本下载。
View Details这种策略让缓存依赖于一个指定的文件,通过改变文件的更新日期来清除缓存。
1 |
<div style="margin:0px;padding:0px;line-height:21px;"><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"></span><span style="margin:0px;padding:0px;color:#808080;"><summary></span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"> 获取当前应用程序指定CacheKey的Cache对象值<br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"></span><span style="margin:0px;padding:0px;color:#808080;"></summary></span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"></span><span style="margin:0px;padding:0px;color:#808080;"><param name="CacheKey"></span><span style="margin:0px;padding:0px;color:#008000;">索引键值</span><span style="margin:0px;padding:0px;color:#808080;"></param></span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"></span><span style="margin:0px;padding:0px;color:#808080;"><returns></span><span style="margin:0px;padding:0px;color:#008000;">返回缓存对象</span><span style="margin:0px;padding:0px;color:#808080;"></returns></span><span style="margin:0px;padding:0px;color:#808080;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#0000ff;">public</span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">static</span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">object</span><span style="margin:0px;padding:0px;color:#000000;"> GetCache(</span><span style="margin:0px;padding:0px;color:#0000ff;">string</span><span style="margin:0px;padding:0px;color:#000000;"> CacheKey)<br style="margin:0px;padding:0px;line-height:10px;" />{<br style="margin:0px;padding:0px;line-height:10px;" /> System.Web.Caching.Cache objCache </span><span style="margin:0px;padding:0px;color:#000000;">=</span><span style="margin:0px;padding:0px;color:#000000;"> HttpRuntime.Cache;<br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#0000ff;">return</span><span style="margin:0px;padding:0px;color:#000000;"> objCache[CacheKey];<br style="margin:0px;padding:0px;line-height:10px;" />}<br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"></span><span style="margin:0px;padding:0px;color:#808080;"><summary></span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"> 设置以缓存依赖的方式缓存数据<br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"></span><span style="margin:0px;padding:0px;color:#808080;"></summary></span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"></span><span style="margin:0px;padding:0px;color:#808080;"><param name="CacheKey"></span><span style="margin:0px;padding:0px;color:#008000;">索引键值</span><span style="margin:0px;padding:0px;color:#808080;"></param></span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"></span><span style="margin:0px;padding:0px;color:#808080;"><param name="objObject"></span><span style="margin:0px;padding:0px;color:#008000;">缓存对象</span><span style="margin:0px;padding:0px;color:#808080;"></param></span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#808080;">///</span><span style="margin:0px;padding:0px;color:#008000;"></span><span style="margin:0px;padding:0px;color:#808080;"><param name="cacheDepen"></span><span style="margin:0px;padding:0px;color:#008000;">依赖对象</span><span style="margin:0px;padding:0px;color:#808080;"></param></span><span style="margin:0px;padding:0px;color:#808080;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#0000ff;">public</span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">static</span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">void</span><span style="margin:0px;padding:0px;color:#000000;"> SetCache(</span><span style="margin:0px;padding:0px;color:#0000ff;">string</span><span style="margin:0px;padding:0px;color:#000000;"> CacheKey, </span><span style="margin:0px;padding:0px;color:#0000ff;">object</span><span style="margin:0px;padding:0px;color:#000000;"> objObject, System.Web.Caching.CacheDependency dep)<br style="margin:0px;padding:0px;line-height:10px;" />{<br style="margin:0px;padding:0px;line-height:10px;" /> System.Web.Caching.Cache objCache </span><span style="margin:0px;padding:0px;color:#000000;">=</span><span style="margin:0px;padding:0px;color:#000000;"> HttpRuntime.Cache;<br style="margin:0px;padding:0px;line-height:10px;" /> objCache.Insert(<br style="margin:0px;padding:0px;line-height:10px;" /> CacheKey,<br style="margin:0px;padding:0px;line-height:10px;" /> objObject,<br style="margin:0px;padding:0px;line-height:10px;" /> dep,<br style="margin:0px;padding:0px;line-height:10px;" /> System.Web.Caching.Cache.NoAbsoluteExpiration, </span><span style="margin:0px;padding:0px;color:#008000;">//</span><span style="margin:0px;padding:0px;color:#008000;">从不过期</span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#000000;"> System.Web.Caching.Cache.NoSlidingExpiration, </span><span style="margin:0px;padding:0px;color:#008000;">//</span><span style="margin:0px;padding:0px;color:#008000;">禁用可调过期</span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#000000;"> System.Web.Caching.CacheItemPriority.Default,<br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#0000ff;">null</span><span style="margin:0px;padding:0px;color:#000000;">);<br style="margin:0px;padding:0px;line-height:10px;" />}<br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#0000ff;">protected</span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">void</span><span style="margin:0px;padding:0px;color:#000000;"> Page_Load(</span><span style="margin:0px;padding:0px;color:#0000ff;">object</span><span style="margin:0px;padding:0px;color:#000000;"> sender, EventArgs e)<br style="margin:0px;padding:0px;line-height:10px;" />{<br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#0000ff;">string</span><span style="margin:0px;padding:0px;color:#000000;"> CacheKey </span><span style="margin:0px;padding:0px;color:#000000;">=</span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#800000;">"</span><span style="margin:0px;padding:0px;color:#800000;">cachetest</span><span style="margin:0px;padding:0px;color:#800000;">"</span><span style="margin:0px;padding:0px;color:#000000;">;<br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#0000ff;">object</span><span style="margin:0px;padding:0px;color:#000000;"> objModel </span><span style="margin:0px;padding:0px;color:#000000;">=</span><span style="margin:0px;padding:0px;color:#000000;"> GetCache(CacheKey);</span><span style="margin:0px;padding:0px;color:#008000;">//</span><span style="margin:0px;padding:0px;color:#008000;">从缓存中获取</span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">if</span><span style="margin:0px;padding:0px;color:#000000;"> (objModel </span><span style="margin:0px;padding:0px;color:#000000;">==</span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">null</span><span style="margin:0px;padding:0px;color:#000000;">) </span><span style="margin:0px;padding:0px;color:#008000;">//</span><span style="margin:0px;padding:0px;color:#008000;">缓存里没有</span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#000000;"> {<br style="margin:0px;padding:0px;line-height:10px;" /> objModel </span><span style="margin:0px;padding:0px;color:#000000;">=</span><span style="margin:0px;padding:0px;color:#000000;"> DateTime.Now;</span><span style="margin:0px;padding:0px;color:#008000;">//</span><span style="margin:0px;padding:0px;color:#008000;">把当前时间进行缓存</span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">if</span><span style="margin:0px;padding:0px;color:#000000;"> (objModel </span><span style="margin:0px;padding:0px;color:#000000;">!=</span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">null</span><span style="margin:0px;padding:0px;color:#000000;">)<br style="margin:0px;padding:0px;line-height:10px;" /> {<br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#008000;">//</span><span style="margin:0px;padding:0px;color:#008000;">依赖 C:\\test.txt 文件的变化来更新缓存</span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#000000;"> System.Web.Caching.CacheDependency dep </span><span style="margin:0px;padding:0px;color:#000000;">=</span><span style="margin:0px;padding:0px;color:#000000;"></span><span style="margin:0px;padding:0px;color:#0000ff;">new</span><span style="margin:0px;padding:0px;color:#000000;"> System.Web.Caching.CacheDependency(</span><span style="margin:0px;padding:0px;color:#800000;">"</span><span style="margin:0px;padding:0px;color:#800000;">C:\\test.txt</span><span style="margin:0px;padding:0px;color:#800000;">"</span><span style="margin:0px;padding:0px;color:#000000;">);<br style="margin:0px;padding:0px;line-height:10px;" /> SetCache(CacheKey, objModel, dep);</span><span style="margin:0px;padding:0px;color:#008000;">//</span><span style="margin:0px;padding:0px;color:#008000;">写入缓存</span><span style="margin:0px;padding:0px;color:#008000;"><br style="margin:0px;padding:0px;line-height:10px;" /></span><span style="margin:0px;padding:0px;color:#000000;"> }<br style="margin:0px;padding:0px;line-height:10px;" /> } <br style="margin:0px;padding:0px;line-height:10px;" /> Label1.Text </span><span style="margin:0px;padding:0px;color:#000000;">=</span><span style="margin:0px;padding:0px;color:#000000;"> objModel.ToString();<br style="margin:0px;padding:0px;line-height:10px;" />}</span></div> |
当我们改变test.txt的内容时,缓存会自动更新。这种方式非常适合读取配置文件的缓存处理。如果配置文件不变化,就一直读取缓存的信息,一旦配置发生变化,自动更新同步缓存的数据。 这种方式的缺点是,如果缓存的数据比较多,相关的依赖文件比较松散,对管理这些依赖文件有一定的麻烦。对于负载均衡环境下,还需要同时更新多台Web服务器下的缓存文件,如果多个Web应用中的缓存依赖于同一个共享的文件,可能会省掉这个麻烦。 FROM URI:http://kb.cnblogs.com/page/69726/
View Details