在我们的系统开发中经常会用到.net中的Cache功能,以减少数据之间的交互,将一些公用的数据以Cache的方式保存在内存中,同时Cache的自身管理功能也比较好,在项目开发中我们将Cache做成一个公用管理类,在实际的项目开发中感觉还是比较好的,特将我自己开发的Cache管理的方法发布出来.

using System;
using System.Web;
using System.Web.Caching;
using System.Collections;
using System.Text.RegularExpressions;

namespace ICS.NewOperationClass
{
 /// <summary>
 /// 设置Cache操作类
 /// </summary>
 public class SetCache
 {
  #region 用户自定义变量
  private static readonly Cache _cache;//缓存实例
  private static readonly int hourfactor;
  #endregion

  #region 构造函数
  static SetCache()
  {
   hourfactor = 3600;
   _cache = HttpRuntime.Cache;
  }

  private SetCache()
  {
  }
  #endregion
  
  #region 清除所有缓存
  /// <summary>
  /// 清除所有缓存
  /// </summary>
  public static void Clear()
  {
   //要循环访问 Cache 对象的枚举数
   IDictionaryEnumerator enumerator = _cache.GetEnumerator();//检索用于循环访问包含在缓存中的键设置及其值的字典枚举数
   if(enumerator!=null)
   {
    while (enumerator.MoveNext())
    {
     _cache.Remove(enumerator.Key.ToString());
    }
   }
  }
  #endregion

  #region 得到缓存实例
  /// <summary>
  /// 得到缓存实例
  /// </summary>
  /// <param name="key">缓存实例名称</param>
  /// <returns>返回缓存实例</returns>
  public static object GetCache(string key)
  {
   return _cache[key];
  }
  #endregion

  #region 缓存实例插入
  /// <summary>
  /// 缓存实例插入(默认缓存20分钟)
  /// </summary>
  /// <param name="key">缓存实例名称</param>
  /// <param name="obj">要缓存的对象</param>
  public static void Insert(string key, object obj)    
  {
   CacheDependency dep = null;
   Insert(key, obj, dep, 20);
  }

  /// <summary>
  /// 缓存实例插入
  /// </summary>
  /// <param name="key">缓存实例名称</param>
  /// <param name="obj">要缓存的对象</param>
  /// <param name="seconds">缓存的时间</param>
  public static void Insert(string key, object obj, int seconds)     
  {
   CacheDependency dep = null;
   Insert(key, obj, dep, seconds);
  }

  /// <summary>
  /// 缓存实例插入(缓存过期时间是一天)
  /// </summary>
  /// <param name="key">缓存实例名称</param>
  /// <param name="obj">要缓存的对象</param>
  /// <param name="dep">缓存的依赖项</param>
  public static void Insert(string key, object obj, CacheDependency dep)
  {
   Insert(key, obj, dep, hourfactor*12);
  }

  /// <summary>
  /// 缓存实例插入(缓存过期时间是一天)
  /// </summary>
  /// <param name="key">缓存实例名称</param>
  /// <param name="obj">要缓存的对象</param>
  /// <param name="xmlPath">缓存的依赖项xml文件的路径(绝对路径)</param>
  public static void Insert(string key,object obj,string xmlPath)
  {
   CacheDependency dep = new CacheDependency(xmlPath);
   Insert(key, obj, dep, hourfactor*12);
  }

  /// <summary>
  /// 缓存实例插入
  /// </summary>
  /// <param name="key">缓存实例名称</param>
  /// <param name="obj">要缓存的对象<</param>
  /// <param name="seconds">缓存时间</param>
  /// <param name="priority">该对象相对于缓存中存储的其他项的成本</param>
  public static void Insert(string key, object obj, int seconds, CacheItemPriority priority)
  {
   Insert(key, obj, null, seconds, priority);
  }

  /// <summary>
  /// 缓存实例插入
  /// </summary>
  /// <param name="key">用于引用该对象的缓存键</param>
  /// <param name="obj">要插入缓存中的对象</param>
  /// <param name="dep">该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含空引用(Visual Basic 中为 Nothing)</param>
  /// <param name="seconds">所插入对象将过期并被从缓存中移除的时间。</param>
  public static void Insert(string key, object obj, CacheDependency dep, int seconds)    
  {
   Insert(key, obj, dep, seconds, CacheItemPriority.Normal);
  }

