指掌风云,秀玩美---Touch Diamond 学习英语的王者

by ξ箫音ξ 6/26/2008 11:23:00 AM

Touch Diamond智能手机是多普达至今为止顶级的产品,其轻薄和钻石般的墨色外形是有别与其他

智能手机,功能强大,非常适合随身学习英语的一款机型。

6月24日公司派去广州出差,乘坐一天一夜的火车(火车安全^_^),有Touch Diamond相伴没有感觉寂寞;

一路上用Touch Diamond玩游戏,打麻将、下象棋,学习英语....感觉很充实。

1、Touch Diamond系统自带有金山词霸 for Pocket PC v1.2 Build 20080508是目前最新版本;

金山词霸PPC版,功能很强即时查词,中英——英中互译非常方便;

2、Touch Diamond系统安装的另一款学习英文软件,个人感觉也非常不错:

Dr.eye Mobile 3.0 for PPC ,除了基本功能查词中英互译外,例句比词库丰富;

配有真人发声库(但是在微软Mobile 6.1系统中发声库没装上,可能我没太会用^_^);

下载地址:

PPC的下载地址为ftp://mpuser:MpUser@203.94.2.140/DreyeMobile.exe

(主程序)ftp://mpuser:MpUser@203.94.2.140/Dreye TrueVoice.CAB

(真人发音)ftp://mpuser:MpUser@203.94.2.140/DreyeTrueVoice60.exe

(真人发音) 译典通PPC在多普达俱乐部,华军网,斑马网均有下载销售。

PPC在比特网评测http://telecom.chinabyte.com/477/8136477.shtml,可参考。

3、用Touch Diamond随时随地学英语;结合UEI美联国际英语会达到不错的效果;

Touch Diamond插入耳机,可以进入播放英语模式;我们搞IT的学习英语时间少,汗啊!

UEI英语介绍:这是一套非常独特的英语听说训练光盘,总共25张,由美国48位顶尖

语言专家开发,不需要看书、不需要背单词、背语法,只需要随意地跟着光盘听和说

就能在很短时间里拥有一口流利纯正的口语。您现在购买可免费获赠MP3格式的光盘,

方便您直接复制到MP3播放器上学习。

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

当选为2008微软金牌讲师决赛评委(聘书)

by ξ箫音ξ 6/22/2008 2:04:00 AM

很高兴的获得了“2008微软金牌讲师决赛评委证书”。

决赛是在微软三元桥汽车大厦18层举行,经过一个下午20位的选手激烈的比赛和

20轮评委细心的测评与讲师们努力的表演,终于2008微软金牌讲师评选活动顺利完成。

这次参赛选手演讲和技能水平较好,各个评委认真负责,让每个到赛场的人感到激动。

金牌讲师评选分管理组和开发组。



获得2008微软金牌讲师决赛证书

Currently rated 3.3 by 6 people

  • Currently 3.333333/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

指掌风云,秀玩美---Touch Diamond 钻石中的王者

by ξ箫音ξ 6/20/2008 1:27:00 AM

  在基于Windows Mobile 6.1的多普达Touch Diamond智能手机发布之际,微软联合多普达公司举办的“指掌风云
,秀玩美——Windows Mobile 智能达人汇“活动,有幸成为其中之一的爱好者Windows Mobile发烧玩家;

     在Touch Diamond手机正式上市之前的一个月内,率先拿到并试用这款颇受业内和消费者(我也期待N久了...呜呜呜
...内心激动的噼里啪啦的,^_^)期待的Windows Mobile智能手机。
     
      外观上感觉做工华丽、精致、酷炫、设计人性化十足,联系人的头像定制,很酷的切换联系人的功能......

  

( 没有相机,D600照的图惨,汗啊...,借助Autumoon哥们的图炫一个;以后在放更多的原创应用截图^_^)

     第一感觉运行速度快,在启动程序的时候就很明显,即便是启动占用资源很大的“Dr.eye译典通”等软件几乎也就是1.2
秒钟左右就开启了。对比起来想起我的老爷车D600...呜呜呜...伤心啊...

Touch Diamond 智能是旗舰产品它是目前为止其顶级配置,一流工艺,个性化的配置,并且互为战略合作伙伴的多普达

与HTC共同表示:“这款划时代意义的杰作将为广大消费者带来最佳的时尚气息、人文体验以及科技魅力。”

      个人感受,Touch Diamond的设计确实堪称高端智能手机的重大飞跃。HTC首创的TouchFLO® 3D用户界面,以

最直观感性的方式诠释出人机间的互动体验,并搭载了最新的微软Windows Mobile 6.1 Professional操作系统,超强的

硬件配置让Touch Diamond被业内誉为“钻石王者”,可谓实至名归。

      现在我们来看看Touch Diamond的硬件配置,对于Touch Diamond的配置应该说是迄今为止多普达系列手机中最高

的了,就处理器方面采用了高通7206A 528MHz的处理器,光看处理器的主频就已经非常高了(在PPC中),此外,这颗处

理器还是ARM11构架的,我们早先接触的Intel PXA272或者是OMAP850之类的处理器都是ARM9构架的,ARM11和ARM

9的差别就相于奔腾2和奔腾1的差距一样。因此Touch Diamond的528比起老的采用Xscale机型来说运行的速度更快。当然

运行速度快和大内存也是密不可分的,Touch Diamond采用了192MB的程序运行内存,也是目前我们使用过的机型中运行内

存最大的机型了。528MHz CPU,内置4GB存储空间,320万像素自动对焦摄像头,GPS全球卫星定位导航模块,Touch

Diamond以令人目眩的顶级配置,彰显出王者风范。


      不仅如此,为了提升产品的用户体验,这次Touch Diamond还装载有HTC开发的新一代的Touch 3D触控界面,通过更

炫目的操作方式,让用户可轻松与联络人、信息、电子邮件、照片、音乐、气象等信息之间相互连结。此外,Touch Diamond

这次也加入了方向感应器,用户在通过HSDPA/HSUPA高速网络移动上网的时候,不仅可以通过新的操作界面单手缩放或平移

网页,只需将 手机向侧边翻转,就可以自动将网页显示模式进行转换。

      Diamond手感设计的非常好,机身纤薄轻便,但却拥有相当强悍的功能规格。装载有2.8英寸VGA(480×640像素)

分辨率的TFT液晶屏幕,并提供了当前 Windows Mobile 手机最高端的硬件规格。内置有与索尼爱立信XPERIA X1

相同的528 MHz 主频的Qualcomm MSM7201A处理器(汗一个),拥有256MB ROM和192MB的RAM 超高容量内存,并具

