<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
	<channel>
		<title>金麦网络</title>
		<link>http://www.kingmx.com</link>
		<copyright>Copyright (C) 2006 金麦网络-Kingmx.com All Rights Reserved.</copyright>
		<item>
			<title>经典入门教程：在ASP中使用SQL 语句</title>
			<link>http://www.kingmx.com/article.php?id=17754</link>
			<pubDate>2007-8-15</pubDate>
			<description><![CDATA[
五花八门的SQL产品多得要命，或许你早顾不得其它甩开袖子就动手干了。但你要同时采用ASP和SQL的话就可能会头晕。MySQL、SQL Server和mSQL都是绝佳的SQL工具，可惜，在ASP的环境下你却用不着它们来创建实用的SQL语句。不过，你可以利用自己掌握的Access知识以及相应的Access技能，再加上我们的提示和技巧，相信一定能成功地在你的ASP网页中加入SQL。
1. SELECT 语句

在SQL的世界里，最最基础的操作就是SELECT 语句了。在数据库工具下直接采用SQL的时候很多人都会熟悉下面的操作：
SELECT what
FROM whichTable
WHERE criteria
执行以上语句就会创建一个存放其结果的查询。
而在ASP页面文件上，你也可以采用以上的一般语法，不过情况稍微不同，ASP编程的时候，SELECT 语句的内容要作为字符串赋给一个变量： 
SQL = "SELECT what FROM whichTable WHERE criteria"
好了，明白了ASP下SQL“说话”的方式，接下来如法炮制即可，只要满足你的需要，传统的SQL查询模式和条件查询都能派用场。
举例说明，不妨假设你的数据库内有个数据表，名字是Products ，现在你想取出这个表里的全部记录。然后你就编写了下面的代码： 
SQL ="SELECT * FROM Products"
以上代码——SQL语句的作用就是取出表内的全部数据——执行后将会选出数据表内的全部记录。不过，要是只想从表内取出某个特定列，比如p_name。那就不能用 * 通配符了，这里得键入具体某列的名字，代码如下： 
SQL ="SELECT p_name FROM Products"
执行以上查询之后Products 表内、p_name 列的内容就会全被选取出来。
2. 用WHERE子句设置查询条件

有的时候取出全部数据库记录也许正好满足你的要求，不过，在大多数情况下我们通常只需得到部分记录。这样一来该如何设计查询呢？当然会更费点脑筋了，何况本文也存心不想让你去用那个什么劳什子的recordset。
举个例子，假如你只打算取出p_name 记录，而且这些记录的名字必须以字母w打头，那么你就要用到下面的WHERE 子句了：
SQL ="SELECT p_name FROM Products WHERE p_name LIKE 'W%'"
WHERE 关键词的后面跟着用来过滤数据的条件，有了这些条件的帮助，只有满足一定标准的数据才会被查询出来。在以上的例子里，查询的结果只会得到名字以w 打头的p_name 记录。
以上例子中，百分比符号（%）的含义是指示查询返回所有w 字母打头而且后面是任何数据甚至没有数据的记录条目。所以，在执行以上查询的时候， west 和 willow 就会从Products 表内被选取出来并存放在查询里。
就像你看到的那样，只要仔细地设计SELECT 语句，你就可以限制recordset 中返回的信息量，多琢磨琢磨总能满足你的要求。
这些啊还不过是掌握SQL用途刚起步。为了帮助你逐步掌握复杂的SELECT 语句用法，下面就让我们再来看一下关键的标准术语：比较运算符，这些玩意都是你在构筑自己的SELECT 字符串来获得特定数据时要经常用到的。
WHERE子句基础
在开始创建WHERE 子句的时候，最简单的方式是采用标准的比较符号，它们是 < 、  、 >= 、 和 =。显然，你很快就能明白以下代码的含义和具体运行结果：
SELECT * FROM Products WHERE p_price >= 199.95
SELECT * FROM Products WHERE p_price  19.95
SELECT * FROM Products WHERE p_version = '4'

注意： 这里你会注意到，最后一个例句中的数字4周围加了单引号。原因是这样的，在这个例子中的 '4' 是文本类型而非数字类型。因为你会把 SELECT 语句放到引号中来把它作为一个值赋给变量，所以你也可以在语句中采用引号。
比较运算符
比较运算符指定从表内取出数据的内容范围。你可以用它们来创建过滤器以便缩小recordset的范围，促使其只保存给定任务下你关心的信息。
3. LIKE 、 NOT LIKE和 BETWEEN

你已经在上面取出w打头记录的例子中看到了LIKE的用法。LIKE判定词是一个非常有用的符号。不过，在很多情况下用了它可能会带给你太多的数据，所以在用到它之前最好先开动脑筋多想想自己到底想获得什么数据。假设你想取出5位数字的SKU号码，而且其开头是1结尾是5，那么你可以用下划符（_）代替%符号：
SQL = "SELECT * FROM Products WHERE p_sku LIKE '1___5'"
下划符表示任意一个字符。所以在输入“1 _ _ _ 5”的情况下，你的搜索就会限制在满足特定模式的5位数范围内了。
假如你想反其道而行之，要找出所有不匹配“1_ _ _ 5”模式的SKU条目。那么你只需要在刚才语句例子中的LIKE前面加上NOT就可以了。
BETWEEN
假设你想取出一定范围内的数据，而且你事先知道范围的起点和终点，那么你不妨采用BETWEEN 判断词。现在就让我们假设你想选取给定表内范围在 1和 10之间的记录。你可以如下使用BETWEEN：
…WHERE ID BETWEEN 1 AND 10
或者你也可以采用已经熟悉的数学判断字句：
…WHERE ID >= 1 AND ID >= 10
4. 联合语句

我们到目前为止所谈到的SQL语句相对较为简单，如果再能通过标准的recordset循环查询，那么这些语句也能满足一些更复杂的要求。不过，何必非要拘泥在浅尝则止的基础水准之上呢？你完全可以再增加其他一些符号，比如AND、 OR和NOT来完成更强大的功能。
以下面的SQL语句为例：
SQL ="SELECT c_firstname, c_lastname, c_email FROM customers WHERE c_email IS
NOT NULL AND c_purchase = '1' OR c_purchase = '2' AND c_lastname LIKE
'A%'"
就你目前所掌握的SQL知识，以上的例子也不难解释，不过上面的语句并没有很明白地让你看清条件字句是如何胶合在单一SQL语句中的。
[page]
多行语句
在SQL语句不好懂的情况下，你不妨把整个语句分解为多行代码，然后在现有变量基础上逐步增加查询语句的各个组成部分并把它存在同一变量内： 
    SQL = "SELECT c_firstname, c_lastname, c_emailaddress, c_phone"
    SQL = SQL ]]></description>
		</item>
		<item>
			<title>ASP.NET多频道网站架构实现方法</title>
			<link>http://www.kingmx.com/article.php?id=17753</link>
			<pubDate>2007-8-15</pubDate>
			<description><![CDATA[
　　主体架构 
　　各频道分别位于不同的Web Project(具有独立的二级域名)，并将所有的业务逻辑以及数据访问功能封装成Class Library，所有频道共用这个Class Library。
　　下面详细介绍实现方法。
　　假设网站有三个频道，新闻、论坛以及博客，对应的二级域名为"news"、"forum"、"blog"。除此之外，还需要另外定义两个域名，分别用于网站首页以及用户注册、登陆功能(基于Passport机制，本文后面将作详细介绍)，对应域名为"homepage"、"passport"。
　　1.配置各频道URL
　　a.配置hosts文件
　　用文本编辑器打开hosts文件(位于c:\windows或winnt\system32\drivers\etc\)，该文件中存放初始的域名解析信息。当我们在浏览器中请求某个URL时，系统首先在hosts文件中查找相应域名，如果找到则跳转至指定IP,如果没找到，则进一步提交DNS进行域名解析。
　　配置很简单，格式形如"[IP][空格][域名]"，每条数据对应一行。下面为配置内容：
　　192.168.1.2 www.mysite.com
　　192.168.1.2 passport.mysite.com
　　192.168.1.3 news.mysite.com
　　192.168.1.5 forum.mysite.com
　　192.168.1.9 blog.mysite.com
　　你可能已经注意到了，各频道对应于不同的IP，这正是该架构的开发灵活性所在。各频道(Web Project)可以创建于不同的开发者电脑。通过将配置内容同步到各台电脑，可以方便的在各频道间进行页面浏览，就像这些频道位于你自己的电脑一样!采用这种方式可以极大降低开发耦合性，每个频道都是一个独立的模块，一个频道中的Bug不会影响到另一个频道。
　　b.配置Web.Config
　　考虑到各频道二级域名有可能进行调整，将相应配置信息存放于Web.Config文件是一个好办法。同样的，该配置信息必须同步到各Web Project。下面为配置内容：

＜add key="SiteDomainName" value="mysite.com"/＞
＜add key="HomepageSiteURL" value="http://www.mysite.com/homepage/"/＞
＜add key="PassportSiteURL" value="http://passport.mysite.com/passport/"/＞
＜add key="NewsSiteURL" value="http://news.mysite.com/news/"/＞
＜add key="ForumSiteURL" value="http://forum.mysite.com/forum/"/＞
＜add key="BlogSiteURL" value="http://blog.mysite.com/blog/"/＞
＜add key="LocalSiteURL" value="/blog/"/＞

　　各配置项说明如下
　　SiteDomainName:站点域名，形如"mysite.com"、"mysite.com.cn"、"mysite.net"等。该配置项的使用方法将在后文介绍。
　　LocalSiteURL:当前频道根路径，也就是Web Project所在网站或虚拟目录的路径，以"/"开头。该配置项主要用于频道内部的引用，比如图片引用、页面链接等。
　　其余配置项:用于频道间的引用，比如频道导航、功能调用等。
　　2.创建Model部件
　　在MVC模式组成中，Model部件包括所有的业务逻辑操作，其中也包含数据访问操作。
　　本方案将Model部件拆分成对象实体、对象操作以及数据访问三部分，封装成三个Class Library。
　　由于Class Library设计本身就是一个很大的话题，本文就不再祥述了，有兴趣的话可以参考一些相关资料。
[page]
　　经验分享：
　　上述的Model部件拆分方式适用于业务功能比较复杂的大型项目，要求团队内部有着明确、细化的分工合作。但如?????? ?o㧟?果面对的是中小型项目，该方式很有可能成为开发效率的瓶颈。这主要是由项目特点决定的，中小型项目业务功能相比大型项目没有那么复杂，开发人员数量也比较有限，往往一个人要负责整个模块的开发。在这种情况下，架构层次过于繁多，每次修改一个层时，其他相关层也得跟着同步修改，这样反而影响了开发效率。
　　3.实现Passport机制
　　很多网站都采用Session来存放个人信息，比如登录信息，并以次作为用户登录与否的判断依据。但Session有一个缺陷，就是无法在多个Web应用中共享，一个Web应用生成的Session只能由他自己使用。哪种方法可以在多个Web应用中实现数据共享呢?答案是Cookie。Cookie将信息存放于客户端, 并在需要时发送回服务器端。
　　Passport，即通行证，是目前普遍采用的一种用户身份认证机制，简单来说就是一次登录，全站通行。这也正是我们的要求。
　　这里讨论的通行证机制基于Cookie，实现也比较方便。其中的关键点是Cookie的Domain属性设置，Domain属性表示Cookie信息回发的目标域，也就是接收Cookie的域，接收Cookie的域必须与发送Cookie的域一致，否则无效。比如：发送域为"blog.mysite.com"，则接收域可以设为"blog.mysite.com"或"mysite.com",而"news.mysite.com"和"blog.yoursite.com"为无效接收域。要想让所有频道都能接收到Cookie，必须将Domain属性设置为不带二级域名前缀的形式，如"mysite.com"、"mysite.com.cn"、"mysite.net"等。
　　登录成功后向客户端发送相应Cookie，其中可以包括一些全局信息，比如用户编号、用户名等。用户退出时删除相应Cookie，特别要注意的是，删除Cookie时也要设置正确的Domain属性。
　　关于该Passport机制，还有两个问题值得讨论：
　　a.Cookie的过期时间
　　有两种方案可以采用，一种是默认方式，即不设置Cookie的Expires属性,采用这种方案时，Cookie存放于内存中，在浏览器关闭前Cookie将一直存在，也就是一直处于登录状态。这种方式主要用于对信息安全要求不是很高的网站，比如娱乐休闲类网站;另一种是指定明确的过期时间，一般情况下会将用户最后一次访问网站的时间加上一个超时时间段作为过期时间，有点类似于asp中的session超时机制,这种方式主要用于对安全性要求比较高的网站，比如网上银行、电子邮箱等。
　　b.Cookie的信息安全
　　由于Cookie是以明文方式传递数据，不可避免的存在安全隐患，因此对重要数据的加密是非常有必要的。加密可以采用可逆算法，比如DES。
　　4.创建Web Project
　　前文已提过，Web Project的创建比较灵活，既可以创建于不同的开发者电脑，也可以创建于同一台电脑。这主要取决于开发团队规模。
　　5.部署
　　分别部署各频道，设置二级域名，将Web.Config中的相关配置改为生产环境的实际数据。
　　其中比较繁复的工作就是各频道中相同部分的部署，比如说网站头部(Logo、导航栏等)，网站底部(版权声明、联系方式等)，图片，CSS，JavaScript等。当然也可以把这些公用资源单独部署于一个频道中，以供其他频道调用，但这样做就破坏了各频道松耦合的特性，如果用于存放公用资源的频道出了问题，那其余频道也将无法正常使用。
　　结束
　　本文讨论了asp.net中多频道网站架构的一种实现方法，由于涉及到的内容较多，无法一一展开，但对其中的重点部分还是多加了点笔墨，希望对你有用:-)
]]></description>
		</item>
		<item>
			<title>ASP.NET技巧：DataGrid传统分页方式</title>
			<link>http://www.kingmx.com/article.php?id=17752</link>
			<pubDate>2007-8-15</pubDate>
			<description><![CDATA[
此分页方式与传统ASP分页方式相仿.
DataGridPage.aspx



 
  DataGridPage
  
  
  
  
 
 
  
   
    
    
    
   
  
  
   
    
     
      
       
        
         

        
        
         

        
       
      
     
    
   
  
 

DataGridPage.aspx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace netCRM
{
 /// 
 /// DataGridPage 的摘要说明。
 /// 
 public class DataGridPage : System.Web.UI.Page
 {
  protected System.Web.UI.WebControls.Literal Literal1;
  protected System.Web.UI.WebControls.Literal Literal2;
  protected System.Web.UI.WebControls.DataGrid DataGrid1;
  private void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放置用户代码以初始化页面
   if(!IsPostBack)
   {
    BindGrid();
   }
  }
  private void BindGrid()
  {
   string connstring = "Server=.;Database=NorthWind;User Id=sa;Password=;";
   string sql="Select * from Orders";
   SqlConnection conn = new  SqlConnection(connstring);
   conn.Open();
   DataSet ds = new DataSet();
   SqlDataAdapter sqlAdapter = new SqlDataAdapter(sql,conn);
   sqlAdapter.Fill(ds,"users");
   DataView dataview = new DataView();
   dataview = ds.Tables[0].DefaultView;
   DataGrid1.DataSource = ds.Tables[0].DefaultView;
   DataGrid1.DataBind();
   string cPage;
   int pageSize = 10;
   int currentPage;
   int pageCount;
   int numResults = 0;
   if (Request.QueryString["page"]==null)
   {
    cPage="1";
   }
   else
   {
    cPage=Request.QueryString["page"].ToString();
   }
   try
   {
    currentPage = Int32.Parse(cPage);
   }
   catch
   {
    currentPage = 1;
   }
   numResults = 0;
   int start = (int)((currentPage - 1) * pageSize);
   int to = (int)(currentPage * pageSize);
   if (start 0)
   {
    pageCount  ;
   }
   if(currentPage>pageCount || currentPage]]></description>
		</item>
		<item>
			<title>DVBBS论坛防止注册机发垃圾贴的办法</title>
			<link>http://www.kingmx.com/article.php?id=17751</link>
			<pubDate>2007-8-15</pubDate>
			<description><![CDATA[
进入后台，风格界面模板总管理，page_login,template.html(13) 

密码问题：
忘记密码的提示问题
 
在此两句上面添加如下代码 

反论坛群发必填项:
为了防止群发软件的恶意注册，
请回答以下问题
{$EvilQuesion}
 

2. 打开reg.asp，找到
]]></description>
		</item>
		<item>
			<title>简单ASP教程：关于AJAX一个的例子</title>
			<link>http://www.kingmx.com/article.php?id=17750</link>
			<pubDate>2007-8-15</pubDate>
			<description><![CDATA[
ASP教程：关于AJAX一个简单的例子
Index.asp：
程序代码



AJAX简单应用



此处显示新 Div 标签的内容


Info.asp：
程序代码

说明：AJAX对服务器返回的结果没有格式上的要求，只需将结果用"Response.write"输出即可。
]]></description>
		</item>
		<item>
			<title>针对构架师的.NET 3.0介绍</title>
			<link>http://www.kingmx.com/article.php?id=17714</link>
			<pubDate>2007-8-10</pubDate>
			<description><![CDATA[
　　微软.NET的最新版本，.NET Framework 3.0，为开发下一代业务解决方案软件系统开启了新的可能。它的设计目标是：提高生产力，降低基础设施复杂性，提供一个一致的元系统，让企业级服务、工作流解决方案和用户体验软件系统的开发更容易。
　　在我和大量的构架师讨论的过程中，我听到解决方案构架师非常关心安全、开放的标准、互操作性、面向服务的构架、关键技术间的关系（例如Workflow Foundation和Biztalk）和生产力。在这篇文章当中，我将按照构架师社区最感兴趣的领域来逐一介绍.NET 3.0。
.NET的相关版本

　　自从微软推出第一个版本的.NET Framework，已经过去差不多6年了。3.0 是第一个随操作系统发布的框架，它附带在每个Windows Vista中，也可以支持Windows XP SP2 和 Windows Server 2003。直到.NET 3.0，以前的每个版本的.NET Framework都会伴随着一个新的通用语言运行时（Common Language Runtime），后面将简称为CLR。但这次，微软没有修改.NET Framework 3.0 版本中的CLR（译者注：而是基于.NET 2.0的CLR），这一点需要重点注意。 
 
　　由于.NET 2.0和3.0共享同样的CLR，在.NET 2.0中编写的任何程序都可以运行于.NET 3.0中，这是和以前版本的一个重要而显著的区别。以改变来看，对于那些喜欢代数方程的人来说，它们之间的关系可以总结为下面的公式： 
.NET 3.0 = .NET 2.0   WCF   WPF   WCS   WF 
　　我会为每个缩写提供一个定义，不过当你任何时候对.NET 2.0和3.0之间的关系感到困惑时，只要记住上面的这个方程式就好了。.NET 3.0其后的哲学之一就是提供一些功能让“基础设施结构”成为框架的一部分。它让你可以只关注你的关键的业务问题。 
　　.NET Framework 3.0通过4个关键的、以标准为基础的支柱来对应我们客户要求和验证的领域，以达成上述目标。它也包含了一个重要的叫做XAML的新语言。XAML是一个基于XML的声明性语言，通过XML定义对象和它们的属性，允许客户声明性地开发工作流（WF）和身临其境的用户体验（WPF）。让我们来浏览一下.NET 3.0框架中关键支柱的更详细内容。 
Windows Communication Foundation (WCF) 
　　WCF允许你通过提供一个基于标准的框架和一个组合的架构来构建服务。WCF的3个关键设计理念是互操作性、生产力和面向服务的开发。
 
 
[page]
　　微软提供了若干个可以轻易添加和删除的消息层通道和服务模型层行为。你也可以定义自己的自定义实例，比如你能编写或者购买一个自定义ASCII编码器，把它作为可重用通道插入到消息层中，让多个系统都能使用。WCF可以和现有的投资互操作，并结合和扩展现存的微软分布式系统技术，如：Enterprise Services、System.Messaging、Microsoft .NET Remoting、ASMX和Web Services Extensions (WSE)。这样的改变预示着，你能使用单一的模型来处理不同类型的应用程序行为，这将显著降低应用程序开发的复杂性。通过支持WS-I 基本概要（WS-I Basic Profile）和大量的额外WS-*标准，WCF也提供和非微软应用程序的互操作能力。 
　　最后，从生产力来看，使用WCF来开发安全的事务性网络服务，你将获得生产力在级别上的显著提高。想想看，要实现类似WCF的功能你需要开发、生成和维护上万行代码，而现在WCF却已经作为基础框架的一部分提供给你了。WCF已经为你提供了一个首要的核心编程框架，以应付逐步增长的面向服务的开发。
Windows Workflow (WF) 
 
　　Workflow Foundation是一个企业级工作流开发框架和引擎，它首次把声明性工作流引向主流。WF支持有人参与的（Human）、系统的（System）、连续的（Sequential ）和状态机（State-Machine）工作流。它提供了运行时基础、灵活的工作流控制机制、长时间运行和状态化工作流、对用户而言运行时和设计时的透明性，以及用于规则遵从和记录管理过程的审核能力。 
　　Workflow Foundation允许你把一个工作流定义为一系列的活动。活动即是执行的单元，并被允许轻易地进行重用和组合。基本活动是在一个工作流里面的一些步骤，而组合活动可以包含其他活动。你甚至可以在工作流已经处于运行过程中时添加和删除活动，这将使你在面对改变的时候具有巨大的灵活性。Workflow Foundation提供了一个开箱即用的基础活动库，以及一个让合作伙伴和客户容易创建自定义活动的框架。 
　　在创建方式的选择方面，你可以用纯XAML标记、标记加代码或者纯代码。Visual Studio 2005 Designer for Workflow Foundation作为一个插件程序已经可以下载了，它提供了一个拖拽方式（drag-and-drop ）的设计界面、直观的图形工具、并集成了属性（Properties）窗口、调试和图形注释功能。 
 
　　许多构架师曾向我询问关于Workflow Foundation、Biztalk、Microsoft Office SharePoint Server 2007(MOSS 2007)和Windows SharePoint Services (WSS)之间关系的问题。 
　　Workflow Foundation(WF)，是由微软开发Biztalk工作流引擎的同一个团队开发的，它倾向于被未来版本的Biztalk Server使用。 
　　WF提供了一个基础，用于实现在一个应用程序和在特定的情况下多个应用程序间的大部分工作流场景。Biztalk允许你自动化你的业务过程，通过适配器来编排由不同技术实现的系统所混合而成的过程，并提供了高级的业务活动监控能力。 
　　对于MOSS 2007和WSS，MOSS 2007构建于WF之上并使用WF作为基础功能提供了额外的功能和特性。Windows SharePoint Services作为Windows Server的添加项提供了一个MOSS 2007的功能子集。简言之，WSS提供了简单的文档管理和工作流能力。 
 
[page]
Windows Presentation Foundation (WPF) 
　　Windows Presentation Foundation试图弥合在游戏和娱乐产业中常见的身临其境的用户体验和在业务软件世界中静态又难用的界面之间的差距。WPF利用XAML让你无需成为图形设计师就能尽情地开发下一代界面。 
　　我建议你去看一个WPF应用程序的演示，来理解我指的下一代用户界面是什么意思。例如，你可以查看一下收藏于不列颠图书馆里面的15大最珍贵图书，其中包括了莫扎特和达芬奇的手稿。这个阅读器是一个基于WPF的应用程序，运行在Internet Explorer浏览器中，就是指所谓的XBAP（可扩展浏览器应用程序）——这是一个用于代替浏览器中的ActiveX功能的技术。WPF的重要不同之处是，它不是一个最终产品，或者一个美妙的丰富界面，而是一种开发和维护应用程序代码的方式。 
　　从构架的角度看，WPF通过分离图形元素和业务逻辑来保持一个非常清晰的划分。一个设计师可以使用Expression产品线和XAML来创建视图，而开发人员可以使用Visual Studio和VB.NET或C#来编写代码。 
　　近来另外一个需要更多关注的技术是WPF Everywhere（WPF/E），它现在的官方名字叫SilverLight。请记住，SilverLight不是.NET 3.0框架的一部分。SilverLight是一个具有自己运行时的跨浏览器、跨平台的插件，它用于开发下一代微软基于.NET的多媒体程序和丰富交互的Web应用程序。你能在http://www.microsoft.com/silverlight中找到更多信息并观看一些演示。 
Windows Card Spaces (WCS) 
　　在今天的世界中，每个人都携带着大量的自我声明和第三方颁发的身份标识。身份标识的例子包括驾驶证、信用卡、电影卡和其他类似的卡。 
　　我们把这些由自己控制的信息提供给请求方来证明我们的身份。Windows Card Spaces把用户控制的这个概念扩展到了数字世界。WCS创建了一个身份标识元系统，能显著改善在组织内部和组织之间的企业身份管理的方式。为了理解它的潜力，一位微软著名的评论家指出“这是自加密技术出现以来对计算机安全最重要的贡献之一”。 
　　在数字世界，身份标识被表述为对象（谁）、身份要求和安全令牌（对象和要求的数字表示）。WCS使用自我声明和托管两种概念的身份标识，一个自我声明的数字身份标识卡可以用于登陆类似Hotmail这样的服务，而托管的身份标识可能是一个由银行颁发的信用卡。 
　　下面的图片描述了被用于在不同的实体当中交换信息的协议。请记住在这个例子当中，身份提供者能使用Kerberos、X509或一个自定义的机制。类似的，中转方可以用SAML或者使用HTTPS post来发送安全令牌。 
　　WCS为不同的身份标识管理技术实现提供了一个总体的框架，以让它们共同工作。在Java One（世界上最大的Java会议）上，Sun和微软做了一个联合主题，演示了基于WS-*标准的互操作机制。我会把这个演示的链接和工具包贴到我在此文结束时提到的博客中。
 
结论

　　.NET 3.0 Framework为构架师和开发人员开启了一个具有无限可能的新世界。它旨在让你开发、集成和维护应用程序更加容易。微软计划在.NET Framework未来的版本中继续推行这样的理念，来降低基础设施结构复杂性，并同时提高互操作性和标准支持。关于支持标准的完整列表和本文中描述的各个主题的详细资源，可以访问http://blogs.msdn.com/mohammadakif和点击.NET 3.0分类来获取。
]]></description>
		</item>
		<item>
			<title>透彻掌握ASP分页技术</title>
			<link>http://www.kingmx.com/article.php?id=17713</link>
			<pubDate>2007-8-10</pubDate>
			<description><![CDATA[
近段时间看了一些论坛上面关于分页的ASP程序依然有许多的关注者，但里面只有代码，没有详细的解释，对于初学者来说，这样总是得不到真正的掌握，此次我将针对分页技术进行详解，让大家来理解ASP分页，好了，一起来对分页程序来次透彻的了解吧！
首先，来看看演示 ！

看看功能：分页程序首先读取每页预置的记录条数，在此是5条，其它将在下页中显示，同时提示当前页数、总页数、总记录数，当显示的页数为第一页时，“首页”、“上一页”链接失效，当显示的页数为最后页时，“下一页”、“尾页”链接失效。
接下来，以实例的方式告诉大家怎么一步步的做出这种分页效果。
首先，数据库中字段record_info存在于info表中（实例下载中有数据库），先链接数据库并将一个记录集打开，以下代码：
]]></description>
		</item>
		<item>
			<title>介绍如何使用SqlPager分页控件</title>
			<link>http://www.kingmx.com/article.php?id=17707</link>
			<pubDate>2007-8-9</pubDate>
			<description><![CDATA[
　　SqlPager分页控件是一个多功能灵活的分页控件，原理是利用了PagedDataSource()数据源进行分页处理，现此控件已集成于Winson.Framework框架里（以下简称WF），同时也使用了WF框架里的数据库低层操作语句，因此同时也可以支持多种数据库 
   
　　  一、主要功能： 
  1、支持AJAX分页，也可设置后台Post模式 
  2、支持多种分页按钮样式，同时也可以自定义按钮样式 
  3、支持一次性读取所有数据，或者只读取当前页面数据进行分页 
  4、可对GridView、Repeater、BaseDataList、ListControl等数据源控件进行绑定处理 
  5、支持直接在页面写SQL语句读取数据，或者在后台设置自定义数据源进行绑定 
  6、可对分页数据指定排序字段 
  7、完全开源，可灵活修改，呵呵 
   
   
　　  二、基本使用： 
  1、新在页面顶部插入以下代码： 

 

  2、在需要放置分页控件的地方，插入以下代码：

   

 
   基本参数说明： 
  ID：即本分页控件的自身ID 
  ControlToPaginate：分页控件需绑定的数据源控件的ID，本例中数据源控件为GridView 
  BorderStyle：分页控件边框样式，本例中为虚线 
  PagerStyle：即分页按钮的样式，此为一个枚举参数，同时也是设置是否使用AJAX的参数，以下将会有详细说明 
  PagingMode：是否使用Cached，如果使用NonCached则只读取对当前页面数据，如为Cached，则一次性读取所有数据然后进行分页，建议数据量少时使用NonCached，但如果想与Tab控件配合使用，则必须要使用Cached模式 
   
 以下为分页按钮的自定义样式，只有当PagerStyle设置为自定义样式时才生效 
  FirstButton：第一页的按钮样式 
  PrveButton：上一页的按钮样式 
  NextButton：下一页的按钮样式 
  LastButton：最后一页的按钮样式 
   
   
  3、以上代码配置好后，即可在后台为分页控件设置数据源，当然在前台也可以直接用参数设置 
   
  设置数据源有2种方式，一种是直接在前台使用SelectCommand参数进行设置，如将以下语句直接加到控件标签里 
   
   
  另一种方式是可以使用自定义的数据源，如DataSet，但在使用自定义数据源之前，需将参数UseCustomDataSource设置为true，如下代码： 
   
  SqlPager1.UseCustomDataSource = true; 
   SqlPager1.CustomDataSource = DBOP.ExecuteDataset("select * from Employees ", "ds"); 
   SqlPager1.DataBind(); 
  以上方式只能在后台执行。需要注意的是，不管哪种方式，最后都必须在后台调用DataBind()方法。 
   
　　  三、高级应用 
   
 　　 1、使用AJAX分页： 
   　　本控件支持AJAX分页，但还必须写一些客户端的代码，相关的客户端代码我已在DEMO里有啦，具体可以打开PagerDemo.aspx文件查看，在需要分页的页面上添加以下JS代码： 

  function setPageTo(pageIndex) 
   { 
   var context=document.getElementById("listDIV"); 
   context.innerHTML="数据加载中"; 
   var arg=pageIndex; 
   ; 
   } 
   
   function onCallServerComplete(result,context) 
   { 
   context.innerHTML=result; 
   } 

[page]
     然后在后台添加相应的AJAX方法，建议使用我DEMO里的方式，将这些代码添加到一个基类页面里，然后各页面继承来用，请看我的BasePage.cs文件，即以下代码： 
   
  Ajax分页处理#region Ajax分页处理 

   //引发回调事件处理 
   public void RaiseCallbackEvent(string eventArgument) 
   { 
   serverReturn = eventArgument; 
   } 
   
   //回传回调结果 
   public string GetCallbackResult() 
   { 
   return PageChange(serverReturn); 
   } 
   /**//**//**////  
   /// 执行分页操作 
   ///  
   /// 
新页面的索引
 
   /// 需显示的页面数据 
   private string PageChange(string newIndex) 
   { 
   int newPageIndex = int.Parse(newIndex); 
   SqlPagerBase.GoToPage(newPageIndex); 
   return GetRenderCode(); 
   } 
   
   /**//**//**////  
   /// 将读取的数据呈现在客户端 
   ///  
   ///  
   private string GetRenderCode() 
   { 
   StringWriter writer1 = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); 
   HtmlTextWriter writer2 = new HtmlTextWriter(writer1); 
   
   if (GridViewBase != null) 
   { 
   GridViewBase.Visible = true; 
   GridViewBase.RenderControl(writer2); 
   } 
   else if (RepeaterBase != null) 
   { 
   RepeaterBase.Visible = true; 
   RepeaterBase.RenderControl(writer2); 
   } 
   else if (DataListBase != null) 
   { 
   DataListBase.Visible = true; 
   DataListBase.RenderControl(writer2); 
   } 
   else if (ListBase != null) 
   { 
   ListBase.Visible = true; 
   ListBase.RenderControl(writer2); 
   } 
   SqlPagerBase.RenderControl(writer2); 
   writer2.Flush(); 
   writer2.Close(); 
   return writer1.ToString(); 
   } 
   #endregion 

[page]
  注意，如果你要将以上代码放到独立页面，必须要先继承System.Web.UI.ICallbackEventHandler接口！ 
   
  编写完以上代码后，再需将SqlPager里的PagerStyle属性设置为以Ajax开头的类型，以下是PagerStyle属性各参数的说明： 


   **/**/////  
   /// 页面样式设置 
   ///  
   public enum PagerStyle 
   { 
   /**//**//**////  
   /// 按钮样式为上下页箭头 
   ///  
   NextPrev, 
   /**//**//**////  
   /// 按钮样式来下拉框页码 
   ///  
   NumericPages, 
   /**//**//**////  
   /// 按钮和下拉框页码一起显示 
   ///  
   NextAndNumeric, 
   /**//**//**////  
   /// 自定义样式，可自定文本 
   ///  
   CustomStyle, 
   /**//**//**////  
   /// 自定义样式，可自定文本，同时显示下拉页码 
   ///  
   CustomAndNumeric, 
   /**//**//**////  
   /// 无刷新箭头式按钮 
   ///  
   AjaxNext, 
   /**//**//**////  
   /// 无刷新箭头式按钮加下拉页码 
   ///  
   AjaxNextAndNum, 
   /**//**//**////  
   /// 无刷新下拉框按钮 
   ///  
   AjaxNumeric, 
   /**//**//**////  
   /// 自定义无刷新分页 
   ///  
   AjaxCustomPages, 
   /**//**//**////  
   /// 自定义无刷新和下拉框页码 
   ///  
   AjaxCustomAndNumeric 
   } 

   　　  2、配合TabControls使用： 
  　　 TabControls控件是从Discuz!DNT论坛里抽取出来的，感觉效果挺好，呵，就是类似一个Tab的效果，可以相互切换各自内容，而且此控件里可放任何其他控件或者代码，只是如果放其他的数据源控件，会有些问题，子控件的一些事件会触发不了，具体我也不知道什么原因：（ 
   
  　 同样，当时将此分页控件加到Tab里时，也出现了不少问题，不过现在已修复好这些问题了，但如需与Tab配合使用，现也只能使用AJAX模式！ 
   
   　　如需在Tab下使用SqlPager控件，只需设置以下2个参数后即可以了 
   
  UseTabPager="true" 
  PagingMode="NonCached" 
  至于其他更多参数设置，请自行查看WF类库文档，均有说明了 
   
  WF框架下载： 
  http://bbs.szblogs.com/showtopic-137.html 
]]></description>
		</item>
		<item>
			<title>详细介绍ASP.NET状态保存方法</title>
			<link>http://www.kingmx.com/article.php?id=17708</link>
			<pubDate>2007-8-9</pubDate>
			<description><![CDATA[
ASP.NET状态保存分为客户端保存和服务器端保存两种：
使用客户端选项存储页信息而不使用服务器资源的这些选项往往具有最低的安全性但具有最快 的服务器性能，因为对服务器资源的要求是适度的。但是，由于必须将信息发送到客户端来进行存储，因此对于以这种方式可以存储多少信息存在一定的客观限制。
客户端保存的方式一般有如下4种：
1 ViewState: 
利用场合为：在对同一页的多个请求间自动保留值，多用于客户端的一些事件。，典型利用场合为：页面信息重置， 登陆出错次数统计，Grid列排序等。
优点：不利用服务器端资源，实现简单，相对高的安全性：因为经过哈希计算和压缩，并且针对 Unicode 实现进行编码。
缺点：因为ViewState存储在页面本身，所以无法存储较大的值。并且通过源文件可以看见其中的值 ，虽然经过哈希计算和压缩，但仍有被篡改的风险。
可存储的类型：string,integer,bool,array,arr aylist,hashtable以及其他可以序列化的类型。 
2 HiddenField: 
利用场合为：存储少量页面 中经常改动的信息，多和客户端脚本一块使用，典型利用场合为：客户端经历一系列验证之后向服务器端回发，服务器端从客户端HiddenField中获取值，进行处理。例如 ：LeyserHomepage中，要删除一项产品，需要在客户端弹出确认Form，用户确认之后再PostBac k回服务器端进行数据库Delete操作，当用户确认要删除时，将当前要删除的产品ID存放到一个HiddenField中，然后执行 Form(0).submit回发到服务器端，服务器端再从HiddenField获取产品ID值，进行数据库操作。 
优点：不使用服务器资源 ，广泛支持，实现简单
缺点：安全性不高，因为它被包含在页面上进行发送，所以可以通过源文件看见他的内容。存储结构少，仅仅支持string,integer,bool,array,arraylis t等简单的数据结构。并且在其上只存放简单的单值，若要存放多值，需要额外编码。存储量少，因为它被存储在页面本身，所以 无法存储较大的值。而且大的数据量会受到防火墙和代理的阻止。 注意： 使用了HiddenField之后，需要回发到服务器进行 处理， 应该使用Http Post方法而不是Http Get方法(通过URL请求访问)
3 Cookie: 
利用场合为：存储少量页面中经常改动的信息，典型利用场合为：为登陆过的网站保存登陆用户名，为用户输入提供方便 ，还有在一些用户自定义项目上保存用户的个性化设置。
优点：不使用服务器资源，实现简单，可配置到期时间。
缺点：大小受到限制，一般浏览器支持的最大的Cookie 容量为4096字节。客户端用户可能会配置为拒绝Cookie。安全性：保存在客户端的信息可能会被恶意用户修改或者获取，所以不应该保存敏感信息。持久性：保存期限受到客户端的配置影响。
Cookie 通常用于 存取已知用户自定义内容的个性化情况。在大多数此类情况中，Cookie 是作为“标识”而不是“身份验证”，所以在 Cookie 中只存 储用户名、账户名或唯一用户 ID（例如 GUID）并使用它来访问站点的用户个性化结构是足够的了。 
4 QueryString: 
利用场合为： 将信息从一页传递给另一页的最简单的方法。
优点：不使用服务器资源，支持广泛，实现简单
缺点：安全性，因为直接在URL中暴露给用户 ，所以有被篡改的风险。容量有限，一般的浏览器都有255个字符的限制。只有在通过其 URL 请求页时查询字符串才是可行的选择。不能从已提交给服务器的页读取 查询字符串。 
视图状态:需要为将回发到自身的页存储少量信息。ViewState 属性的使用将提供具有基本安全性的功能。 
隐藏域：需要为将回发到自身或另一页的页存储少量信息，并且不需要较高的安全性。 （客户端事件）只能在提交到服务器的页上使用隐藏域。 
Cookie：需要在客户端存储少量信息并且不需要较高的安全性。（个性化） 
查询字符串： 可以将少量信息从一页传输到另一页，并且不需要较高的安全性。 （页面跳转 ）只有在请求同一页，或通过链接请求另一页时，才能使用查询字符串。 
[page]
服务器端保存方式一般有如下3种：
存储页信息的服务器端选项往往比客 户端选项具有更高的安全性，但它们可能使用更多的 Web 服务器资源，这可能在信息存储量较大时导致可缩放性问题。
1 Application: 
利用场合：所有的请求都会需要的 一些共有资源，由最先的一个请求率先获取之后，拿出来共享，其他的请求就不用浪费资源进行再次获取。典型利用场合：一个股市 Web 站点可能在一天中每 5 分钟从数据库获取大量的金融股票信息（也许是 40 MB 的数据）， 然后将这些信息缓存在应用程序状态中，这样所有以后的查找请求都可以在应用程序状态中访问这些信息。其结果是极大地提高了每个 请求的性能，因为传入的请求不需要跨进程、跨计算机或数据库的往返过程。
'首次Http Get請求
If Not Me.IsPostBack Then
'先判断Application中是否已経有了緩存
If Application.Item("Database") Is Nothing Then
'若没有,从DataCenter中獲取
Dim ds As New DataSet
ds.ReadXml(Server.MapPath("TestData.xml"))
Dim dv As New DataView(ds.Tables(0))
'拿到之后, 緩存到Application,方便別的进程Http Get請求復用
Application.Add("DataBase", dv)
End If
Dim dv1 As DataView
dv1 = Application.Item("DataBase")
'緩存到Session, 方便当前进程的Http Post請求
Session.Add("DataBase", dv1)
End If
优点：易于实现，全局范围。
缺点：持久性，若 保存数据的服务器端进程被强行关闭，那么数据就会丢失，所以利用Application一定要有保底的策略，有的话就使用，没有的话就自己拿。耗用服务器端的内存。
注意：因为Application中的数据被多个进程公用，所以若需要更新其中的值时，需要利用 如下的语句，做到独占更新：
Application.Lock()
Application.Item("DataBase ") = NewDataBase
Application.UnLock()
2 Session: 
利用场合：单独的一个进程内部使用，存储单独会话的短期的、 敏感的数据。
优点：易于实现，持久性，可以应对IIS重启和辅助进程重启， 可在多进程中使用
缺点：耗用服务器端的内存。
3 Database: 
优点：安全性。 容量。 持久性。 可靠性和数据完整性。 可访问性。 广泛支持。
缺点：复杂，性能
方法 使用场合 
应用程序状态 存 储更改不频繁的全局信息，这些信息由多个用户使用，此时安全性不成为问题。不要在应用程序状态中存储大量的信息。 
会话状态 存储特定于单独会话的短期信息，并且需要较高的安全性。不要在会话状态中存储 大量的信息。在支持许多用户的应用程序中，这可能会占用大量服务器资源并影响可缩放性。 
数据库支持 存储大量信息，管理交易，或者信息必须可以经受得住应用程序和会话重新启动。数据挖掘十分重要，并且需要较高的安全性。
]]></description>
		</item>
		<item>
			<title>VB.NET实现窗体图标最小化到状态栏</title>
			<link>http://www.kingmx.com/article.php?id=17687</link>
			<pubDate>2007-8-8</pubDate>
			<description><![CDATA[
　　本文所使用的编程环境是Microsoft Visual Studio 2005，首先打开 Visual Studio。在文件 (File) 菜单上，单击新建项目 (New Project)。 在新建项目 (New Project) 对话框的模板 (Templates) 窗格中，单击 Windows 应用程序 (Windows Application)。单击确定 (OK)。
　　想要将窗体图标最小化时自动隐藏到任务栏，我们可以使用一个控件，这个控件的名字叫做NotifyIcon控件，打开左侧的工具箱找到NotifyIcon控件直接将它拖到窗体上。把NotifyIcon的Icon属性设一下，当然ICON属性你可以设置一个好看的图标。

　　将下来单击Form1窗体，进入属性设置把Form的WindowState设成Minimized;ShowInTaskbar属性设成False。图2

　　接下来我们就要输入代码了
　　在Form的Resize代码事件中，
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize 
　　If Me.WindowState = FormWindowState.Minimized Then 
　　Me.Hide() 
　　End If 
　　End Sub 
　　代码的意思是让窗体最小化的时候就自动隐藏到状态栏。
　　这样运行的时候窗体就会自动隐藏，出现在状态栏了。
　　想双击图标的时候显示窗体的话可以设置NotifyIcon控件的DoubleClick代码
　　代码如下：
Private Sub NotifyIcon1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick 
　　Me.ShowInTaskbar = True 
　　Me.Show() 
　　Me.WindowState = FormWindowState.Normal 
　　End Sub 
　　如果我们想创建右键菜单的话，我们可以在窗体上添加一个ContextMenustrip控件，用NotifyIcon的ContextMenu属性进行关联。在工具箱中选择菜单和工具栏，直接将ContextMenu控件拖到窗体上进入属性设置，输入相应菜单关键字(自己想输入的文字如下图的软件版本等)。

　　图3
　　然后单击窗体的NotifyIcon1控件，设置属性，在contextmenustrip处选择刚才编辑过的右键菜单ContextMenustrip1进行关联请看图4

　　然后按F5运行程序，点击窗体最小化按钮，窗体的图标自动隐藏到状态栏了。点击右键你可以看到精美的右键菜单。
]]></description>
		</item>
		<item>
			<title>简单掌握ASP的语法和变量</title>
			<link>http://www.kingmx.com/article.php?id=17650</link>
			<pubDate>2007-8-3</pubDate>
			<description><![CDATA[
        你不能通过浏览器上的“查看-源文件”选项来直接获取ASP的源代码，（因为ASP代码和脚本程序要事先在服务器上进行解读执行；随后，服务器再将ASP代码解读完毕之后的结果以“HTML数据流”的形式发送到浏览器），所以你看到的只是将ASP转化为HTML形式的内容，而不能直接获取ASP源代码。
        在我们的ASP教程中，每一个例子都会将ASP的源代码展示出来，这更有助于你理解ASP的工作原理。 
        一个ASP文件通常包含HTML标签，有时和一个HTML文件非常类似。然而，ASP文件（除了包含HTML标签外），还可以包括服务器的脚本程序，这些脚本程序必须写在“”界定符号（服务器读到这个界定符号就知道以下是ASP程序，“”表示ASP程序结束）之间。ASP的脚本程序在服务器端解读执行。这些脚本程序可以包括所有你想要用到的表达式、语句、程序和有效的运算符。
        将结果输出到浏览器




 
        下面这个例子和“Response.Write”指令的作用完全相同，是“Response.Write”指令的一种简化形式，它同样也会将“Hello World！”这段话发送到浏览器：




 
VBScript脚本
        你可以在书写ASP代码时使用一些脚本语句。ASP默认的脚本语句是“VBScript”：




 
        上述程序将会在网页中显示 "Hello World!"
        JavaScript脚本
        如果你需要使用“JavaScript”脚本作为默认的脚本语句来编写一些特殊的ASP网页，那么，你需要在网页的顶部插入一段语句来规定整个网页默认的脚本语句，具体如下：





 
        注意：我们前面所讲的“VBScript”脚本语句是一种对字母大小写不敏感的脚本语句，即：response.write / Response.Write / ReSpoNSe.WRiTe ，这些全部都是有效的；但是，如果你用“JavaScript”脚本语句书写ASP代码的话，你就要对字母的大小写加以区别，因为“JavaScript”脚本语句是一种对字母大小写敏感的脚本语句，即：Response.Write 是有效的，而response.write / ReSpoNSe.WRiTe 都是无效的语句。所以，各位朋友在书写时一定要特别注意。
        其他脚本语言
        ASP直接支持VBScript脚本程序和JScript（微软公司自己的JavaScript脚本执行程序）脚本程序。如果你需要使用到其他语言，比如说：PERL，PEXX或者Python，那么你就必须安装这些脚本程序的驱动引擎。
        重要提示：因为脚本程序都是在服务器端执行的，所以浏览器不需要安装脚本程序就可以对ASP文件进行显示。
        变量是用来存储需要的信息的
        如果你是在一个子程序（比如：VBScript中的sub，function）的外部声明变量的话，那么ASP文件里的所有脚本程序都可以对这个变量的值进行修改；如果你是在一个子程序的内部声明变量的话，那么，每次当这个子程序被执行的时候，这个变量的值都会随之建立或取消。
        变量存在的生命周期
        如果你是在一个子程序之外去声明变量的值，那么它的值可以被ASP文件中的所有脚本程序存取和改变。
        如果你是在一个子程序的内部声明变量的话，那么，每次当这个子程序被执行的时候，这个变量的值都会随之建立或取消；而在这个子程序之外的脚本程序则不能存取或改变这个变量的值。
        如果你想让声明的变量被多个ASP文件调用，那么你必须以Session变量或是Application变量的形式去声明这些变量的值。
        Session变量
        Session变量是用来存储一个单一用户的信息的，同一个应用程序所包含的所有页面都可以访问到它。我们经常在Session变量中存储姓名、id号以及喜好等常用信息。
        Application变量
        同样的，Application变量可以被同一个应用程序中所包含的所有页面访问到。Application变量通常被用来存储在特定请求下的所有用户的信息资料。
]]></description>
		</item>
		<item>
			<title>.Net环境下基于Ajax的MVC方案</title>
			<link>http://www.kingmx.com/article.php?id=17635</link>
			<pubDate>2007-8-1</pubDate>
			<description><![CDATA[
1、问题背景
　　现在，越来越多人开始尝试基于Ajax进行无刷新的Web开发，不过，在.Net环境下，应用Ajax并不是非常方便，这主要可能是由以下一些原因造成的：
　　·由于Ajax基于javascript的本质，使得开发者必须对javascript非常了解，起码，其javascript能力足以实现对callback返回内容对页面的更新，所以开发的门槛就有一定程度的上升
　　·当基于Ajax机制进行开发时，原有的基于postback方式下时，asp.net由后台逻辑代码(Model)，aspx页面(View)、aspx.cs(Controller)构成的MVC构架其实失效了，当callback返回数据时，要么在client端用javascript解析返回内容以实现更新，要么则必须在server端构造好比较完整的html代码，再直接由javascript将该构造好的html设置给某个页面对象，很显然，这样一来，要实现一个最简单的callback功能，都要不少代码，并且是相对比较乱的代码，即使在即将到来的asp.net2.0该问题依然不会得到有效解决
　　2、本文目的
　　本文旨在充分利于现有的asp.net本身的特点和ajax的特性，提出一个用于在asp.net环境下进行基于ajax的web开发的MVC方案，以实现以下主要目的：
　　·Asp.Net环境下用于Ajax的清晰的MVC构架
　　·降低编程人员对过多javascript编码的依赖以降低编程门槛
　　·灵活的支持ajax模式下的常用开发方式
　　3、问题分析
　　如何实现以上几个主要目的呢?
　　1)要对xmlhttprequest对更良好的封装，以使调用方式更简单;
　　2)尽量在server端进行更新数据的构造，但是也要避免每次返回数据都手工构造，因此，就想到可以充分使用UserControl，由UserControl作为"View"，对应的由ascx.cs文件作为"Controller"，这样构成的MVC也是比较清晰的;
　　4、问题解决 
　　基于以上思想，本人实现了以下一个组类库以简化该过程：
　　代码简析：
　　1)首先在client端，AjaxHelper.js封装了xmlhttprequest，并提供一个将现有的
　　序列化为形如param1=v1]]></description>
		</item>
		<item>
			<title>.net工程师必懂的20道题</title>
			<link>http://www.kingmx.com/article.php?id=17633</link>
			<pubDate>2007-8-1</pubDate>
			<description><![CDATA[
想成为.net工程师吗？看看下面20道题你能回答多少道？
 　　1.面向对象的思想主要包括什么？ 
　　2.什么是ASP.net中的用户控件 
　　3.什么叫应用程序域？什么是受管制的代码？什么是强类型系统？什么是装箱和拆箱？什么是重载？CTS、CLS和CLR分别作何解释？ 
　　4.列举一下你所了解的XML技术及其应用 
　　5.值类型和引用类型的区别？写出C#的样例代码。 
　　6.ADO.net中常用的对象有哪些？分别描述一下。 
　　7.如何理解委托？ 
　　8.C#中的接口和类有什么异同。 
　　9..net中读写数据库需要用到哪些类？他们的作用 
　　10.UDP连接和TCP连接的异同。 
　　11.ASP.net的身份验证方式有哪些？分别是什么原理？ 
　　12.进程和线程分别怎么理解？ 
　　13.什么是code-Behind技术。 
　　14.活动目录的作用。 
　　15..net中读写XML的类都归属于哪些命名空间？ 
　　16.解释一下UDDI、WSDL的意义及其作用。 
　　17.什么是SOAP,有哪些应用。 
　　18.如何部署一个ASP.net页面。 
　　19.如何理解.net中的垃圾回收机制。 
　　20.常用的调用webservice方法有哪些？
( 负责编辑： 李亚 ) 
]]></description>
		</item>
		<item>
			<title>blog中实现日历效果</title>
			<link>http://www.kingmx.com/article.php?id=17634</link>
			<pubDate>2007-8-1</pubDate>
			<description><![CDATA[
　　昨天有朋友问我，如果在blog中实现日历效果？如果当天有日志，则显示链接，否则不显示链接？如果只是单纯使用.net中的Calendar控件、不用js来写，能实现么？
　　答案是肯定的，那么如何去实现呢？
　　首先，我们知道.net中的服务器控件是会进行Postback的，Calendar控件中的第一天在点击时，就会进行一次postback，我们要做的就是改变它默认的链接，使它不触发postback事件，其次，就是要知道当天有没有日志。至于有没有日志，就要去数据库查询了。原始的Calendar效果：
　　在点击每一天时，实际上执行的是一段js，然后进行了postback
在Calendar中有一个DayRender事件，该事件在呈现每一天时触发，我们可以从这里入手。
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        if (e.Day.Date == DateTime.Now.Date)  
        {
            e.Cell.Text = ""   e.Day.Date.Day   "";
        }
        else
            e.Cell.Text = ""   e.Day.Date.Day   "";
    }
　　上面的代码很明了了，如果在呈现每一天时，发现该天刚好是今天，则将内容重写，写成加粗的日，同时，去掉了链接。否则，则以日来显示。
　　至于给有日志的那天加链接，就不用我说了吧。
]]></description>
		</item>
		<item>
			<title>网站ASP网站黑客防范编程技巧</title>
			<link>http://www.kingmx.com/article.php?id=17631</link>
			<pubDate>2007-8-1</pubDate>
			<description><![CDATA[
如何更好的达到防范黑客攻击，本人提一下个人意见！第一，免费程序不要真的就免费用，既然你可以共享原码，那么攻击者一样可以分析代码。如果在细节上注意防范，那样你站点的安全性就大大的提高了。即使出现了SQL Injection这样的漏洞，攻击者也不可能马上拿下你的站点。　由于ASP的方便易用，越来越多的网站后台程序都使用ASP脚本语言。但是， 由于ASP本身存在一些安全漏洞，稍不小心就会给黑客提供可乘之机。事实上，安全不仅是网管的事，编程人员也必须在某些安全细节上注意，养成良好的安全习惯，否则会给自己的网站带来巨大的安全隐患。目前，大多数网站上的ASP程序有这样那样的安全漏洞，但如果编写程序的时候注意一点的话，还是可以避免的。 
　　1、用户名与口令被破解 
　　攻击原理：用户名与口令，往往是黑客们最感兴趣的东西，如果被通过某种方式看到源代码，后果是严重的。 
　　防范技巧：涉及用户名与口令的程序最好封装在服务器端，尽量少在ASP文件里出现，涉及与数据库连接的用户名与口令应给予最小的权限。出现次数多的用户名与口令可以写在一个位置比较隐蔽的包含文件中。如果涉及与数据库连接，在理想状态下只给它以执行存储过程的权限，千万不要直接给予该用户修改、插入、删除记录的权限。 
　　2、验证被绕过 
　　攻击原理：现在需要经过验证的ASP程序大多是在页面头部加一个判断语句，但这还不够，有可能被黑客绕过验证直接进入。 
　　防范技巧：需要经过验证的ASP页面，可跟踪上一个页面的文件名，只有从上一页面转进来的会话才能读取这个页面。 
　　3、inc文件泄露问题 
　　攻击原理：当存在ASP的主页正在制作且没有进行最后调试完成以前，可以被某些搜索引擎机动追加为搜索对象。如果这时候有人利用搜索引擎对这些网页进行查找，会得到有关文件的定位，并能在浏览器中查看到数据库地点和结构的细节，并以此揭示完整的源代码。 
　　防范技巧：程序员应该在网页发布前对它进行彻底的调试；安全专家则需要加固ASP文件以便外部的用户不能看到它们。首先对.inc文件内容进行加密，其次也可以使用.asp文件代替.inc文件使用户无法从浏览器直接观看文件的源代码。inc文件的文件名不要使用系统默认的或者有特殊含义容易被用户猜测到的名称，尽量使用无规则的英文字母。 
　4、自动备份被下载 
　　攻击原理：在有些编辑ASP程序的工具中，当创建或者修改一个ASP文件时，编辑器自动创建一个备份文件，比如：UltraEdit就会备份一个.bak文件，如你创建或者修改了some.asp，编辑器会自动生成一个叫some.asp.bak文件，如果你没有删除这个bak文件，攻击者可以直接下载some.asp.bak文件，这样some.asp的源程序就会被下载。 
　　防范技巧：上传程序之前要仔细检查，删除不必要的文档。对以BAK为后缀的文件要特别小心。 
　　5、特殊字符 
　　攻击原理：输入框是黑客利用的一个目标，他们可以通过输入脚本语言等对用户客户端造成损坏；如果该输入框涉及数据查询，他们会利用特殊查询语句，得到更多的数据库数据，甚至表的全部。因此必须对输入框进行过滤。但如果为了提高效率仅在客户端进行输入合法性检查，仍有可能被绕过。 
　　防范技巧：在处理类似留言板、BBS等输入框的ASP程序中，最好屏蔽掉HTML、javaScript、VBScript语句，如无特殊要求，可以限定只允许输入字母与数字，屏蔽掉特殊字符。同时对输入字符的长度进行限制。而且不但要在客户端进行输入合法性检查，同时要在服务器端程序中进行类似检查。 
　　6、数据库下载漏洞 
　　攻击原理：在用Access做后台数据库时，如果有人通过各种方法知道或者猜到了服务器的Access数据库的路径和数据库名称，那么他也能够下载这个Access数据库文件，这是非常危险的。 
　　防范技巧： 
　（1）为你的数据库文件名称起个复杂的非常规的名字，并把它放在几层目录下。所谓 “非常规”， 打个比方说，比如有个数据库要保存的是有关书籍的信息， 可不要给它起个“book.mdb”的名字，而要起个怪怪的名称，比如d34ksfslf.mdb， 并把它放在如./kdslf/i44/studi/的几层目录下，这样黑客要想通过猜的方式得到你的Access数据库文件就难上加难了。 
　（2）不要把数据库名写在程序中。有些人喜欢把DSN写在程序中，比如： 
　　DBPath = Server.MapPath（“cmddb.mdb”） 
　　conn.Open “driver={Microsoft Access Driver （*.mdb）}；dbq=” ]]></description>
		</item>
		<item>
			<title>如何封装JS和CSS文件为服务器端控件</title>
			<link>http://www.kingmx.com/article.php?id=17632</link>
			<pubDate>2007-8-1</pubDate>
			<description><![CDATA[
我们以封装一个JS的日期控件为列子，将它和服务器的TextBox结合在一起做成一个服务器控件，以达到直接托上去就可以使用的效果。其实很简单，大家共同学习。先看看效果图： 
  

  方法： 
  首先：下载一个JS的日期组件，带封装。   然后：建一个日期类文件CalendarBox.cs代码如下： 

  using System; 
  using System.Collections.Generic; 
  using System.ComponentModel; 
  using System.Text; 
  using System.Web; 
  using System.Drawing; 
  using System.Web.UI; 
  using System.Web.UI.WebControls; 
  using System.Web.UI.HtmlControls; 
   
  [assembly: WebResource("Wisesoft.Web.Control.Wisesoft.Calendar.calendar.js", "application/x-javascript", PerformSubstitution=true)] 
   
  namespace Wisesoft.Web.Control 
  { 
   [ToolboxBitmap(typeof(CalenderBox), "Wisesoft.Calendar.CalendarBox.ico")] 
   public class CalenderBox : TextBox 
   { 
   protected override void OnPreRender(EventArgs e) 
   { 
   string calendar = CalenderCSS.CSS; 
   calendar = calendar.Replace("$ImaginURL$", this.ImaginURL); 
   if (!Page.ClientScript.IsClientScriptBlockRegistered("_calendar")) 
   Page.ClientScript.RegisterClientScriptBlock(typeof(string), "_calendar", calendar); 
   
   this.Page.PreRenderComplete  = new EventHandler(Page_PreRenderComplete); 
   this.CssClass = "Wdate"; 
   this.Attributes.Add("onfocus","setday(this)"); 
   this.Attributes.Add("onchange", "checkDate(this.value)"); 
   base.OnPreRender(e); 
   } 
   
   void Page_PreRenderComplete(object sender, EventArgs e) 
   { 
   Page.ClientScript.RegisterClientScriptResource(this.GetType(), "Wisesoft.Web.Control.Wisesoft.Calendar.calendar.js"); 
   } 
   
   /**////  
   /// 弹出日期控件小图片的地址 
   ///  
   [Bindable(true)] 
   [Category("图标设置")] 
   [DefaultValue("imagin/calender.gif")] 
   [Localizable(true)] 
   public string ImaginURL 
   { 
   get 
   { 
   String s = (String)ViewState["ImaginURL"]; 
   return ((s == null) ? "imagin/calender.gif" : s); 
   } 
   set 
   { 
   ViewState["ImaginURL"] = value; 
   } 
   } 
   
   /**////  
   /// 设置日期，时间的初始格式。 
   ///  
   [Bindable(true)] 
   [Category("初始化设置")] 
   [DefaultValue(false)] 
   [Localizable(true)] 
   public bool ShowTime 
   { 
   get 
   { 
   bool s = (bool)ViewState["ShowTime"]; 
   if (ViewState["ShowTime"] != null) 
   { 
   return s; 
   } 
   return false; 
   } 
   set 
   { 
   ViewState["ShowTime"] = value; 
   } 
   } 
   
   
   /**////  
   /// 注样式文件 
   ///  
   /// 
 
   private void RegisterCssFile(string path) 
   { 
   HtmlLink link1 = new HtmlLink(); 
   link1.Attributes["type"] = "text/css"; 
   link1.Attributes["rel"] = "stylesheet"; 
   link1.Attributes["href"] = path; 
   this.Page.Header.Controls.Add(link1); 
   } 
   } 
  } 

[page]
  注意：[assembly: WebResource("Wisesoft.Web.Control.Wisesoft.Calendar.calendar.js", "application/x-javascript", PerformSubstitution=true)]是用来封装你的JS文件，要使用你项目的名字加上你JS文件的名字，还需要将你的JS文件做一点设置，点右件，选择属性-然后选择高级，选择生成操作选择嵌入的资源，这样才能将JS文件封装进去，当然如果有图片或者是CSS文件也是一样的。   再看 

void Page_PreRenderComplete(object sender, EventArgs e) 
   { 
   Page.ClientScript.RegisterClientScriptResource(this.GetType(), "Wisesoft.Web.Control.Wisesoft.Calendar.calendar.js"); 
   }  

  是在页面呈现之前将你的JS文件注册到页面上。 
   [Bindable(true)] 
   [Category("图标设置")] 
   [DefaultValue("imagin/calender.gif")] 
   [Localizable(true)] 
  是利用反射的元数据信息，来设置属性。就是给你的日期控件旁边加上个小图标，把它做成一个属性，可以让程序员自定义设置图片，也可以把它继承进去。 
  好了，这样就可以把JS文件封装好了，再来看看CSS文件如何封装并写入客户端。 
  我们可以看见下面有一个方法， 

   /**////  
   /// 注样式文件 
   ///  
   /// 
 
   private void RegisterCssFile(string path) 
   { 
   HtmlLink link1 = new HtmlLink(); 
   link1.Attributes["type"] = "text/css"; 
   link1.Attributes["rel"] = "stylesheet"; 
   link1.Attributes["href"] = path; 
   this.Page.Header.Controls.Add(link1); 
   } 

   
   它就是用来注册你的CSS文件的，大家都知道在我们的页面代码里面是引入外部样式文件。这个方法就是达到这个目的。那么我们现在还没有样式文件。 
  因此我们就必须建立一个CSS，然后把它设置一下（和JS的设置方式一样）。再到void Page_PreRenderComplete(object sender, EventArgs e)方法调用就可以了，但是还有其他方法，我们来介绍第二种（对JS文件也可以这样使用），建立一个CalendarCSS.cs文件，代码如下：

  using System; 
  using System.Collections.Generic; 
  using System.Text; 
   
  namespace Wisesoft.Web.Control 
  { 
   public class CalenderCSS 
   { 
   public static string CSS = @""; 
   } 
  } 

 
   这个类其实是将我们的CSS文件，写为一个字符串形式，然后供主函数调用，以注册到客户端使用。 
  那么我们再看看CalendarBox.cs文件里的这段代码 

  string calendar = CalenderCSS.CSS; 
   calendar = calendar.Replace("$ImaginURL$", this.ImaginURL); 
   if (!Page.ClientScript.IsClientScriptBlockRegistered("_calendar")) 
   Page.ClientScript.RegisterClientScriptBlock(typeof(string), "_calendar", calendar);  

  它就是将我们已经写好的一段字符串以快的形式注册到客户端（当然还有更多的注册方式，可以在MSDN看看ClientScript类）。 
  好了，基本上就可以使用了。编译一下呢？
]]></description>
		</item>
		<item>
			<title>ASP.NET应用程序资源访问安全模型</title>
			<link>http://www.kingmx.com/article.php?id=17630</link>
			<pubDate>2007-8-1</pubDate>
			<description><![CDATA[
摘要：本文主要介绍了ASP.NET WEB应用程序的安全模型的种类、对比其优缺点，提出了选择的机制。
　　关键字：安全模型 受信任子模型 模拟/委托子模型 ASP.NET WEB应用
　　1.前言
    ASP.NET WEB应用程序通常属于多层体系结构，一般从逻辑结构上可以分为表示层、业务逻辑层和数据访问层；客户端要访问应用程序资源，其身份认证和授权必然要跨越多个层次。本文主要讨论SP.NET应用程序的资源访问安全模型
　　2. 资源访问标识
    WEB应用程序对外提供的给客户端的典型资源包括：
Web服务器资源，如Web页、Web服务和静态资源（HTML页和图像）。 
数据库资源，如针对每个用户的数据或是应用程序级数据。 
网络资源，如远程文件系统资源等。 
系统资源，如注册表、事件日志和配置文件等。 
    客户端跨越应用程序的层来访问这些资源，要有一个标识流经各个层。这个用于资源访问的标识包括：
　　原始调用者的标识 原始调用者的标识被获取并且随后流经系统的每个层。 
  
　　进程标识 本地资源访问和下游调用是使用当前进程标识进行的。这种方式的可行性依赖于要跨越的边界，因为进程标识必须能被目标系统识别。这需要以下面两种方式之一进行调用： 
　　在同一个Windows安全域中 
　　跨Windows安全域-使用信任和域账户，或者在不存在信任关系的情况下使用重复的用户名和密码。 
服务账户 这种方式使用一个（固定的）服务账户。例如 
对于数据库访问，该服务账户可能由连接到数据库的一个组件表示固定的SQL用户名和密码。 
当需要固定的Windows标识时，应使用Enterprise Services服务器应用程序。 
自定义标识 当没有Windows账户可用时，可以使用Iprincipal和Iidentity实现构造自己的标识，可以包含安全上下文有关的详细信息。 
　　3. 资源访问模型
　　3.1 受信任子系统模型
    如图1所示，在这种模型中，原始调用者的安全上下文并不在操作系统级流经服务，而是在中间服务层使用了一个固定标识来访问下游的服务和资源。受信任子系统模型得名于这样一个事实：下游服务（可能是一个数据库）信任上游服务，让其调用者进行授权。图1中的示例，数据库信任中间层对调用者进行的授权，并只允许被授权的调用者使用受信任标识访问数据库。 
　　3.1.1 资源访问模式
    在受信任子系统模型中，资源访问模式如下：
对用户进行验证 
将用户映射为角色 
根据角色成员关系进行授权 
使用一个固定的受信任标识访问下游资源 
　　3.1.2 固定标识
    用于访问下游系统合资源管理器的固定标识，可以使用进程标识，也可以使用一个预先设定的Windows账户-服务账户来提供。对于SQL Server资源管理器，这意味着对SQL Server的Windows身份验证。
    使用进程标识时通常使用ASP.NET进程标识（默认识ASPNET账户）。实际应用时，经常需要将ASPNET账户更改为一个更为安全的密码，并在SQL Server计算机上镜像创建一个与ASP.NET进程帐户相匹配的Windows账户。具体方法如下：
    编辑位于%windr%\Microsoft.NET\Framework\v1.1.4322\CONFIG目录下的Machine.config文件，将
元素上的密码属性重新配置，将其默认值]]></description>
		</item>
		<item>
			<title>ASP.NET中常用的26个优化性能方法</title>
			<link>http://www.kingmx.com/article.php?id=17603</link>
			<pubDate>2007-7-30</pubDate>
			<description><![CDATA[
　1. 数据库访问性能优化 
　　数据库的连接和关闭
　　访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证，比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中，需要时取出，关闭时收回连接，等待下一次的连接请求。
　　连接池的大小是有限的，如果在连接池达到最大限度后仍要求创建连接，必然大大影响性能。因此，在建立数据库连接后只有在真正需要操作时才打开连接，使用完毕后马上关闭，从而尽量减少数据库连接打开的时间，避免出现超出连接限制的情况。
　　使用存储过程
　　存储过程是存储在服务器上的一组预编译的SQL语句，类似于DOS系统中的批处理文件。存储过程具有对数据库立即访问的功能，信息处理极为迅速。使用存储过程可以避免对命令的多次编译，在执行一次后其执行规划就驻留在高速缓存中，以后需要时只需直接调用缓存中的二进制代码即可。
　　另外，存储过程在服务器端运行，独立于ASP.NET程序，便于修改，最重要的是它可以减少数据库操作语句在网络中的传输。
　　优化查询语句
　　ASP.NET中ADO连接消耗的资源相当大，SQL语句运行的时间越长，占用系统资源的时间也越长。因此，尽量使用优化过的SQL语句以减少执行时间。比如，不在查询语句中包含子查询语句，充分利用索引等。
　　2. 字符串操作性能优化
　　使用值类型的ToString方法
　　在连接字符串时，经常使用" "号直接将数字添加到字符串中。这种方法虽然简单，也可以得到正确结果，但是由于涉及到不同的数据类型，数字需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大，因为在进行这类处理时，将在托管堆中分配一个新的对象，原有的值复制到新创建的对象中。
　　使用值类型的ToString方法可以避免装箱操作，从而提高应用程序性能。
　　运用StringBuilder类
　　String类对象是不可改变的，对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象，其方法ToString对性能的提高并非很显著。
　　在处理字符串时，最好使用StringBuilder类，其.NET 命名空间是System.Text。该类并非创建新的对象，而是通过Append，Remove，Insert等方法直接对字符串进行操作，通过ToString方法返回操作结果。
　　其定义及操作语句如下所示：

　　int num; 
　　System.Text.StringBuilder str = new System.Text.StringBuilder(); //创建字符串 
　　str.Append(num.ToString()); //添加数值num 
　　Response.Write(str.ToString); //显示操作结果 

　　3. 优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要 
　　默认情况下，ASP.NET 配置被设置成启用最广泛的功能并尽量适应最常见的方案。因此，应用程序开发人员可以根据应用程序所使用的功能，优化和更改其中的某些配置，以提高应用程序的性能。下面的列表是您应该考虑的一些选项。
　　仅对需要的应用程序启用身份验证。默认情况下，身份验证模式为 Windows，或集成 NTLM。大多数情况下，对于需要身份验证的应用程序，最好在 Machine.config 文件中禁用身份验证，并在 Web.config 文件中启用身份验证。
　　根据适当的请求和响应编码设置来配置应用程序。ASP.NET 默认编码格式为 UTF-8。如果您的应用程序为严格的 ASCII，请配置应用程序使用 ASCII 以获得稍许的性能提高。
　　考虑对应用程序禁用 AutoEventWireup。在 Machine.config 文件中将 AutoEventWireup 属性设置为 false，意味着页面不将方法名与事件进行匹配和将两者挂钩(例如 Page_Load)。如果页面开发人员要使用这些事件，需要在基类中重写这些方法(例如，需要为页面加载事件重写 Page.OnLoad，而不是使用 Page_Load 方法)。如果禁用 AutoEventWireup，页面将通过将事件连接留给页面作者而不是自动执行它，获得稍许的性能提升。
　　从请求处理管线中移除不用的模块。默认情况下，服务器计算机的 Machine.config 文件中 节点的所有功能均保留为激活。根据应用程序所使用的功能，您可以从请求管线中移除不用的模块以获得稍许的性能提升。检查每个模块及其功能，并按您的需要自定义它。
　　例如，如果您在应用程序中不使用会话状态和输出缓存，则可以从 列表中移除它们，以便请求在不执行其他有意义的处理时，不必执行每个模块的进入和离开代码。
　　4. 一定要禁用调试模式
　　在部署生产应用程序或进行任何性能测量之前，始终记住禁用调试模式。如果启用了调试模式，应用程序的性能可能受到非常大的影响。
　　5. 对于广泛依赖外部资源的应用程序，请考虑在多处理器计算机上启用网络园艺
　　ASP.NET 进程模型帮助启用多处理器计算机上的可缩放性，将工作分发给多个进程(每个 CPU 一个)，并且每个进程都将处理器关系设置为其 CPU。此技术称为网络园艺。如果应用程序使用较慢的数据库服务器或调用具有外部依赖项的 COM 对象(这里只是提及两种可能性)，则为您的应用程序启用网络园艺是有益的。但是，在决定启用网络园艺之前，您应该测试应用程序在网络园中的执行情况。
[page]
　　6. 只要可能，就缓存数据和页输出
　　ASP.NET 提供了一些简单的机制，它们会在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据。另外，通过设计要进行缓存的页和数据请求(特别是在站点中预期将有较大通讯量的区域)，可以优化这些页的性能。与 .NET Framework 的任何 Web 窗体功能相比，适当地使用缓存可以更好的提高站点的性能，有时这种提高是超数量级的。
　　使用 ASP.NET 缓存机制有两点需要注意。首先，不要缓存太多项。缓存每个项均有开销，特别是在内存使用方面。不要缓存容易重新计算和很少使用的项。其次，给缓存的项分配的有效期不要太短。很快到期的项会导致缓存中不必要的周转，并且经常导致更多的代码清除和垃圾回收工作。若关心此问题，请监视与 ASP.NET Applications 性能对象关联的 Cache Total Turnover Rate 性能计数器。高周转率可能说明存在问题，特别是当项在到期前被移除时。这也称作内存压力。
 
　　7. 选择适合页面或应用程序的数据查看机制 
　　根据您选择在 Web 窗体页显示数据的方式，在便利和性能之间常常存在着重要的权衡。例如，DataGrid Web 服务器控件可能是一种显示数据的方便快捷的方法，但就性能而言它的开销常常是最大的。在某些简单的情况下，您通过生成适当的 HTML 自己呈现数据可能很有效，但是自定义和浏览器定向会很快抵销所获得的额外功效。Repeater Web 服务器控件是便利和性能的折衷。它高效、可自定义且可编程。
　　8. 将 SqlDataReader 类用于快速只进数据游标
　　SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法。如果当创建 ASP.NET 应用程序时出现允许您使用它的情况，则 SqlDataReader 类提供比 DataSet 类更高的性能。情况之所以这样，是因为 SqlDataReader 使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据。另外，SqlDataReader 类实现 IEnumerable 接口，该接口也允许您将数据绑定到服务器控件。有关更多信息，请参见 SqlDataReader 类。有关 ASP.NET 如何访问数据的信息，请参见通过 ASP.NET 访问数据。
　　9. 将 SQL Server 存储过程用于数据访问
　　在 .NET Framework 提供的所有数据访问方法中，基于 SQL Server 的数据访问是生成高性能、可缩放 Web 应用程序的推荐选择。使用托管 SQL Server 提供程序时，可通过使用编译的存储过程而不是特殊查询获得额外的性能提高。
　　10. 避免单线程单元 (STA) COM 组件
　　默认情况下，ASP.NET 不允许任何 STA COM 组件在页面内运行。若要运行它们，必须在 .aspx 文件内将 ASPCompat=true 属性包含在 @ Page 指令中。这样就将执行用的线程池切换到 STA 线程池，而且使 HttpContext 和其他内置对象可用于 COM 对象。前者也是一种性能优化，因为它避免了将多线程单元 (MTA) 封送到 STA 线程的任何调用。
　　使用 STA COM 组件可能大大损害性能，应尽量避免。若必须使用 STA COM 组件，如在任何 interop 方案中，则应在执行期间进行大量调用并在每次调用期间发送尽可能多的信息。另外，小心不要在构造页面期间创建任何 STA COM 组件。例如下面的代码中，在页面构造时将实例化由某个线程创建的 MySTAComponent，而该线程并不是将运行页面的 STA 线程。这可能对性能有不利影响，因为要构造页面就必须完成 MTA 和 STA 线程之间的封送处理。



 


　　 
　　首选机制是推迟对象的创建，直到以后在 STA 线程下执行上述代码，如下面的例子所示。

 
 
 
 
 

　　推荐的做法是在需要时或者在 Page_Load 方法中构造任何 COM 组件和外部资源。
　　永远不要将任何 STA COM 组件存储在可以由构造它的线程以外的其他线程访问的共享资源里。这类资源包括像缓存和会话状态这样的资源。即使 STA 线程调用 STA COM 组件，也只有构造此 STA COM 组件的线程能够实际为该调用服务，而这要求封送处理对创建者线程的调用。此封送处理可能产生重大的性能损失和可伸缩性问题。在这种情况下，请研究一下使 COM 组件成为 MTA COM 组件的可能性，或者更好的办法是迁移代码以使对象成为托管对象。
　　11. 将调用密集型的 COM 组件迁移到托管代码 
　　.NET Framework 提供了一个简单的方法与传统的 COM 组件进行交互。其优点是可以在保留现有投资的同时利用新的平台。但是在某些情况下，保留旧组件的性能开销使得将组件迁移到托管代码是值得的。每一情况都是不一样的，决定是否需要迁移组件的最好方法是对 Web 站点运行性能测量。建议您研究一下如何将需要大量调用以进行交互的任何 COM 组件迁移到托管代码。
　　许多情况下不可能将旧式组件迁移到托管代码，特别是在最初迁移 Web 应用程序时。在这种情况下，最大的性能障碍之一是将数据从非托管环境封送到托管环境。因此，在交互操作中，请在任何一端执行尽可能多的任务，然后进行一个大调用而不是一系列小调用。例如，公共语言运行库中的所有字符串都是 Unicode 的，所以应在调用托管代码之前将组件中的所有字符串转换成 Unicode 格式。
　　另外，一处理完任何 COM 对象或本机资源就释放它们。这样，其他请求就能够使用它们，并且最大限度地减少了因稍后请求垃圾回收器释放它们所引起的性能问题。
[page]
　　12. 在 Visual Basic .NET 或 JScript 代码中使用早期绑定
　　以往，开发人员喜欢使用 Visual Basic、VBScript 和 JScript 的原因之一就是它们所谓“无类型”的性质。变量不需要显式类型声明，并能够简单地通过使用来创建它们。当从一个类型到另一个类型进行分配时，转换将自动执行。不过，这种便利会大大损害应用程序的性能。
　　Visual Basic 现在通过使用 Option Strict 编译器指令来支持类型安全编程。为了向后兼容，默认情况下，ASP.NET 不启用该选项。但是，为了得到最佳性能，强烈建议在页中启用该选项。若要启用 Option Strict，请将 Strict 属性包括在 @ Page 指令中，或者，对于用户控件，请将该属性包括在 @ Control 指令中。下面的示例演示了如何设置该属性，并进行了四个变量调用以显示使用该属性是如何导致编译器错误的。

  
 

 　　JScript .NET 也支持无类型编程，但它不提供强制早期绑定的编译器指令。若发生下面任何一种情况，则变量是晚期绑定的：
　　被显式声明为 Object。
　　是无类型声明的类的字段。
　　是无显式类型声明的专用函数或方法成员，并且无法从其使用推断出类型。
　　最后一个差别比较复杂，因为如果 JScript .NET 编译器可以根据变量的使用情况推断出类型，它就会进行优化。在下面的示例中，变量 A 是早期绑定的，但变量 B 是晚期绑定的。

　　var A; 
　　var B; 
　　A = "Hello"; 
　　B = "World"; 
　　B = 0; 

　　为了获得最佳的性能，当声明 JScript .NET 变量时，请为其分配一个类型。例如，var A : String。　13. 使请求管线内的所有模块尽可能高效
　　请求管线内的所有模块在每次请求中都有机会被运行。因此，当请求进入和离开模块时快速地触发代码至关重要，特别是在不使用模块功能的代码路径里。分别在使用及不使用模块和配置文件时执行吞吐量测试，对确定这些方法的执行速度非常有用。
　　14. 使用 HttpServerUtility.Transfer 方法在同一应用程序的页面间重定向
　　采用 Server.Transfer 语法，在页面中使用该方法可避免不必要的客户端重定向。
　　15. 必要时调整应用程序每个辅助进程的线程数 
　　ASP.NET 的请求结构试图在执行请求的线程数和可用资源之间达到一种平衡。已知一个使用足够 CPU 功率的应用程序，该结构将根据可用于请求的 CPU 功率，来决定允许同时执行的请求数。这项技术称作线程门控。但是在某些条件下，线程门控算法不是很有效。通过使用与 ASP.NET Applications 性能对象关联的 Pipeline Instance Count 性能计数器，可以在 PerfMon 中监视线程门控。
　　当页面调用外部资源，如数据库访问或 XML Web services 请求时，页面请求通常停止并释放 CPU。如果某个请求正在等待被处理，并且线程池中有一个线程是自由的，那么这个正在等待的请求将开始被处理。遗憾的是，有时这可能导致 Web 服务器上存在大量同时处理的请求和许多正在等待的线程，而它们对服务器性能有不利影响。通常，如果门控因子是外部资源的响应时间，则让过多请求等待资源，对 Web 服务器的吞吐量并无帮助。
　　为缓和这种情况，可以通过更改 Machine.config 配置文件节点的 maxWorkerThreads 和 maxIOThreads 属性，手动设置进程中的线程数限制。
　　注意 辅助线程是用来处理 ASP.NET 请求的，而 IO 线程则是用于为来自文件、数据库或 XML Web services 的数据提供服务的。
　　分配给这些属性的值是进程中每个 CPU 每类线程的最大数目。对于双处理器计算机，最大数是设置值的两倍。对于四处理器计算机，最大值是设置值的四倍。无论如何，对于有四个或八个 CPU 的计算机，最好更改默认值。对于有一个或两个处理器的计算机，默认值就可以，但对于有更多处理器的计算机的性能，进程中有一百或两百个线程则弊大于利。
　　注意 进程中有太多线程往往会降低服务器的速度，因为额外的上下文交换导致操作系统将 CPU 周期花在维护线程而不是处理请求上。
　　16. 适当地使用公共语言运行库的垃圾回收器和自动内存管理
　　小心不要给每个请求分配过多内存，因为这样垃圾回收器将必须更频繁地进行更多的工作。另外，不要让不必要的指针指向对象，因为它们将使对象保持活动状态，并且应尽量避免含 Finalize 方法的对象，因为它们在后面会导致更多的工作。特别是在 Finalize 调用中永远不要释放资源，因为资源在被垃圾回收器回收之前可能一直消耗着内存。最后这个问题经常会对 Web 服务器环境的性能造成毁灭性的打击，因为在等待 Finalize 运行时，很容易耗尽某个特定的资源。
[page]
　　17. 如果有大型 Web 应用程序，可考虑执行预批编译
　　每当发生对目录的第一次请求时都会执行批编译。如果目录中的页面没有被分析并编译，此功能会成批分析并编译目录中的所有页面，以便更好地利用磁盘和内存。如果这需要很长时间，则将快速分析并编译单个页面，以便请求能被处理。此功能带给 ASP.NET 性能上的好处，因为它将许多页面编译为单个程序集。从已加载的程序集访问一页比每页加载新的程序集要快。
　　批编译的缺点在于：如果服务器接收到许多对尚未编译的页面的请求，那么当 Web 服务器分析并编译它们时，性能可能较差。为解决这个问题，可以执行预批编译。为此，只需在应用程序激活之前向它请求一个页面，无论哪页均可。然后，当用户首次访问您的站点时，页面及其程序集将已被编译。
　　没有简单的机制可以知道批编译何时发生。需一直等到 CPU 空闲或者没有更多的编译器进程(例如 csc.exe(C# 编译器)或 vbc.exe(Visual Basic 编译器))启动。
　　还应尽量避免更改应用程序的 \bin 目录中的程序集。更改页面会导致重新分析和编译该页，而替换 \bin 目录中的程序集则会导致完全重新批编译该目录。
　　在包含许多页面的大规模站点上，更好的办法可能是根据计划替换页面或程序集的频繁程度来设计不同的目录结构。不常更改的页面可以存储在同一目录中并在特定的时间进行预批编译。经常更改的页面应在它们自己的目录中(每个目录最多几百页)以便快速编译。
　　Web 应用程序可以包含许多子目录。批编译发生在目录级，而不是应用程序级。
　　18. 不要依赖代码中的异常
　　因为异常大大地降低性能，所以您不应该将它们用作控制正常程序流程的方式。如果有可能检测到代码中可能导致异常的状态，请执行这种操作。不要在处理该状态之前捕获异常本身。常见的方案包括：检查 null，分配给将分析为数字值的 String 一个值，或在应用数学运算前检查特定值。下面的示例演示可能导致异常的代码以及测试是否存在某种状态的代码。两者产生相同的结果。

　　try 
　　{ 
　　result = 100 / num; 
　　} 
　　catch (Exception e) 
　　{ 
　　result = 0; 
　　} 
　　// ...to this. 
　　if (num != 0) 
　　result = 100 / num; 
　　else 
　　result = 0; 

　　19. 使用 HttpResponse.Write 方法进行字符串串联 
　　该方法提供非常有效的缓冲和连接服务。但是，如果您正在执行广泛的连接，请使用多个 Response.Write 调用。下面示例中显示的技术比用对 Response.Write 方法的单个调用连接字符串更快。

　　Response.Write("a"); 
　　Response.Write(myString); 
　　Response.Write("b"); 
　　Response.Write(myObj.ToString()); 
　　Response.Write("c"); 
　　Response.Write(myString2); 
　　Response.Write("d"); 

　　20. 除非有特殊的原因要关闭缓冲，否则使其保持打开
　　禁用 Web 窗体页的缓冲会导致大量的性能开销。
　　21. 只在必要时保存服务器控件视图状态
　　自动视图状态管理是服务器控件的功能，该功能使服务器控件可以在往返过程上重新填充它们的属性值(您不需要编写任何代码)。但是，因为服务器控件的视图状态在隐藏的窗体字段中往返于服务器，所以该功能确实会对性能产生影响。您应该知道在哪些情况下视图状态会有所帮助，在哪些情况下它影响页的性能。例如，如果您将服务器控件绑定到每个往返过程上的数据，则将用从数据绑定操作获得的新值替换保存的视图状态。在这种情况下，禁用视图状态可以节省处理时间。
　　默认情况下，为所有服务器控件启用视图状态。若要禁用视图状态，请将控件的EnableViewState 属性设置为 false，如下面的 DataGrid 服务器控件示例所示。


 

 
　　您还可以使用 @ Page 指令禁用整个页的视图状态。当您不从页回发到服务器时，这将十分有用：

 

[page]
　22. 避免到服务器的不必要的往返过程
　　虽然您很可能希望尽量多地使用 Web 窗体页框架的那些节省时间和代码的功能，但在某些情况下却不宜使用 ASP.NET 服务器控件和回发事件处理。
　　通常，只有在检索或存储数据时，您才需要启动到服务器的往返过程。多数数据操作可在这些往返过程间的客户端上进行。例如，从 HTML 窗体验证用户输入经常可在数据提交到服务器之前在客户端进行。通常，如果不需要将信息传递到服务器以将其存储在数据库中，那么您不应该编写导致往返过程的代码。
　　如果您开发自定义服务器控件，请考虑让它们为支持 ECMAScript 的浏览器呈现客户端代码。通过以这种方式使用服务器控件，您可以显著地减少信息被不必要的发送到 Web 服务器的次数。
　　使用 Page.IsPostBack 避免对往返过程执行不必要的处理
　　如果您编写处理服务器控件回发处理的代码，有时可能需要在首次请求页时执行其他代码，而不是当用户发送包含在该页中的 HTML 窗体时执行的代码。根据该页是否是响应服务器控件事件生成的，使用 Page.IsPostBack 属性有条件地执行代码。例如，下面的代码演示如何创建数据库连接和命令，该命令在首次请求该页时将数据绑定到 DataGrid 服务器控件。

　　void Page_Load(Object sender, EventArgs e) 
　　{ 
　　// Set up a connection and command here. 
　　if (!Page.IsPostBack) 
　　{ 
　　String query = "select * from Authors where FirstName like '%JUSTIN%'"; 
　　myCommand.Fill(ds, "Authors"); 
　　myDataGrid.DataBind(); 
　　} 
　　} 

　　由于每次请求时都执行 Page_Load 事件，上述代码检查 IsPostBack 属性是否设置为 false。如果是，则执行代码。如果该属性设置为 true，则不执行代码。
　　注意 如果不运行这种检查，回发页的行为将不更改。Page_Load 事件的代码在执行服务器控件事件之前执行，但只有服务器控件事件的结果才可能在输出页上呈现。如果不运行该检查，仍将为 Page_Load 事件和该页上的任何服务器控件事件执行处理。
　　23. 当不使用会话状态时禁用它 
　　并不是所有的应用程序或页都需要针对于具体用户的会话状态，您应该对任何不需要会话状态的应用程序或页禁用会话状态。
　　若要禁用页的会话状态，请将 @ Page 指令中的 EnableSessionState 属性设置为 false。例如:



]]></description>
		</item>
		<item>
			<title>源码共享：ASP.NET发电子邮件源码</title>
			<link>http://www.kingmx.com/article.php?id=17602</link>
			<pubDate>2007-7-30</pubDate>
			<description><![CDATA[

using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Mail; 
        try
        {
            //编码暂硬性规定为GB2312 
            Encoding encoding = Encoding.GetEncoding(936);
            MailMessage Message = new MailMessage(
            new MailAddress("自己的邮箱", "5", encoding),//第一个是发信人的地址，第二个参数是发信人
            new MailAddress(TextBox1.Text));//收信人邮箱
            Message.SubjectEncoding = encoding;
            Message.Subject =TextBox2.Text;//标题
            Message.BodyEncoding = encoding;
            Message.Body = TextBox3.Text; //主体
            SmtpClient smtpClient = new SmtpClient("smtp.163.com");//信箱服务器
            smtpClient.Credentials = new NetworkCredential("自己的邮箱用户名", "自己的邮箱密码");//信箱的用户名和密码
            smtpClient.Timeout = 999999;
            smtpClient.Send(Message);
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

]]></description>
		</item>
		<item>
			<title>ASP注入应用漏洞解决方法整理</title>
			<link>http://www.kingmx.com/article.php?id=17601</link>
			<pubDate>2007-7-30</pubDate>
			<description><![CDATA[
1、ASP程序连接 SQL Server 的账号不要使用sa，或任何属于Sysadmin组的账号，尽量避免应用服务有过高的权限，应使用一个db_owner权限的一般用户来连接数据库。 
2、WEB应用服务器与DB服务器分别使用不同的机器来存放，并且之间最好通过防火墙来进行逻辑隔离，因为除了有程序在探测 sa 没密码的SQL Server，SQL Server 本身及大量的扩展存储过程也有被溢出攻击的危险。 
3、数据库服务器尽量不要与公网进行连接，如果一定要直接提供公网的连接存储，应考虑使用一个非标准端口并限制IP地址来进行连接。 
4、SA一定要设成强悍的密码，尤其是SQL Server 2000以前的版本，在默认安装Sql时sa账号没有密码，而一般管理员装完后也忘了或怕麻烦而不更改密码。 
5、改掉缺省的Web虚拟路径，不要使用IIS装好后预设的\Inetpub\WWWRoot路径，否则利用前面叙述的另存为方式，很容易在该目录下动手脚。 
6、将平时不使用的但功能强大的扩展存储过程删除。 
7、使用网络和主机IDS来监控重要系统的运行状况。 
8、随时注意是否有新的补丁需要补上，目前SQL2000最新的补本包为SP4。 
9、尽量的利用ASP 或者 ASP.NET 在服务器端检查与限制输入变量的类型与长度，过滤掉不需要的内容。要注意的是这些检查不只是要放在前端，后端也要检测。 在前端利用Html Input 标签的MaxLength属性来限制输入长度，或是以JScript编写程序来限定文本域的长度，但是只要将该网页另存为，修改内容后(一般只要改写Form的Action属性以及Input的MaxLength属性)，重新用浏览器打开更改过后的页面就可以躲过这些浏览器前端的检查。 
10、使用容错语句，不要显示错误信息到前端，利用VBScript语法的On Error Resume Next来屏蔽SQL的出错提示，并搭配If Err.Number0 Then的错误处理方式，自行将错误重定向到适当的错误处理网页，如此系统将更稳固，且黑客也不容易透过错误信息来探知系统的内部运作方式。或者，也可以修改\Winnt\Help\iisHelp\common\500-100.asp预设网页，最简单的方式就是将它改名。例： 
on error resume next
sql2="select * from dv_admin where username='"]]></description>
		</item>
	</channel>
 </rss>