  /// <summary>
  /// 缓存实例插入
  /// </summary>
  /// <param name="key">用于引用该对象的缓存键</param>
  /// <param name="obj">要插入缓存中的对象</param>
  /// <param name="xmlPath">缓存的依赖项xml文件的路径(绝对路径)</param>
  /// <param name="seconds">所插入对象将过期并被从缓存中移除的时间。</param>
  public static void Insert(string key, object obj, string xmlPath, int seconds)
  {
   CacheDependency dep = new CacheDependency(xmlPath);
   Insert(key, obj, dep, seconds, CacheItemPriority.Normal);
  }

  /// <summary>
  /// 缓存实例插入
  /// </summary>
  /// <param name="key">用于引用该对象的缓存键</param>
  /// <param name="obj">要插入缓存中的对象</param>
  /// <param name="dep">该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含空引用(Visual Basic 中为 Nothing)。</param>
  /// <param name="seconds">所插入对象将过期并被从缓存中移除的时间。</param>
  /// <param name="priority">该对象相对于缓存中存储的其他项的成本,由 CacheItemPriority 枚举表示。该值由缓存在退出对象时使用;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。 </param>
  public static void Insert(string key, object obj, CacheDependency dep, int seconds, CacheItemPriority priority)  
  {
   if (obj != null)
   {
    _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds((double)seconds),TimeSpan.Zero, priority, null);
   }
  }
  #endregion
  
  #region 移出单个缓存
  /// <summary>
  /// 移出单个缓存
  /// </summary>
  /// <param name="key">缓存实例名称</param>
  public static void Remove(string key)
  {
   _cache.Remove(key);
  }

   #region 得到所有使用的Cache键值
  /// <summary>
  /// 得到所有使用的Cache键值
  /// </summary>
  /// <returns>返回所有的Cache键值</returns>
  public static ArrayList GetAllCacheKey()
  {
   ArrayList arrList = new ArrayList();
   IDictionaryEnumerator enumerator = _cache.GetEnumerator();
   if(enumerator!=null)
   {
    while (enumerator.MoveNext())
    {
     arrList.Add(enumerator.Key);
    }
   }
   return arrList;
  }
  #endregion
 }
}

posted @ 2008-06-15 10:02 刘华全 阅读(599) 评论(0) 编辑
摘要: 微软CRM系统二次开发步骤以及注意事项微软CRM系统的二次开发主要包括四个方面:1)自定义实体的设置;2):站点图的设置;3)ISV.Config文件(实体页面导航条以及功能菜单)的配置;4)客户端JavaScript的设计。特别注意:对系统中进行的二次开发之后一定要在自定义界面选择“发布”,不然是不能使用的。一:自定义实体的设置微软CRM系统提供按照自己需求要求,对CRM...阅读全文
posted @ 2008-06-15 09:12 刘华全 阅读(1417) 评论(2) 编辑
 

假设一家大型企业的ADActive Directory,目录服务)数据库中有上千名用户数据,某一天AD数据库遭到有意或无意的破坏,导致了用户数据的丢失,此时如果逐个恢复数据,那么工作量无疑将是惊人的巨大。

所以,有经验的网管通常会定期进行AD数据库的备份,当AD数据库出现种种问题时,就可以轻轻松松地完成AD数据库的数据还原了。当然也有很多网管对这么重要的备份操作并不了解或忽视了。

备份AD数据库

  备份AD数据库的操作并不复杂,因为备份操作是通过备份向导来完成的,所以即使是菜鸟级网管也可以轻松上手。

  依次点击开始程序附件系统工具备份,在打开的备份或还原向导对话框中点击下一步按钮进入备份或还原选择对话框。

  在选择备份文件和设置项后,点击下一步按钮进入要备份的内容对话框,选择让我选择要备份的内容项并点击下一步按钮。在要备份的项目对话框中依次展开桌面我的电脑,勾选“System State”项(图1)。
     

  在下一步的备份类型、目标和名称对话框中根据提示选择好备份文件的存储路径,并设置好备份文件的名称,点击下一步按钮。接着在打开的对话框中点击完成按钮。

此时请中断计算机系统中的其他操作,因为片刻后AD数据库的备份操作就会开始进行了。