备海量的4GB储存空间(不过手机外部本身没留扩展卡插槽),不论是执行程序或是装载文件都更游刃有余。Touch Diamond

还是一款支持 WCDMA/HSPA 900/2100MHz双频的3G手机,支持HSPA的HTC Diamond可高达7.2Mbps的峰值下行速率。
 

 

                    (Touch Diamond内部自带的图片,很Cool吧,^_^)
 

     苹果的Phone预计在2008年(最快可能在第三个季度)发布3G版的IPhone,所以想购买一款集触摸屏、网页浏览、3G功

能于一体的手机,我们又多了一个选择,可以不用再等传闻中的3G版IPhone了,Touch Diamond满足了这种需求 --个人觉

得它吸取了IPhone等智能手机的很多优点,并且突出了很多人性化交互优点,感觉像是“模仿“了苹果^_^,并可提供快速3G

网络接入的突破性装备。

     在对第三方软件的开发支持上微软Windows Mobile 6.1 Professional前不久已经发布比较完备的6.1SDK,支持第三方

态度会更加明晰,并且走到了其他厂商的前面。

    更多的功能和应用我会继续向大家介绍……待续中……

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

基于微软Synchronization Services双向同步技术在企业项目中的架构应用研究

by ξ箫音ξ 6/17/2008 11:44:00 AM

 
项目应用场景:

     某客户是一个大型集团企业的信息部门,掌管着企业几百台服务器,并且以后会不断扩充;
   为了更好的维护信息办的服务器;信息部门需要开发一套维护系统,来记录各个服务器的相关状态信息

  (如,IP、所安装在服务器的应用系统和相关信息等),便于维护和查询;客户维护人员可以携带笔记本

   脱机即时编写维修服务器相关记录信息(增、删、查、改),客户端联网即可自动同步到服务器最新维护数据。
     客户要求实现服务器端和客户端双向同步的方式,客户端操作数据服务器端自动更新,反之操作服务器端,

    客户端自动更新。

早先的解决方案:

客户端和服务端都使用SQL2005数据库,并采用数据库订阅的方式进行数据同步。
此种设计缺点是:

      1、客户端必须安装SQL2005,造成操作客户端系统运行速度降低,占用客户端计算机系统资源大等问题。
      2、同步方式配置复杂。需要订阅方式发布服务器和订阅服务器互相注册,服务器端与客户端配置复杂。

最新的解决方案:

      1、客户端数据库采用微软Microsoft SQL Server Compact 3.5压缩数据库,实施技术Microsoft Synchronization Services v1.0。
      2、服务器端数据库采用微软Microsoft SQL Server 2005(2008)。
      3、开发工具是Microsoft Visual Studio 2008正式版。

      服务器端开发B/S维护系统;C/S端开发客户端Winform(WPF)应用程序;实现客户端winform系统业务操作会相应的同步到服务器中;

反之,服务器端的业务系统操作也会自动同步到下属不同的客户端Compact数据库中。

     架构设计:

     1、服务器端系统架构设计采用MVPC架构:Web Client Software Factory

     2、客户端业务系统架构设计也MVPC架构:Smart Client Software Factory

     优点:客户端模块代码很容易移植到服务器端asp.net开发的业务系统;解决客户端与服务器端应用模块重复,减少代码量;


如果采用Microsoft SQL Server Compact 3.5客户端数据库(Sdf扩展名的数据库文件),不必安装Microsoft SQL Server 2005数据库,客户只需要一个安装包,即可实现客户端的应用系统安装,更加方便灵活的用户体验。


 

 Sync Services for ADO.NET provider 技术应用场景

    * C\S结构的离线应用,在本地缓存中心数据库中的部分数据(极特别的情况下会缓存全部)。应用程序使用缓存的数据,并在特定的时间把一批更改上次到中心数据库。
    * 协作应用,应用程序只使用本地数据,并周期性的与其他参与者进行 Peer-to-Peer 的同步。

 
数据库双向同步:Feature实现客户端C/S系统数据库数据与服务器端B/S管理系统数据库数据进行数据双向同步;

Use case:用户在客户端针对本地数据库系统进行增加、删除、修改等操作,如果在线联网状态,数据自动同步到远程SQL Server数据库;

有管理权限用户,登录B/S系统进行增加、删除、修改等操作,SQL Server数据自动同步到客户端数据库。

功能实现Server与Client端进行数据操作(增加、删除),都能很好的进行数据双向同步;

Sync Demo源码程序截图如下:



Compact数据库同步技术功能

Microsoft SQL Server Compact 3.5 (以前称为 Microsoft SQL Server 2005 Mobile Edition)是一种压缩数据库,很适合嵌入到移动应用程序和桌面应用程序中。Microsoft SQL Server Compact 3.5 为开发本机和托管应用程序的开发人员提供了与其他 SQL Server 版本通用的编程模型。SQL Server Compact Edition 以很少的空间占用提供关系数据库功能:健壮数据存储、优化查询处理器以及可靠、可缩放的连接。 

Microsoft Synchronization Services for ADO.NET 是一组 DLL,提供了一个可组构的 API。根据应用程序的体系结构和要求,可以使用提供的所有或部分组件。Synchronization Services 实现了 SQL Server Compact 3.5 客户端数据库和服务器数据库或任何其他数据源(如以 XML 形式提供股票报价的服务)之间的同步。在同步两个数据库方面,Synchronization Services 支持使用为之提供了 ADO.NET 提供程序的任何服务器数据库的双层和 N 层体系结构。

在对客户端数据库和其他类型的数据源进行同步方面,Synchronization Services 支持基于服务的体系结构。与双层或 N 层体系结构相比,此体系结构需要编写更多的应用程序代码;但是,它不需要开发人员采取另一种不同的方式进行同步。

通过 Microsoft Visual Studio 2008 的Microsoft Synchronization Services for ADO.NET,可以通过双层、N 层和基于服务的体系结构同步来自不同来源的数据。Synchronization Services API 提供了一组用于在数据服务和本地存储区之间同步数据的组件,而不是仅仅用于复制数据库及其架构。应用程序正越来越多地用于移动客户端,如便携式计算机和设备。由于这些移动客户端与中央服务器没有连贯或可靠的网络连接,因此对于这些应用程序而言,能够在客户端上使用数据的一份本地副本十分重要。同等重要的一点是:在网络连接可用时,需要能够将数据的本地副本与中央服务器同步。Synchronization Services API 以 ADO.NET 数据访问 API 为蓝本,提供了一种直观的数据同步手段。Synchronization Services 对构建依靠连续网络连接的应用程序这一工作进行了合乎逻辑的扩展,使我们得以针对断续连接的网络环境开发应用程序。