还原AD数据库

  相对于AD数据库的备份操作,AD数据库的还原操作就显得稍微有些复杂了。因为除了按备份向导的提示进行操作外,还需要进行一些额外的操作才能顺利完成还原。主要的原因是因为AD服务正常运行时,是不能够进行AD数据库还原操作的。

  所以AD数据库的还原操作应该按以下方式进行:

  1.进入目录服务还原模式

  重新启动计算机在进入Windows Server 2003的初始画面前,按F8键进入Windows高级选项菜单界面。此时可以通过键盘上的上下方向键选择目录服务还原模式(只用于Windows域控制器)项。

  在回车确认后,使用具有管理员权限的账户登录系统,此时可以看出系统是处于安全模式的。

  2.使用还原向导

  在进入目录服务还原模式后,依次点击开始程序附件系统工具备份,在打开的备份或还原向导对话框中点击下一步按钮进入备份或还原选择对话框,选择还原文件和设置。在还原项目对话框中选中备份文件(图2)。

  在稍后弹出的界面中点击完成按钮。稍等片刻,系统将弹出一个警告提示框,点击确定按钮,确认数据库的覆盖操作即可开始AD数据库的还原。

  在完成还原操作后,点击对话框中的关闭按钮就可以结束了。最后将会弹出一个备份工具提示框,点击按钮重新启动计算机即可。

  最后要提醒大家的是,有些朋友还原AD数据库时会出现忘记当初设置的还原密码(添加AD服务时设置)的情况,这个时候就无法进入目录还原模式了。

  遇到这种情况时请勿慌张,因为我们可以通过依次点击开始运行,在弹出的运行栏中输入“Ntdsutil”命令的方法,在弹出的窗口中进行进入目录还原模式密码的重设操作。

  在设置还原密码成功后,还需要重新启动计算机,重启后即可使用新的还原密码进入目录服务还原模式了。
posted @ 2008-06-15 09:08 刘华全 阅读(101) 评论(0) 编辑
 

一、           概述

现在Ajax技术正如火如荼的在Internet上发展着。而面对我们之前开发的ASP.NET2.0Web项目,类似于下拉框等联动也需要啪啪啪的不断刷新,的确影响到了用户的使用体验。如何使用Ajax技术改善这部分的问题呢?是一个值得思考和尝试的工作。

二、           开发和部署系统准备

1  Microsoft Visual Studio .NET 2005.

2  Microsoft .NET Framework 2.0 

三、           MagicAjax使用准备

1 首先当然是去http://sourceforge.net/projects/magicajax下载MagicAjaxDll了,我使用的0.3.0.0的版本。

2 将该dll加入到webForm所在项目的引用中。

3 Web.Config文件中<configuration>节点下添加如下子节点:

    <configSections>

       <sectionname="magicAjax" type="MagicAjax.Configuration.MagicAjaxSectionHandler, MagicAjax"/>

    </configSections>

4 Web.Config文件中< system.web>节点下添加如下子节点:

        <httpModules>

            <addname="MagicAjaxModule"type="MagicAjax.MagicAjaxModule, MagicAjax"/>

        </httpModules>

5 在希望采用AjaxwebForm页面HTML开头引入Ajax的注册语句:

<%@ Register TagPrefix="ajax" Namespace="MagicAjax.UI.Controls" Assembly="MagicAjax" %>

这样,我们就可以在该页使用MagicAjax了。

 四、           MagicAjax使用

BMS 项目中,我只用到了一个MagicAjax组件,那就是Ajax Panel.用法也是很简单:

1 将你需要采用无刷新操作的控件包在MagicAjax的标签中,类似如下代码:

<ajax:AjaxPanel ID="AjaxPanel1" runat="Server">  
        <asp:DropDownList id="DropDownList1" runat="server"></asp:DropDownList>

<asp:DropDownList id="DropDownList2" runat="server"></asp:DropDownList>

<asp:DropDownList id="DropDownList3" runat="server"></asp:DropDownList>

</ajax:AjaxPanel>

(以上代码假设DropDownList1DropDownList2DropDownList3存在联动关系,控件设为AutoPostBack,并且联动方法已经在后台写好了。)

2    再到页面上去点击DropDownList1,以前需要刷新的操作现在是不是不需要了?(左上角是不是有个loading一闪而过?这个文字和样式都可以换的哦)。

3 至此,MagicAjax的运用已经基本完成,是不是太简单一点了。事实上,就这么简单。

五、           MagicAjax使用中遇到的问题及解决办法

在使用MagicAjax的过程中,基本上不需要改动原来的source即可达到运用Ajax技术的效果,MagicAjax的实现机理网上有很多介绍,这里不累述,有两个关键词:doPostBack,viewStateMagicajax就是将要做的操作送回后台,处理后将需要的信息截取出来。这个过程中doPostBack就是送回后台的操作,ViewState用于保存控件的状态,这样在自己写xmlHttp实现Ajax中出现的控件状态没有办法在后台获取(尤其是dropDownListoption的变化)的问题就迎刃而解了。

而在这个过程中也会因为这些因素,出现些问题。这里列出我遇到的部分以及解决方案。

1 加入MagicAjax后页面布局出现混乱。

BMS项目中页面布局采用的是Table的布局方式,设定了每个TD的相对宽度。可是在加入AjaxPanel标签后页面布局出现混乱。

Solution:经过排查,发现是当包含一句类似如下的语句时出现问题:

<span id="spFailcode"><%=strFailCode%></span>

        改动也很容易,将这样的将该span改为runnt=server然后在后台赋值就好了。

2.   通过javascript调按钮的click做页面回传无效。

在原系统中可能存在类似如下的客户端脚本

var objQuery = document.getElementById("btnQuery");

if(objQuery!=null)

 {

   objQuery.click();

 }

通过触发buttonclick事件将页面回传到服务器端。可是在包上AjaxPanel后,以上的javascript没有效果了。

Solution想来是因为magicAjax采用doPostBack回传。所以将Javascript改为:

__doPostBack(btnQuery,'');

就搞定了。

3 调用__doPostBack引起脚本错误。

在执行第二点改写JavaScript时出现了这个问题,错误类型为缺少对象。严格说来这个不是因为magicAjax的应用所造成的。
   
SolutionPageLoad中加入GetPostBackEventReference(XXXX);其中XXXX可以为任何一个服务器按钮等等,如果页面中有设定AutoPostBack的控件,那么这个问题是不存在的。

4 在服务器端注册的脚本无效:
以前我们在后代代码汇会写类似如下代码:

StringBuilder sbMsg=new StringBuilder ();

sbMsg.Append (<script language=javascript>);

sbMsg.Append (SetFocus("”” + Server.HtmlEncode(sid) + "););

sbMsg.Append (</script>);

Page.RegisterStartupScript (setfocus,sbMsg.ToString ());

现在这这种注册脚本的方式(包括:RegisterStartupScript和RegisterClientScriptBlock)在通过MagicAjax触发的调用中都失去作用。
   
Solution首先在该页面引入命名空间:using MagicAjax;

区分是正常调用Function还是MagicAjax引起调用Function,对于由MagicAjax引起调用的Function,注册脚本改为类似如下代码:

MagicAjax.AjaxCallHelper.Write("alert('" + messageContent + "');");

(将< script >Tag去除,然后直接将内容通过MagicAjax.AjaxCallHelper.Write完成脚本写入

 六、           结语

以上就是在BMS项目中使用MagicAjax的一个过程和遇到部分问题的解决办法。总体而言,采用MagicAjax可以快速实现asp.net2.0MagicAjax应用,是一个为现有系统提供Ajax解决方案的好办法。并个人推断由于MagicAjax的特性(doPostBackViewState)所决定采用MagicAjax比不采用MagicAjax在效率上不会有本质的提高。主要的改善点还是在用户的操作感官上的。
posted @ 2008-06-15 09:04 刘华全 阅读(201) 评论(0) 编辑

  前段时间由于工作需要,需要写一个socket通讯的.net组件,发现在网上关于这方面的知识很少,自己也是摸索了好久做一个一个,现在还不是很成熟,拿出来大家分享一下,这个.net组件只是一个客户端组件,与Linux下的服务端进行socket通讯,主要是把我的设计思路写下来,可能对后来进行相关开发的人员有所帮助.
一:主要步骤:
1.建立连接.
2.组装需要发送的数据包(本地字节与网络字节的转换).
3.发送请求包.
4.接受反馈包(需要先接收固定长度的包头,通过解析包头,然后根据包头中包含的包体的长度,接收包体).
5.解析反馈包(网络字节与本地字节的转换).
6.断开连接.
这是一个标准的短连接的过程,如果是建立长连接的话,则一开始就建立与服务端的连接,在第六步不断开连接.
  

posted @ 2008-06-15 08:47 刘华全 阅读(109) 评论(0) 编辑