相关代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServerCe;
using Microsoft.Synchronization.Data.Server;
using System.Data.SqlServerCe;


namespace SynchrnoizationDemo
{
    public partial class frmMain : Form
    {
        #region 定义常规数据区
        private const string strServerListTableName = "ServerList";
        private const string strUserListTableName = "UserList";

        private const string strCreationTrackingColumn = @"create_timestamp";
        private const string strUpdateTrackingColumn = @"update_timestamp";
        private const string strDeletionTrackingColumn = @"update_timestamp";
        private const string strUpdateOriginatorIdColumn = @"update_originator_id";

        private const string strNoClientDBWarnString = "客户端数据库不存在,请首先执行 双向同步 命令";
        #endregion

        #region 定义变量区
        private string strServerIP = @"(local)";
        private string strServerDataBaseName = "SyncDemo";
        private string strLoginUser = "sa";
        private string strLoginPassWord = "sa";
        private string strServerConnectString = "";

        private string strClientDataBasename = Application.StartupPath + @"\ClientDB.sdf";
        private string strClientConnectString = "";

        private bool blnOperationClient = true;
        private string strOperationTable = strServerListTableName;
        #endregion

        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            //  初始化相关参数
            SetEnvironmentValue();
        }

        #region 通用方法
        /// <summary>
        /// 获取相关参数
        /// </summary>
        private void GetEnvironmentValue()
        {
            strServerIP = txtServerIP.Text.Trim();
            strServerDataBaseName = txtServerDataBaseName.Text.Trim();
            strLoginUser = txtLoginUser.Text.Trim();
            strLoginPassWord = txtLoginPassWord.Text.Trim();
            strServerConnectString = "Data Source="+strServerIP+";Initial Catalog="+strServerDataBaseName+";User ID="+strLoginUser+";Password="+strLoginPassWord+";";

            strClientDataBasename = txtClientDataBaseFileName.Text.Trim();
            strClientConnectString = "Data Source=" + strClientDataBasename;

            blnOperationClient = rbClient.Checked;
            strOperationTable = tabMain.SelectedIndex == 0 ? strServerListTableName : strUserListTableName;
        }
        /// <summary>
        /// 显示相关参数
        /// </summary>
        private void SetEnvironmentValue()
        {
            txtServerIP.Text = strServerIP;
            txtServerDataBaseName.Text = strServerDataBaseName;
            txtLoginUser.Text = strLoginUser;
            txtLoginPassWord.Text = strLoginPassWord;
            txtClientDataBaseFileName.Text = strClientDataBasename;
           
            if (blnOperationClient)
            {
                rbClient.Checked=true;
                rbServer.Checked=false;
            }
            else
            {
                rbServer.Checked=true;
                rbClient.Checked=false;
            }
        }
        /// <summary>
        /// 检查客户端数据库是否存在
        /// </summary>
        /// <returns></returns>
        private Boolean CheckClientDb()
        {
            //这里默认已经调用了GetEnvironmentValue函数
            return File.Exists(strClientDataBasename);
        }
        #endregion

        #region 刷新数据
        /// <summary>
        /// 刷新调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btRefersh_Click(object sender, EventArgs e)
        {
            btRefersh.Enabled = false;
            //RefreshData(tabMain.SelectedTab.Text.Replace("表", ""));
            RefreshData(strServerListTableName);
            RefreshData(strUserListTableName);
            btRefersh.Enabled = true;
        }

        /// <summary>
        /// 数据刷新
        /// </summary>
        /// <param name="sTableName"></param>
        private void RefreshData(string sTableName)
        {
            GetEnvironmentValue();

            string sSql = "Select * from " + sTableName;
           
            DataTable dtQuery;

            try
            {
                #region 读取服务器端
                SqlDataAdapter serverLoadAdapter = new SqlDataAdapter(sSql, strServerConnectString);
                dtQuery = new DataTable();
                serverLoadAdapter.Fill(dtQuery);
                RemoveServerTrackingColumns(dtQuery);
                switch (sTableName)
                {
                    case strServerListTableName:
                        dgSLServer.DataSource = dtQuery;
                        break;
                    case strUserListTableName:
                        dgULServer.DataSource = dtQuery;
                        break;
                }
                #endregion

                #region 读取客户端
                if (CheckClientDb())
                {
                    SqlCeDataAdapter clientLoadAdapter = new SqlCeDataAdapter(sSql,strClientConnectString);
                    dtQuery = new DataTable();
                    clientLoadAdapter.Fill(dtQuery);
                    RemoveClientTrackingColumns(dtQuery);
                    switch (sTableName)
                    {
                        case strServerListTableName:
                            dgSLClient.DataSource = dtQuery;
                            break;
                        case strUserListTableName:
                            dgULClient.DataSource = dtQuery;
                            break;
                    }
                }
                else
                {
                    MessageBox.Show(strNoClientDBWarnString);
                }
                #endregion
            }
            catch (System.Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        /// <summary>
        /// 去除客户端表中不需要显示的列
        /// </summary>
        /// <param name="dataTable"></param>
        private static void RemoveClientTrackingColumns(DataTable dataTable)
        {
            if (dataTable.Columns.Contains("__sysInsertTxBsn"))
            {
                dataTable.Columns.Remove("__sysInsertTxBsn");
            }

            if (dataTable.Columns.Contains("__sysChangeTxBsn"))
            {
                dataTable.Columns.Remove("__sysChangeTxBsn");
            }
        }
        /// <summary>
        /// 去除服务器端表中不需要显示的列
        /// </summary>
        /// <param name="dataTable"></param>
        private static void RemoveServerTrackingColumns(DataTable dataTable)
        {
            if (dataTable.Columns.Contains("update_timestamp"))
            {
                dataTable.Columns.Remove("update_timestamp");
            }

            if (dataTable.Columns.Contains("create_timestamp"))
            {
                dataTable.Columns.Remove("create_timestamp");
            }

            if (dataTable.Columns.Contains("update_originator_id"))
            {
                dataTable.Columns.Remove("update_originator_id");
            }

        }
        #endregion

        #region 同步数据
        /// <summary>
        /// 同步数据调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btSync_Click(object sender, EventArgs e)
        {
            btSync.Enabled = false;
            panOperation.Enabled = false;
            SynchronizeData();
            btRefersh_Click(null, null);
            panOperation.Enabled = true;
            btSync.Enabled = true;
        }
        /// <summary>
        /// 数据同步
        /// </summary>
        private void SynchronizeData()
        {
            #region 初始化
            GetEnvironmentValue();

            SyncAgent syncAgent = new SyncAgent();
            #endregion
            try
            {

                #region 服务器端准备
                DbServerSyncProvider serverSyncProvider = new DbServerSyncProvider();
                SqlConnection serverConnection = new SqlConnection(strServerConnectString);
                serverSyncProvider.Connection = serverConnection;
                syncAgent.RemoteProvider = serverSyncProvider;
                #endregion


                #region 客户端准备
                if (!CheckClientDb())
                {
                    SqlCeEngine clientEngine = new SqlCeEngine(strClientConnectString);
                    clientEngine.CreateDatabase();
                    clientEngine.Dispose();
                }
                SqlCeClientSyncProvider clientSyncProvider = new SqlCeClientSyncProvider(strClientConnectString);
                syncAgent.LocalProvider = clientSyncProvider;
                #endregion


                #region SyncTable和SyncGroup准备
                //  ServerList表
                SyncTable tableServerList = new SyncTable(strServerListTableName);
                tableServerList.CreationOption = TableCreationOption.DropExistingOrCreateNewTable;
                tableServerList.SyncDirection = SyncDirection.Bidirectional;

                //  UserList表
                SyncTable tableUserList = new SyncTable(strUserListTableName);
                tableUserList.CreationOption = TableCreationOption.DropExistingOrCreateNewTable;
                tableUserList.SyncDirection = SyncDirection.Bidirectional;

                //  SyncGroup
                SyncGroup syncGroup = new SyncGroup("SyncDemo");
                tableServerList.SyncGroup = syncGroup;
                tableUserList.SyncGroup = syncGroup;

                syncAgent.Configuration.SyncTables.Add(tableServerList);
                syncAgent.Configuration.SyncTables.Add(tableUserList);
                #endregion

                #region SyncAdapter准备

                #region ServerList准备
                SqlSyncAdapterBuilder ServerListBuilder = new SqlSyncAdapterBuilder();
                ServerListBuilder.Connection = serverConnection;
                ServerListBuilder.SyncDirection = SyncDirection.Bidirectional;

                // 主表及其相关列
                ServerListBuilder.TableName = strServerListTableName;
                ServerListBuilder.DataColumns.Add("ServerID");
                ServerListBuilder.DataColumns.Add("ServerIP");
                ServerListBuilder.DataColumns.Add("ServerBuyTime");

                // tombstone表及其相关列
                ServerListBuilder.TombstoneTableName = strServerListTableName + "_tombstone";
                ServerListBuilder.TombstoneDataColumns.Add("ServerID");
                ServerListBuilder.TombstoneDataColumns.Add("ServerIP");
                ServerListBuilder.TombstoneDataColumns.Add("ServerBuyTime");

                // 相关的跟踪列
                ServerListBuilder.CreationTrackingColumn = strCreationTrackingColumn;
                ServerListBuilder.UpdateTrackingColumn = strUpdateTrackingColumn;
                ServerListBuilder.DeletionTrackingColumn = strDeletionTrackingColumn;
                ServerListBuilder.UpdateOriginatorIdColumn = strUpdateOriginatorIdColumn;

                SyncAdapter ServerListSyncAdapter = ServerListBuilder.ToSyncAdapter();
                ((SqlParameter)ServerListSyncAdapter.SelectIncrementalInsertsCommand.Parameters["@sync_last_received_anchor"]).DbType = DbType.Binary;
                ((SqlParameter)ServerListSyncAdapter.SelectIncrementalInsertsCommand.Parameters["@sync_new_received_anchor"]).DbType = DbType.Binary;
                serverSyncProvider.SyncAdapters.Add(ServerListSyncAdapter);
                #endregion

                #region UserList准备
                SqlSyncAdapterBuilder UserListBuilder = new SqlSyncAdapterBuilder();
                UserListBuilder.SyncDirection = SyncDirection.Bidirectional;
                UserListBuilder.Connection = serverConnection;

                // 主表及其相关列
                UserListBuilder.TableName = strUserListTableName;
                UserListBuilder.DataColumns.Add("UserID");
                UserListBuilder.DataColumns.Add("UserName");
                UserListBuilder.DataColumns.Add("UserPW");
 
                // tombstone表及其相关列
                UserListBuilder.TombstoneTableName = strUserListTableName + "_tombstone";
                UserListBuilder.TombstoneDataColumns.Add("UserID");
                UserListBuilder.TombstoneDataColumns.Add("UserName");
                UserListBuilder.TombstoneDataColumns.Add("UserPW");
 
                // 相关的跟踪列
                UserListBuilder.CreationTrackingColumn = strCreationTrackingColumn;
                UserListBuilder.UpdateTrackingColumn = strUpdateTrackingColumn;
                UserListBuilder.DeletionTrackingColumn = strDeletionTrackingColumn;
                UserListBuilder.UpdateOriginatorIdColumn = strUpdateOriginatorIdColumn;


                SyncAdapter UserListSyncAdapter = UserListBuilder.ToSyncAdapter();
                ((SqlParameter)UserListSyncAdapter.SelectIncrementalInsertsCommand.Parameters["@sync_last_received_anchor"]).DbType = DbType.Binary;
                ((SqlParameter)UserListSyncAdapter.SelectIncrementalInsertsCommand.Parameters["@sync_new_received_anchor"]).DbType = DbType.Binary;
                serverSyncProvider.SyncAdapters.Add(UserListSyncAdapter);
                #endregion

                #endregion

                #region 数据同步
                SqlCommand anchorCmd = new SqlCommand();
                anchorCmd.CommandType = CommandType.Text;
                anchorCmd.CommandText = "Select @" + SyncSession.SyncNewReceivedAnchor + "= @@DBTS";// " = @@DBTS";
                anchorCmd.Parameters.Add("@" + SyncSession.SyncNewReceivedAnchor, SqlDbType.Timestamp).Direction = ParameterDirection.Output;
                serverSyncProvider.SelectNewAnchorCommand = anchorCmd;

                SqlCommand clientIdCmd = new SqlCommand();
                clientIdCmd.CommandType = CommandType.Text;
                clientIdCmd.CommandText = "SELECT @" + SyncSession.SyncOriginatorId + " = 1";
                clientIdCmd.Parameters.Add("@" + SyncSession.SyncOriginatorId, SqlDbType.Int).Direction = ParameterDirection.Output;

                serverSyncProvider.SelectClientIdCommand = clientIdCmd;

                syncAgent.Synchronize();
                #endregion  

            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
        #endregion

        #region 增量操作
        #region 产生各种随机数据
        /// <summary>
        /// 产生随机IP
        /// </summary>
        /// <returns></returns>
        private string ReturnRandomIP(Random rand)
        {
            string sRe = "192.168." + rand.Next(0, 256).ToString() + "." + rand.Next(0, 256).ToString();
            return sRe;
        }
        /// <summary>
        /// 产生随机ID
        /// </summary>
        /// <param name="rand"></param>
        /// <returns></returns>
        private string ReturnRandomID(Random rand)
        {
            return rand.Next((int)(DateTime.Now.ToFileTime() % 10000)).ToString();
        }

        /// <summary>
        /// 产生随机字符
        /// </summary>
        /// <param name="rand"></param>
        /// <returns></returns>
        private char ReturnRandomChar(Random rand)
        {
            int ret = rand.Next(122);
            while (ret < 48 || (ret > 57 && ret < 65) || (ret > 90 && ret < 97))
            {
                ret = rand.Next(122);
            }
            return (char)ret;
        }
        /// <summary>
        /// 产生随机字符串
        /// </summary>
        /// <param name="rand"></param>
        /// <returns></returns>
        private string ReturnRandomString(Random rand)
        {
            int length = 10;
            StringBuilder sb = new StringBuilder(length);
            for (int i = 0; i < length; i++)
            {
                sb.Append(ReturnRandomChar(rand));
            }
            return sb.ToString();
        }
        #endregion

        /// <summary>
        /// 返回一个随机操作的ID
        /// </summary>
        private string ReturnRandomUpdateOrDeleteID(Random rand)
        {
            DataTable dtRef = new DataTable();
            if (strOperationTable == strServerListTableName)
            {
                if (blnOperationClient)
                {
                    dtRef = (DataTable)dgSLClient.DataSource;
                }
                else
                {
                    dtRef = (DataTable)dgSLServer.DataSource;
                }
            }
            else
            {
                if (blnOperationClient)
                {
                    dtRef = (DataTable)dgULClient.DataSource;
                }
                else
                {
                    dtRef = (DataTable)dgULServer.DataSource;
                }
            }
            int iTotalRows = dtRef.Rows.Count;
            return dtRef.Rows[rand.Next(0, iTotalRows)][0].ToString();
        }
        /// <summary>
        /// 具体执行增删改的操作
        /// </summary>
        /// <param name="CommandString"></param>
        private void ExecuteOperation(string CommandString)
        {
            if (blnOperationClient)
            {
                #region 客户端操作
                if (CheckClientDb())
                {
                    SqlCeConnection conn = new SqlCeConnection(strClientConnectString);
                    SqlCeCommand cmd = new SqlCeCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = CommandString.ToString();
                    try
                    {
                        conn.Open();
                        cmd.ExecuteNonQuery();
                    }
                    catch (System.Exception exp)
                    {
                        MessageBox.Show(exp.Message);
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
                else
                {
                    MessageBox.Show(strNoClientDBWarnString);
                }
                #endregion
            }
            else
            {
                #region 服务器端操作
                SqlConnection conn = new SqlConnection(strServerConnectString);
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = CommandString;
                try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
                catch (System.Exception exp)
                {
                    MessageBox.Show(exp.Message);
                }
                finally
                {
                    conn.Close();
                }
                #endregion
            }

            RefreshData(strOperationTable);
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btUpdate_Click(object sender, EventArgs e)
        {
            btUpdate.Enabled = false;

            #region 初始化
            GetEnvironmentValue();
            Random rand = new Random();
            StringBuilder sSql = new StringBuilder();
            if (strOperationTable == strServerListTableName)
            {
                //update ServerList set ServerIP='123.12',ServerBuyTime=GetDate() where ServerID=1
                sSql.Append(@" update ServerList ");
                sSql.Append(@" set ServerIP='"+ReturnRandomIP(rand)+"', ");       //ServerIP
                sSql.Append(@" ServerBuyTime=GetDate() ");      //ServerBuyTime
                sSql.Append(@" where ServerID="+ReturnRandomUpdateOrDeleteID(rand)+" ");    //UpdateID
            }
            else
            {
                sSql.Append(@" update UserList ");
                sSql.Append(@" set UserName = '"+ReturnRandomString(rand)+"', ");         //UserName
                sSql.Append(@" UserPW = '"+ReturnRandomString(rand)+"' ");                //UserPW
                sSql.Append(@" where UserID="+ReturnRandomUpdateOrDeleteID(rand)+" ");    //UpdateID
            }
            #endregion

            ExecuteOperation(sSql.ToString());

            btUpdate.Enabled = true;
        }

        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btAdd_Click(object sender, EventArgs e)
        {
            btAdd.Enabled = false;

            #region 初始化
            GetEnvironmentValue();
            Random rand = new Random();
            StringBuilder sSql = new StringBuilder();
            if (strOperationTable == strServerListTableName)
            {
                sSql.Append(@" insert into ServerList (ServerID, ServerIP, ServerBuyTime) ");
                sSql.Append(@" values( ");
                sSql.Append(@" " + ReturnRandomID(rand) + ", ");   //ServerID
                sSql.Append(@" '" + ReturnRandomIP(rand) + "', "); //ServerIP
                sSql.Append(@" GetDate() ");    //ServerBuyTime
                sSql.Append(@" ) ");
            }
            else
            {
                sSql.Append(@" insert into UserList (UserID, UserName, UserPW) ");
                sSql.Append(@" values( ");
                sSql.Append(@" " + ReturnRandomID(rand) + ", ");       //UserID
                sSql.Append(@" '" + ReturnRandomString(rand) + "', ");    //UserName
                sSql.Append(@" '" + ReturnRandomString(rand) + "' ");     //UserPW
                sSql.Append(@" ) ");
            }
            #endregion

            ExecuteOperation(sSql.ToString());

            btAdd.Enabled = true;
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btDelete_Click(object sender, EventArgs e)
        {
            btDelete.Enabled = false;

            #region 初始化
            GetEnvironmentValue();
            Random rand = new Random();
            StringBuilder sSql = new StringBuilder();
            if (strOperationTable == strServerListTableName)
            {
                sSql.Append(@"delete from ServerList where ServerID="+ReturnRandomUpdateOrDeleteID(rand));
            }
            else
            {
                sSql.Append(@"delete from UserList where UserID="+ReturnRandomUpdateOrDeleteID(rand));
            }
            #endregion

            ExecuteOperation(sSql.ToString());

            btDelete.Enabled = true;
        }
        #endregion

    }
}
 


Demo与源码下载: 

code.zip (68.69 kb)

release.zip (12.88 kb)

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

发布最新C#3.5开发的ReSharper4.0 for VS2005/2008 注册机

by ξ箫音ξ 6/17/2008 6:51:00 AM
ReSharper是一款微软Microsoft Visual Studio 2005 和Microsoft Visual Studio .NET 2008和的插件,也是目前ReSharper4.0-VS2005和ReSharper4.0-VS2008编程插件中最强的插件之一,它提供了智能 C#辅助编码功能和实时错误显示功能,并支持重构。提供流行C#代码智能帮助,高亮度显示实时纠错以及重新参数化等功能。ReSharper为C#开发人 员提供许多能够有效提高生产力的功能,这些功能已被成千上万使用IntelliJ IDEA的Java程序员所采用。ReSharper为C#开发人员提供了许多强有力的特性,极大地提高了开发效率。

 
 
 
 
  使用说明:

   1、此注册机算是网络上最豪华的注册机,界面漂亮功能强大;有微型播放器功能,并支持mp3,wma等通用格式。
   2、程序启动后会自动播放“光”歌曲,并转到音乐库”界面,可以在“播放控制”选项采取相应操作。
   3、如使用ReSharper 4.0新版注册机,请切换到注册码按钮,输入你自己想要的名字,按生成按钮生成密匙。启动VS 2005/2008菜单,选择ReSharper菜单-License Information-Enter License,输入用户名和密匙Expiration Date:never 注册成功。
   4、切换到"音乐库"按钮标签,即可选择你要播放的歌曲。如需要添加歌曲,点击歌曲表,按右鼠标,菜单中选择你要播放的文件夹和音乐文件。
   5、有的ReSharper4.0-VS2008版本会没有注册选项,但是你注册过ReSharper4.0-VS2008版本后,2008版本即可解除限制。
  
程序特色如下:
1.语法错误高亮显示
2.搜索
3.代码助手
4.自动更正
5.活动模板
6.代码格式化
7.重构
8.代码生成
9.其它特征
10.代码导航
11.代码完成

   此次注册机是采用Microsoft Visual Studio 2008最新开发技术设计,所以需要安装最新的Microsoft .NET Framework v3.5 正式版和Windows Media Player9.0.

   ReSharper 4.0 for VS2005/2008注册机是目前位置针对ReSharper 4.0版本最好的注册机,能采用破解RSA技术,生成密匙能完全解除程序本身功能和时间的限制。

   此程序由我和程序员心疤用.net4.0编写完成。希望此次公布能够为广大.net编程爱好者更多的帮助。如遇到什么问题,请到箫心论坛http://it.crfly.com/发帖咨询。 

 ReSharper4.0

下载地址:http://download.jetbrains.com/resharper/ReSharperSetup.4.0.msi

注册机: 

crReSharper4.zip (3.67 mb)

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

关于asp.net中的缓存管理的分析

by ξ箫音ξ 6/16/2008 5:51:00 PM
导言
我比较喜欢使用的阶段性缓存管理(高速缓存)。但在概念上在这两者之间是没有分别的。现在让我们讨论不同方面的缓存管理(状态管理)在asp.net 。

虽然缓存管理问题不是一个在Windows的应用,它一直是一个挑战,在网络环境下。由于HTTP是一种协议和Web服务器识别用户之间不同的要求,它就成为非常重要的是,我们认识到一个特定的用户之间不同的要求,并存储数据,以便它能够重新使用之间的不同的要求。 asp.net提供了许多功能,存储数据,无论是在客户端(浏览器)和服务器( Web服务器),有时我们感到困惑什么时候该使用什么。在asp.net 里,我们碰到的这些功能,例如会话应用和高速缓存的对象,但最重要的是,我们要了解它们之间的差异,为了有效地使用他们在Web应用程序。

背景
在这篇文章中,我会解释,不同的缓存管理可供选择在asp.net的方案 。在Web应用程序,有时我们需要数据存储在服务器端,以避免付出高昂代价的数据检索操作,从数据存储和时间消费的数据格式的逻辑来提高应用程式效能,以及要求以后重新使用相同的数据。因此,要达到这个目标,我们需要存储(缓存)的数据在服务器端。

缓存可以帮助我们实现三个重要方面, QoS (服务质量) :

性能和缓存提高,使应用性能也随之提高,通过最小的数据检索和格式化操作。
可扩展性:由于缓存的最小的数据检索和格式化操作,减少了负荷对服务器的资源,从而增加了可扩展性的应用。
可用性:   由于应用程序使用的数据,从缓存申请有可能将产生的错误会在其他系统和数据库出现。
不同的选择
在Web应用程序,我们可以高速缓存数据,页面等无论是在服务器和客户端。让我们来看看在不同的可供选择的方案在asp.net为缓存的数据都在服务器和客户端。

服务器端的缓存管理
asp.net会话状态
asp.net会话状态是用来缓存数据每用户会话。这意味着,数据不能共享跨多个用户,数据使用量是有限的,以用户会话,这是创造asp.net会话的目的。

asp.net会话状态可以管理在三种不同的方法:

inproc :储存在Aspnet_wp.exe进程。会话资料时,遗失的过程中,或应用程序域是循环的。
stateserver :会话状态存储在一个单独的进程( a spnet_state.exe) ,它可以储存在一个不同的机器。因为它可以储存在不同的机器,此选项将工作在一个Web场的情况。
sqlserver :会话状态存储在一个SQL Server数据库。这个选项也将工作在一个Web场的情况。
无论是在stateserver和sqlserver选项,我们需要确保我们的对象缓存是串行数据仓库,是地地道道的过程系统。这两个方案的影响,该inproc的选择应用性能 作为数据检索和储存业务所采取更多的时候对比。因此,基于我们的应用要求,我们应该选择的选项,最适合我们的要求。

下面的示例显示如何Session对象可以用来在代码如下:

string empNum = Request.QueryString["empnum"];
if (empNum != null)
{
    string details = null;

    if (Session["EMP_DETAILS"] == null)
    {
        //Get Employee Details for employee number passed
        string details = GetEmployeeDetails(Convert.ToInt32(empNum));

        Session["EMP_DETAILS"] = details;
    }
    else
    {
        details = Session["EMP_DETAILS"];
    }

    //send it to the browser
    Response.Write(details);
}

asp.net应用程序对象
asp.net提供了一个对象所谓的应用对象来存储数据,是任何人都可以获得所有用户的请求。这个对象是联系在一起的应用,这是重新创建和启 动每一次的应用。不同的asp.net会话的对象,这个对象是方便所有用户的请求。由于这是仓库设立和维持在一个应用程序域空间,这不应被用于数据存储在Web场的情 况。这个选项是非常有用与数据存储一样,应用元数据( config文件的数据) ,当Application对象在应用程序启动起来时,可以用在应用而不需要重新装载它,并每一次为每个用户的请求。但如果是有规定的无效缓存的 数据,每当有任何改变到config文件,而应用程序正在运行,此选项不应当被用来作为它没有提供任何功能缓存数据。因此,在这种情况下其他选项一 样,asp.net Cache对象应使用,解释如下:

asp.net Cache对象
asp.net Cache对象是我最喜爱的缓存机制。这就是为什么我爱较多地了解它。asp.net提供了一个关键值配对的对象-Cache对象,其中,可在system.web.caching名字空间的范围。不同的asp.net Session对象,这个对象是方便所有用户的请求。

虽然两者的应用和高速缓存的物体看起来一样,关键的区别是补充所提供的功能Cache对象一样,到期的策略和依赖性的问题。这意味着,数据存储在 Cache对象,可过期/删除的基础上一些预设,所规定时限内应用程序代码,或依赖实体得到改变时,而无法使用此功能在Application的对象。

让我们讨论不同的时限和策略和相依赖与支持。

依赖
依赖是指一个项目可以从缓存中删除当一个依赖的实体得到改变。因此,依赖关系可以定义一个项目,其搬迁从缓存中,将取决于供养。有两种类型的相依性支持在asp.net 。

文件的依赖-这提供了一个选择删除的项目会自动从缓存每当一个磁盘文件的变化。让我们说,在我的应用程序,我使用XML文件来存储错误的详细资料(错误号 码和错误讯息映射)这是用来撷取一个错误讯息,为某一特定的错误号码在运行时。因此,不是读文件从磁盘,每次我需要一个错误讯息,让我们说,我决定负荷, 它一旦在应用程序启动和它储存在该asp.net缓存为进一步利用。所以,如果我需要更改config文件中添加新的错误讯息,或改变现有的一些错误讯 息,而应用程序正在运行,那么会发生什么事我缓存的数据?我是否需要停止应用程序,并再次启动它,以反映该文件的变化,在申请?答案是否定的。缓存数据可 以失效时,该文件的变化,利用档案的依赖选项。
下面的示例显示如何文件的依赖,可以用来无效缓存项目。所以当errors.xml文件更改缓存项目将自动获得过期,并会从缓存中删除。

 object errorData;
 //Load errorData from errors.xml
 CacheDependency fileDependency =
     new CacheDependency(Server.MapPath("errors.xml"));
 Cache.Insert("ERROR_INFO", errorData, fileDependency);

关键的依赖-主要是依赖类似文件的依赖,但唯一的区别是不是一个文件的项目,是依赖于另一个项目在缓存中得到失效时,依赖项目得到改变或撤销。这个选项是 有用的当多个相关的项目都被添加到缓存和这些项目被遣送离境,如果主要项目是改变。例如,为员工人数,姓名,地址和薪金都被添加到缓存,如果员工人数是更 新/删除所有有关雇员的信息都将被删除。在这种情况下,员工人数的依赖,可用于其他雇员的信息。
下面的示例显示如何关键的依赖,可以用来作废缓存的项目。

string[] relatedKeys = new string[1];
relatedKeys[0] = "EMP_NUM";
CacheDependency keyDependency = new CacheDependency(null, relatedKeys);
Cache["EMP_NUM"] = 5435;
Cache.Insert("EMP_NAME", "Shubhabrata", keyDependency);
Cache.Insert("EMP_ADDR", "Bhubaneswar", keyDependency);
Cache.Insert("EMP_SAL", "5555USD", keyDependency);

到期策略
到期的策略,订定策略,如何及何时一个项目在缓存中应届满。

基于时间到期-基于时间到期提供了一个选项届满一项目在缓存中,在预定的时间。到期时间可定为绝对时间一样, 2008年06月31日12时或滑动时间即相对目前的时候,该项目的访问。
//Absolute Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
             DateTime.Now.AddDays(1), Cache.NoSlidingExpiration);

//Sliding Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
             Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(60));

如何知道当一个项目被删除?
在上面的例子中,我们学会了如何删除一个项目从缓存中,但有时我们想知道当一个项目是从缓存中删除。是的,是有可能利用高速缓存的回调。在错误的细节,例如上面显示的,缓存项目的到期日时, errors.xml文件更改。假设我们要更新缓存的最新错误的详细资料。找出错误时的细节是从缓存中删除,我们可以使用高速缓存回调作进一步处理(重新加载错误的详细资料,再次向快取记忆体) 。

下面的例子说明如何使用缓存回调处理项目到期的情况:

private void AddItemsToCache()
{   
    int empNum = 5435;
    CacheItemRemovedCallback onEmpDetailsRemove =
                    new CacheItemRemovedCallback(EmpDetailsRemoved);
    Cache.Insert("EMP_NUM", empNum, null,
                              Cache.NoAbsoluteExpiration,
                              Cache.NoSlidingExpiration,
                              CacheItemPriority.Default,
                              onEmpDetailsRemove);
}

private void EmpDetailsRemoved(string key, object val,
                              CacheItemRemovedReason reason)
{
    //When the item is expired
    if (reason == CacheItemRemovedReason.Expired)
    {
        //Again add it to the Cache
        AddItemsToCache();    }
}

在上面的例子中,您必须注意到参数cacheitempriority用随回调方法。 cacheitempriority是用来设置优先的项目,我们加入到缓存中。优先需要设置告诉缓存incase低内存在服务器上删除缓存的项目,可用记忆体的基础上,优先设置。这个过程称为清除。

。 NET Remoting的
你可能会思考如何在。NET Remoting的可用于数据缓存?同样的问题,正如你所知道的。 NET Remoting的单身对象的股票相同的,例如与多个客户,使Singleton对象可以用来存储和共享数据之间不同的客户端调用。自。 NET Remoting的可用于以外的进程和机器,这个选项是非常有益的,当我们要高速缓存数据与分享不同的服务器和用户特别是在Web场的情况。在这方面的做 法,我们可以存储的数据作为成员变量的单身Remoting的对象,并提供方法来读取和保存数据。但是,尽管实施这一我们必须确保远程对象用来作为快取记 忆体是不是销毁由垃圾回收器。为此,我们将不得不设置在Remoting Cache对象的租赁期无限,使租赁期间从未倍。我们可以这样做,由凌驾于initializelifetimeservice方法 marshalbyrefobject并返回空从这个方法。但唯一的问题,这种做法的表现。作为分析说,表现极差,在这种方法时,比起其他的办法。无论如 何,这是向应用设计师/开发人员分析不同的选择和使用最好的之一,符合规定。

内存映射文件
大家都知道什么是内存映射文件。它基本上是有关映射磁盘上的文件到特定的地址范围,在该应用程序的进程地址空间。这个选项可以让不同的程序使用相同的数据,增加应用性能。使用内存映射文件是不是很受欢迎。 NET开发,我个人不建议这种做法作为贯彻落实这涉及到了很多的复杂性和也。 NET框架不支持这一点。但如果任何人都非常有兴趣使用这种方法,然后他们将必须发展自己的自定义解决方案为百分之自己的要求。

静态变量
我们使用静态变量用于存储数据或物体在全球范围,以便它可以访问期间的生活应用。同样,在asp.net ,我们可以使用静态对象缓存的数据,我们也可以提供方法以检索和保存数据传送到高速缓存。作为静态变量都存储在进程方面,表现明智的,这是速度更快。但因为它是非常困难的实施到期的政策和相依incase的静态变数,我一般宁愿asp.net Cache对象超过这个选项。另一个问题是,自定义静态Cache对象要线程安全的,其中有即将实施的审慎。

自定义静态Cache对象可以被界定为如下所示:

public class CustomCache
{
    //Synchronized to implement thread-safe
    static Hashtable _myCache =
             Hashtable.Synchronized(new Hashtable());
   
    public static object GetData(object key)
    {
        return _myCache[key];
    }
   
    public static void SetData(object key, object val)
    {
        _myCache[key] = val;
    }
}

数据库
我们也可以使用一个数据库,用于存储数据和分享数据,全国用户和机器。这种做法是非常有用的,当我们要快取记忆体的大量数据。使用这种方法储存的少量数 据,是不是一个好主意,因为表现。储存的少量数据,我们应该走在其他asp.net进程缓存机制。作为数据必须存储在一个数据库中的所有对象必须XML的 系列化,使其更容易存储和检索。我们也可以使用其他类型的系列化可用的格式在。 NET Framework 。

asp.net页面输出缓存
有时在我们的应用在一些页面的输出,一般不会改变为某一特定时期的时间。例如在一个人力资源网站,薪金的详情,雇员不改变已非常频密和它的变化,只有一 次,在一个月内。一般来说,改变只对第一天的每一个月。因此,在一个月的薪金详情页将显示相同的细节,针对特定的雇员。因此,在这种情况下,是不是一个好 主意,缓存的网页的某个服务器,以避免商业计算处理,调用数据库和网页呈现逻辑每一次雇员希望看到他的薪金细节。我认为,是的!这是一个非常好的主意。要 做到这一点, asp.net提供了一个功能来存储输出一个网页在服务器上为某一特定时期的时间。它还提供了功能,以存储片段的一个网页,其中被称为页的片段缓存。在这 里我不打算谈了很多页输出缓存有其他物品可在互联网上,涵盖这一机制的详细研究。这将一个非常漫长的一段,如果我开始讨论它。我的规划,以支付这在另一篇 文章。

<!-- VaryByParm - different versions of same page will be
cached based on the parameter sent through HTTP Get/Post
Location - where the page is cached -->
<%@OutputCache Duration="60" VaryByParam="empNum"
                                       Location="Server"%>
 

选择工程在Web场的情况呢?言论
asp.net会话状态
-i nproc
-s tateserer
-s qlserver
 

 不像其他的选择,只存储用户会话的具体数据
asp.net应用程序对象没有
asp.net Cache对象没有
。 NET Remoting的是
内存映射文件没有
静态变量没有
数据库是
asp.net页面输出缓存没有

客户端缓存管理
在前面几节我们讨论了关于不同的缓存选项可在服务器端,但有时我们可能需要缓存的数据或页面在客户端,以改善应用性能。利用这个机制,减少负载在服务器 上,但这个机制有一些安全问题,因为我们缓存的数据在客户端。有不同的可供选择的方案,为客户端高速缓存。我要简单地谈一谈关于几个人。

饼干
Cookie是非常熟悉的任期在Web的发展环境。 Cookie是客户端的存储是发送到服务器对于每个请求和还收到了作为回应,回到从服务器。因为它的大小限制( 4096字节)应该用作贮存少量的数据。到期的政策,可以设置的Cookie无效的项目在一定期限之后的时间。以下示例显示了如何的Cookie可以用来在一个asp.net应用程序:

if (this.Request.Cookies["MY_NAME"] == null)
{
    this.Response.Cookies.Add(new HttpCookie("MY_NAME",
                                       "Shubhabrata Mohanty"));
}
else
{
    this.Response.Write(this.Request.Cookies["MY_NAME"].Value);
}

的Viewstate
asp.net的Viewstate是一个新概念。这里的数据涉及到的页面和控制都存储在其中的ViewState保留价值的跨越多个请求到服务器。如果您没有记错的话,在VB的ASP应用程式,我们用于存储数据跨越多个请求使用隐藏字段。的ViewState ,其实是实施内部隐藏栏位,在asp.net ,但在这里的数据是虚线,以提高安全性作为对隐藏的领域。看看怎样的Viewstate实施,您可以查看来源网页,其中的ViewState是用来在网际网路浏览器。的Viewstate不应被用来存储大量的数据,因为它是通过向服务器对于每个请求。

protected void Page_Load(object sender, EventArgs e)
{
    if (this.ViewState["MY_NAME"] == null)
    {
        this.ViewState["MY_NAME"] = "Shubhabrata Mohanty";
    }
   
    //txtName is a TextBox control
    this.txtName.Text = this.ViewState["MY_NAME"].ToString();
}

隐藏栏位
隐藏栏位都非常受欢迎, VB的ASP的Web开发。隐藏栏位的是类似的任何其他控制在一个网页,但有形的状态,这是控制始终是假的。一样的Viewstate我们不应该用它来存储大量的数据。注:同样隐藏帧可以用来缓存数据在客户端。但请注意,隐藏帧不支持所有的互联网浏览器。

<!--In ASP.NET-->
<asp:HiddenField ID="myHiddenField" Value="Shubhabrata"
                                             runat="server" />
<!--In HTML-->
<input id="myHiddenField" type="hidden" value="Shubhabrata" />

Microsoft Internet Explorer的缓存
由于我谈论asp.net的话,为何不讨论另一个缓存的能力,从微软? Microsoft Internet Explorer中提供了缓存机制来缓存页面在客户端。这可以设置使用期满后的指令添加到标题的网页,或通过设置手动在IIS 。在IIS到HTTP标题标签的属性窗口的网页,然后选择启用内容过期复选框。我们应该使用这个选项来缓存静态页面和图像在客户端。

结论
希望我已清楚的解释了所有不同的选择。现在的时间要回去我们开始实施这些选项。在实施任何这些选项应该做的事,纯粹是在此基础上需要我们对应用的要求和适当的评论。

我希望更多的读者,提供宝贵的意见。

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1