<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/xsl/rss.xsl" type="text/xsl" media="screen"?>
<!--åå®¢åå«æ¥å¿ï¼æ¯äºèç½ä¸ä¸ç§ä¸ªäººä¹¦ååäººéäº¤æµçå·¥å·ãéè¿åå®¢è®°å½ä¸å·¥ä½ãå­¦ä¹ ãçæ´»åå¨±ä¹çç¹æ»´ï¼çè³è§ç¹åè¯è®ºï¼ä»èå¨ç½ä¸å»ºç«ä¸ä¸ªå®å¨å±äºèªå·±çä¸ªäººå¤©å°ãå»ºç«åå®¢ï¼æå©äºä»äººå¨äºèç½ä¸æ´å¥½å°è®¤è¯æ¨ï¼ä¹æå©äºæ¨æ´å¥½çåå«äººäº¤æµãåå®¢ä¸çæ¯ä¸ä¸ªå¼æ¾åå±äº«çä¸çãæçåå®¢ç±æçå¬å¸å¼åï¼ç®åæ¯åè´¹æå¡ã--> 
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:ppp="http://blog.sohu.com/ppp/"
	>

	<channel>
		<title>程序人生</title>
		<link>http://windowsapi.blog.sohu.com/</link>
		<description><![CDATA[最近正在开发Entity Query Language！]]></description>
		<pubDate>Sun, 8 Mar 2009 23:10:49 +0800</pubDate>
		<ppp:ebi>84367c5792</ppp:ebi>
		<generator>搜狐博客</generator>
		<image>
			<title>http://blog.sohu.com</title>
			<url>http://js.pp.sohu.com/ppp/blog/images/common/logo_150_60.gif</url>
			<link>http://blog.sohu.com/</link>
			<width>100</width>
			<height>43</height>
			<description>搜狐博客</description>
		</image>
		<item>
			<title>可空类型（C# 编程指南)</title>
			<link>http://windowsapi.blog.sohu.com/84444631.html</link>
			<comments>http://windowsapi.blog.sohu.com/84444631.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Sat, 12 Apr 2008 12:11:36 +0800</pubDate>
			<category>C#</category>
			<guid>http://windowsapi.blog.sohu.com/84444631.html</guid>
			<description><![CDATA[<p><font color="#000000">可空类型是 System.Nullable 结构的实例。可空类型可以表示其基础值类型正常范围内的值，再加上一个 <strong>null</strong> 值。例如，Nullable&lt;Int32&gt;，读作&ldquo;可空的 Int32&rdquo;，可以被赋值为 -2147483648 到 2147483647 之间的任意值，也可以被赋值为 <strong>null</strong> 值。Nullable&lt;bool&gt; 可以被赋值为 <strong>true</strong> 或 <strong>false</strong>，或 <strong>null</strong>。在处理数据库和其他包含可能未赋值的元素的数据类型时，将 <strong>null</strong> 赋值给数值类型或布尔型的功能特别有用。例如，数据库中的布尔型字段可以存储值 <strong>true</strong> 或 <strong>false</strong>，或者，该字段也可以未定义。 </font></p>
<div>
<div>
<div><font color="#000000">C#</font></div></div><pre><font color="#000000"><span style="COLOR: blue">class</span> NullableExample<br />{<br />    <span style="COLOR: blue">static</span> <span style="COLOR: blue">void</span> Main()<br />    {<br />        <span style="COLOR: blue">int</span>? num = <span style="COLOR: blue">null</span>;<br />        <span style="COLOR: blue">if</span> (num.HasValue == <span style="COLOR: blue">true</span>)<br />        {<br />            System.Console.WriteLine(&quot;num = &quot; + num.Value);<br />        }<br />        <span style="COLOR: blue">else</span><br />        {<br />            System.Console.WriteLine(&quot;num = Null&quot;);<br />        }<br /><br />        <span style="COLOR: green">//y is set to zero</span><br />        <span style="COLOR: blue">int</span> y = num.GetValueOrDefault();<br /><br />        <span style="COLOR: green">// num.Value throws an InvalidOperationException if num.HasValue is false</span><br />        <span style="COLOR: blue">try</span><br />        {<br />            y = num.Value;<br />        }<br />        <span style="COLOR: blue">catch</span> (System.InvalidOperationException e)<br />        {<br />            System.Console.WriteLine(e.Message);<br />        }<br />    }<br />}<br /></font></pre></div>
<p><font color="#000000">以上将显示输出：</font></p>
<p><font color="#000000"><tt>num = Null</tt></font> </p>
<p><font color="#000000"><tt>Nullable object must have a value.</tt></font> </p>
<h1><font color="#000000">可空类型概述</font></h1>
<div>
<p><font color="#000000">可空类型具有以下特性：</font></p>
<ul>
<li>
<p><font color="#000000">可空类型表示可被赋值为 <strong>null</strong> 值的值类型变量。无法创建基于引用类型的可空类型。（引用类型已支持 <strong>null</strong> 值。）。</font></p>
</li><li>
<p><font color="#000000">语法 <strong>T?</strong> 是 System.Nullable&lt;T&gt; 的简写，此处的 <strong>T</strong> 为值类型。这两种形式可以互换。</font></p>
</li><li>
<p><font color="#000000">为可空类型赋值与为一般值类型赋值的方法相同，如 <tt>int? x = 10; </tt>或 <tt>double? d = 4.108;</tt>。</font></p>
</li><li>
<p><font color="#000000">如果基础类型的值为 <strong>null</strong>，请使用 System.Nullable.GetValueOrDefault 属性返回该基础类型所赋的值或默认值，例如 <tt>int j = x.GetValueOrDefault();</tt></font></p>
</li><li>
<p><font color="#000000">请使用 HasValue 和 Value 只读属性测试是否为空和检索值，例如 <tt>if(x.HasValue) j = x.Value;</tt></font></p>
<ul>
<li>
<p><font color="#000000">如果此变量包含值，则 <strong>HasValue</strong> 属性返回 True；或者，如果此变量的值为空，则返回 False。</font></p>
</li><li>
<p><font color="#000000">如果已赋值，则 <strong>Value</strong> 属性返回该值，否则将引发 System.InvalidOperationException。</font></p>
</li><li>
<p><font color="#000000">可空类型变量的默认值将 <strong>HasValue</strong> 设置为 <strong>false</strong>。未定义 <strong>Value</strong>。</font></p></li></ul>
</li><li>
<p><font color="#000000">使用 <strong>??</strong> 运算符分配默认值，当前值为空的可空类型被赋值给非空类型时将应用该默认值，如 <tt>int? x = null; int y = x ?? -1;</tt>。</font></p>
</li><li>
<p><font color="#000000">不允许使用嵌套的可空类型。将不编译下面一行：<tt>Nullable&lt;Nullable&lt;int&gt;&gt; n;</tt></font></p></li></ul></div>]]></description>
		</item>
		    
		
		<item>
			<title>IIS的性能优化</title>
			<link>http://windowsapi.blog.sohu.com/83478170.html</link>
			<comments>http://windowsapi.blog.sohu.com/83478170.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Tue, 1 Apr 2008 15:55:16 +0800</pubDate>
			<category>WEB</category>
			<guid>http://windowsapi.blog.sohu.com/83478170.html</guid>
			<description><![CDATA[管理互联网信息服务器（Internet Information
Server，IIS）的人们都知道，IIS是一个既简单又麻烦的家伙。简单的是安装它几乎不需要费什么脑筋，选择一下路径，然后一路按&ldquo;下一步&rdquo;就可以
完成；配置也比较简单，只要有一定的NT和网络知识，照着说明书就可以架设一个像模像样的Web站点出来。然而管理IIS却没有想像的那样简单。使用一段
时间以后，管理员往往会遇上服务器性能不良的情况。这时候，IIS的性能优化，就提上日程了。导致IIS服务性能不良的原因有两个方面。一个是人为的，也
就是说管理员在安装、配置IIS的时候没有进行优化或者配置错误。另一个则是客观上的，随着运行的服务种类，以及访问人数的增加，服务器原有的硬件配置已
不能满足要求了，这就需要提高硬件配置。<br /><strong>在服务器配置上优化IIS性能</strong>　<br />1.IIS高速缓存是对IIS进行优化时要考虑的最重要的项目之一。服务器保留了一部分内存空间用作IIS高速缓存，为将来的请求存储对象，这样IIS就可从高速缓存中检索对象而不用从硬盘中检索。调整IIS高速缓存的容量需要修改注册表，表项如下：<pre>\HKEY_LOCAL_MACHINE<br />\System<br />\CurrentControlSet<br />\Services<br />\InetInfo<br />\Parameters<br />\MemoryCacheSize</pre>MemoryCacheSize
的范围是从0道4GB，缺省值为3072000（3MB）。IIS通过高速缓存系统句柄、目录列表以及其他常用数据的值来提高系统的性能。这个参数指明了
分配给高速缓存的内存大小。如果该值为0，那就意味着&ldquo;不进行任何高速缓存&rdquo;。在这种情况下系统的性能可能会降低。如果你的服务器网络通讯繁忙，并且有足
够的内存空间，可以考虑增大该值。必须注意的是修改注册表后，需要重新启动才能使新值生效。<br />2.使IIS使用处理器时间最长。服务器的CPU处理器能力总是有限的。哪一个应用程序占用处理器的时间最长，谁的性能就能得到最大的提高。<br />（1）在NT的控制面板中，双击系统图标。<br />（2）单击性能标签。<br />（3）在应用程序性能下将游标拖到None的位置，这样就可以使所有正在运行的服务，包括IIS，使用处理器的时间达到最大值。<br />3．
服务器属性设置。在服务器属性里有一项可以使网络应用程序的总处理能力最大的选项，你当然应该选择它。(1)在桌面上右键单击网络邻居图标，然后选择属性
选项。(2)单击&ldquo;服务标签&rdquo;。(3)单击&ldquo;服务器&rdquo;，然后按&ldquo;属性&rdquo;。(4)选择最大化网络应用程序的总处理能力。然后单击&ldquo;OK。&rdquo;提高硬件配置来优
化IIS性能当进行了上述的优化配置，IIS的性能仍然没有什么明显改善的话，也许你应该考虑提高服务器配置了。然而事关银子问题，老板们一定不会轻易同
意，除非你用事实说服他。你必须在首先提高什么硬件配置上面考虑清楚。以下是在进行IIS优化时需要考虑的有关硬件：处理器：可以升级为速度更快的
CPU，还可以再增加一个CPU。但是代价太高了（也许会换主板什么的），老板很难接受。硬盘：硬盘空间被NT和IIS服务以如下两种方式使用：一种是简
单地存储数据；另一种是作为虚拟内存使用。如果使用Ultra2的SCSI硬盘，可以显著提高IIS的性能。网络接口卡：如果服务器是在企业内部网上运
行，那么可以考虑将他的网卡升级为100M网卡。这在网络带宽是瓶颈的情况下特别有效。内存：增加内存可能是升级系统最简单、最有效的方法。也是笔者推荐
的硬件升级首选方案。那么如何知道需要进行硬件上的升级呢？这就和性能监视器的使用有关了。笔者会在其他文章中描述。在这里作简要介绍：比如你可以利用性
能监视器来跟踪服务器上的CPU使用程度。并可以查看由内存调换到硬盘中的页面的数目和频率。将这些信息与内存使用情况以及其他系统信息相结合，就可以得
到一张系统性能报告表。如果这些信息一直表现出很高的使用率，那么就说明应该升级硬件设备了。优化IIS的注意事项为了避免以后的头疼，在安装IIS之时
就应该注意到IIS的优化。比如：为了提高性能和节约资源，应该只运行需要的协议。这一点很多管理员都没有注意，笔者曾见到在一台只作Web服务的机器上
同时安装有NetBEUI、Tcp/IP和IPX协议。显然这是不合理的。应该将IIS服务器，设置为独立的服务器，不要让服务器去承受域控制器要求的额
外负荷。试想：服务器一边在响应用户的登录，一边还要提供IIS服务，性能能不下降吗？可以把NT服务器的页交换文件分布到多个物理磁盘上，注意是多个
&ldquo;物理磁盘&rdquo;，分布在多个分区上是无效的。另外，不要将页交换文件放在与WIndows NT引导区相同的分区中。<br />4．使用磁盘镜像或磁盘带区集可以提高磁盘的读取性能。<br />5．关于日志的记录，应该采用文件记录而不是记录到ODBC数据源。此外，还可以在记录期间增加用来记录日志的内存缓冲区的容量来减少磁盘的活动。该缓冲区的缺省容量值为64KB。<br />6．最好把所有的数据都储存在一个单独的分区里。然后定期运行磁盘碎片整理程序以保证在存储Web服务器数据的分区中没有碎片。使用NTFS有助于减少碎片。笔者推荐使用Norton的 Speeddisk，可以很快地整理NTFS分区。<br />7．虽然SSL可以提供相当可靠的加密传输。但是所需的额外开销会导致IIS服务器速度下降，尤其是在处理大型文件的时候。所以应该只对确实需要保护的目录进行SSL加密。]]></description>
		</item>
		    
		
		<item>
			<title>概念：URI</title>
			<link>http://windowsapi.blog.sohu.com/82391767.html</link>
			<comments>http://windowsapi.blog.sohu.com/82391767.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Fri, 21 Mar 2008 11:53:31 +0800</pubDate>
			<category>WEB</category>
			<guid>http://windowsapi.blog.sohu.com/82391767.html</guid>
			<description><![CDATA[
			
            
			1.什么是URI<br />
Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过通<br />
用资源标志符（Universal Resource Identifier, 简称&quot;URI&quot;）进行定位。 <br />
URI一般由三部分组成：<br />
访问资源的命名机制。 <br />
存放资源的主机名。 <br />
资源自身的名称，由路径表示。 <br />
考虑下面的URI，它表示了当前的HTML 4.0规范： <br />
&nbsp; &nbsp;&nbsp;&nbsp;<a href="http://www.webmonkey.com.cn/html/html40/" target="_blank">http://www.webmonkey.com.cn/html/html40/</a><br />
这个URI是这样的：这是一个可通过HTTP协议访问的资源，位于主<br />
机<a href="http://www.webmonkey.com.cn%e4%b8%8a/" target="_blank">www.webmonkey.com.cn上</a>，通过路径&ldquo;/html/html40&rdquo;访问。在HTML文档中<br />
其它资源包括&quot;mailto&quot;（收发email）和&quot;ftp&quot;（FTP访问）。 <br />
这是URI的另一个例子，指向一个用户的邮箱：<br />
&lt;A href=&quot;Joe'&gt;mailto:<a href="mailto:joe@someplace.com">joe@someplace.com</a>&quot;&gt;Joe Cool&lt;/A&gt;<br />
注：大多数读者可能熟悉&quot;URL&quot;，而不是URI。URL是URI命名机制的一个子集。<br />
片段标志符<br />
有的URI指向一个资源的内部。 这种URI以&quot;#&quot;结束，并跟着一个anchor标志<br />
符（称为片段标志符）。例如，下面是一个指向section_2的URI：<br />
<a href="http://somesite.com/html/top.htm#section_2" target="_blank">http://somesite.com/html/top.htm#section_2</a><br />
相对URI<br />
相对URI 不包含任何命名规范信息。它的路径通常指同一台机器上的资源。相<br />
对URI可能含有相对路径（如，&ldquo;..&rdquo;表示上一层路径），还可能包含片段标<br />
志符。<br />
为了说明相对URI，假设我们有一个基本的URI <a href="http://www.acme.com/support/intro.htm" target="_blank">http://www.acme.com/support/intro.htm</a><br />
下面的链接中使用了相对URI：<br />
&nbsp; &nbsp;&nbsp;&nbsp;&lt;A href=&quot;suppliers.htm&quot;&gt;Suppliers&lt;/A&gt;<br />
它扩展成完全的URI就是 &quot;<a href="http://www.acme.com/support/suppliers.htm" target="_blank">http://www.acme.com/support/suppliers.htm</a>&quot;， <br />
下面是一个图像的相对URI：<br />
&nbsp; &nbsp;&nbsp;&nbsp;&lt;IMG src=&quot;../icons/logo.gif&quot; alt=&quot;logo&quot;&gt;<br />
它扩展成完全的URI就是 &quot;<a href="http://www.acme.com/icons/logo.gif" target="_blank">http://www.acme.com/icons/logo.gif</a>&quot;。<br />
在HTML中，URI被用来：<br />
链接到另一个文档或资源(参看A和LINK元素)。 <br />
链接到一个外部样式表或脚本(参看LINK和SCRIPT元素)。 <br />
在页内包含图像、对象或applet(参看IMAG、OBJECT、APPLET和INPUT<br />
元素)。 <br />
建立图像映射(参看MAP和AREA元素)。 <br />
提交一个表单(参看FORM)。 <br />
建立一个框架文档(参看FRAME和IFRAME元素)。 <br />
引用一个外部参考(参看Q、BLOCKQUOTE, INS和DEL元素)。 <br />
指向一个描述文档的metadata(参看HEAD元素)。<br />
<br />
2.什么是URL：<br />
&nbsp; &nbsp;&nbsp; &nbsp; URL是Uniform Resource
Location的缩写，译为&ldquo;统一资源定位符&rdquo;。通俗地说，URL是Internet上用来描述信息资源的字符串，主要用在各种WWW客户程序和服务器
程序上，特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源，包括文件、服务器的地址和目录等。 <br />
◇ URL的格式<br />
URL的格式由下列三部分组成： <br />
第一部分是协议（或称为服务方式）； <br />
第二部分是存有该资源的主机IP地址（有时也包括端口号）； <br />
第三部分是主机资源的具体地址。，如目录和文件名等。 <br />
第一部分和第二部分之间用&ldquo;：//&rdquo;符号隔开，第二部分和第三部分用&ldquo;/&rdquo;符号隔开。第一部分和第二部分是不可缺少的，第三部分有时可以省略。<br />
◇ URL示例 <br />
文件的URL： <br />
用URL表示文件时，服务器方式用file表示，后面要有主机IP地址、文件的存取路径（即目录）和文件名等信息。有时可以省略目录和文件名，但&ldquo;/&rdquo;符号不能省略。<br />
例一：file://ftp.yoyodyne.com/pub/files/foobar.txt<br />
代表存放主机ftp.yoyodyne.com上的pub/files/目录下的一个文件，文件名是foobar.txt。<br />
例二：file://ftp.yoyodyne.com/pub<br />
代表主机ftp.yoyodyne.com上的目录/pub。<br />
例三：file://ftp.yoyodyne.com/<br />
代表主机ftp.yoyodyne.com上的根目录。<br />
Gopher的URL： <br />
Gopher服务器有可能使用特殊的端口，在这种情况下，主机IP地址与端口之间要用&ldquo;：隔开。<br />
例一：gopher://gopher.yoyodyne.com/<br />
表示主机gopher.yoyodyne.com上的gopher服务器。<br />
例二：gopher://gopher.banzai.edu:1234<br />
表示主机gopher.banzai.edu上的gopher服务器，在端口1234上。<br />
网络新闻的URL： <br />
利用URL表示网络新闻组时，如果是usenet的话只要指定出新闻组的名字即可。<br />
例如：news:rec.gardening<br />
表示usenet上的rec.gardening新闻组（园艺）。<br />
HTTP的 URL：<br />
使用超级文本传输协议HTTP，提供超级文本信息服务的资源。<br />
例一：<a href="http://www.peopledaily.com.cn/channel/welcome.htm" target="_blank">http://www.peopledaily.com.cn/channel/welcome.htm</a><br />
其计算机域名为<a href="http://www.peopledaily.com.cn/" target="_blank">www.peopledaily.com.cn</a>。超级文本文件（文件类型为.html）是在目录/channel下的welcome.htm。这是中国人民日报的一台计算机。<br />
例二：<a href="http://www.rol.cn.net/talk/talk1.htm" target="_blank">http://www.rol.cn.net/talk/talk1.htm</a><br />
其其计算机域名为<a href="http://www.rol.cn.net/" target="_blank">www.rol.cn.net</a>。超级文本文件（文件类型为.html）是在目录/talk下的talk1.htm。这是瑞得聊天室的地址，可由此进入瑞得聊天室的第1室。<br />
<br />
URI、URL和URN之间的区别与联系<br />
URI：Uniform Resource Identifier，统一资源标识符；<br />
URL：Uniform Resource Locator，统一资源定位符；<br />
URN：Uniform Resource Name，统一资源名称。<br />
其中，URL,URN是URI的子集。<br />
Web上地址的基本形式是URI,它代表统一资源标识符。有两种形式：<br />
URL：目前URI的最普遍形式就是无处不在的URL或统一资源定位器。<br />
URN：URL的一种更新形式，统一资源名称(URN, Uniform Resource Name)不依赖于位置，并且有可能减少失效连接的个数。但是其流行还需假以时日，因为它需要更精密软件的支持。<br />
URI是以某种统一的（标准化的）方式标识资源的简单字符串。<br />
URI一般由三部分组成：<br />
1. 访问资源的命名机制。 <br />
2. 存放资源的主机名。 <br />
3. 资源自身的名称，由路径表示。 <br />
典型情况下，这种字符串以scheme（命名URI的名字空间的标识符&mdash;&mdash;一组相关的名称）开头，语法如下：<br />
[scheme:] scheme-specific-part <br />
URI以scheme和冒号开头。Scheme用大写/小写字母开头，后面为空或者跟着更多的大写/小写字母、数字、加号、减号和点号。冒号把
scheme与scheme-specific-part分开了，并且scheme-specific-part的语法和语义（意思）由URI的名字空间
决定。如下面的例子：<br />
<a href="http://www.cnn.com/" target="_blank">http://www.cnn.com</a>，其中http是scheme，//<a href="http://www.cnn.com%e6%98%af/" target="_blank">www.cnn.com是</a> scheme-specific-part，并且它的scheme与scheme-specific-part被冒号分开了。<br />
URI有绝对和相对之分，绝对的URI指以scheme（后面跟着冒号）开头的URI。前面提到的<a href="http://www.cnn.com%e5%b0%b1%e6%98%af%e7%bb%9d%e5%af%b9%e7%9a%84uri%e7%9a%84%e4%b8%80%e4%b8%aa%e4%be%8b%e5%ad%90/" target="_blank">http://www.cnn.com就是绝对的URI的一个例子</a>，其它的例子还有mailto:<a href="mailto:jeff@javajeff.com">jeff@javajeff.com</a>、news:comp.lang.java.help和xyz://whatever。你可以把绝对的URI看作是以某种方式引用某种资源，而这种方式对标识符出现的环境没有依赖。如果使用文件系统作类比，绝对的URI类似于从根目录开始的某个文件的径。 <br />
与绝对的URI不同的，相对的URI不是以scheme（后面跟着冒号）开始的URI。
它的一个例子是articles/articles.html。你可以把相对的URI看作是以某种方式引用某种资源，而这种方式依赖于标识符出现的环境。
如果用文件系统作类比，相对的URI类似于从当前目录开始的文件路径。<br />
URL是Uniform Resource
Location的缩写，译为&quot;统一资源定位符&quot;。通俗地说，URL是Internet上用来描述信息资源的字符串，主要用在各种WWW客户程序和服务器
程序上，特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源，包括文件、服务器的地址和目录等。 <br />
URL的格式由下列三部分组成： <br />
第一部分是协议（或称为服务方式）； <br />
第二部分是存有该资源的主机IP地址（有时也包括端口号）； <br />
第三部分是主机资源的具体地址。，如目录和文件名等。 <br />
第一部分和第二部分之间用&quot;：//&quot;符号隔开，第二部分和第三部分用&quot;/&quot;符号隔开。第一部分和第二部分是不可缺少的，第三部分有时可以省略。<br />
目前最大的缺点是当信息资源的存放地点发生变化时，必须对URL作相应的改变。因此人们正在研究新的信息资源表示方法，例如：URI(Universal
Resource Identifier)即&quot;通用资源标识&quot;（参见RFC 1630）、URN（Uniform Resource
Name）即&quot;统一资源名&quot;和URC（Uniform Resource Citation）即&quot;统一资源引用符&quot;等。<br />
URI目前还处在进一步的研究当中。研究的方向就是弥补URL目前存在的缺点。 <br />
]]></description>
		</item>
		    
		
		<item>
			<title>初学Javascript之cookie篇(译)</title>
			<link>http://windowsapi.blog.sohu.com/82205718.html</link>
			<comments>http://windowsapi.blog.sohu.com/82205718.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Wed, 19 Mar 2008 13:28:39 +0800</pubDate>
			<category>WEB</category>
			<guid>http://windowsapi.blog.sohu.com/82205718.html</guid>
			<description><![CDATA[<p>译者注：将本文的最后示例代码拷贝至文本文件中,更名文件为homepage.htm格式文件，在浏览器中运行，本文以该示例代码讲解</p>
<p>
<table align="left">
<tbody>
<tr>
<td align="left"><img src="http://www.pconline.com.cn/images/ad2.gif" height="9" width="112" /><br />
<a style="left: 0px ! important; top: 0px ! important;" title="点击这里使 Adblock Plus 过滤该对象" href="http://image.pconline.com.cn/ad/200312/guofeng_320.swf"></a></td></tr></tbody></table>&nbsp; 简介</p>
<p>&nbsp; ====================================</p>
<p>&nbsp; 问题是我想解决自动访问http://www.thehungersite.com。这个页面能够限制你每一天只访问它一次（不要忘记在这链接上点击）。<br />&nbsp; 现在为止，每次一开始我做的第一件事就是手工选择我的书签加载这个页面。</p>
<p>&nbsp; 为什么不为它创建一个简单的脚本程序呢？<br />&nbsp; 因为我想让它在Netscape和IE下都能够同样的工作，我开始学习Javascript。</p>
<p>&nbsp; 解决</p>
<p>&nbsp; ====================================</p>
<p>&nbsp; 主题思想很简单：创建一个页面并测试一下今天这个页面是否已被加载过，<br />&nbsp; 如果没有加载，那就通过它链接到http://www.thehungersite.com，并且设置<br />&nbsp; 这个页面作为浏览器的主页。</p>
<p>&nbsp; 获取页面并重定向是很容易的，问题是如何记忆这个页面已被访问过。</p>
<p>&nbsp; 因为Javascript没有文件访问的功能，看来我们只能使用cookies了。</p>
<p>&nbsp; Cookies是一个有大小限制的变量，它与一个服务器的域名相关联，<br />&nbsp; 默认情况下cookie的生存期是当浏览器关闭时被清空（注意：不是当你离开<br />&nbsp; 这个页面的时候），但可以用一个脚本程序改变这种情况，<br />&nbsp; 在用户关闭浏览器后使cookies能够存储下来，Netscape在文件中使用所有的<br />&nbsp; Cookie，而IE分别存储每个cookie。此外，不同的浏览器会带来一些意想<br />&nbsp; 不到的情况，你必须确定一个用户在它的浏览器设置中是否关闭了cookies。</p>
<p>&nbsp; 一切都很好也很妙，只是现在我还未在IE中测试它，调用示例Javascript语句：<br />&nbsp; cookieExpires = &quot;01-APR-&quot; + nLyear + &quot; GMT&quot;;<br />&nbsp; document.cookies = cookieName + &quot;=&quot; + cookieValue + &quot;;&nbsp; expires=&quot; + cookieExpires;</p>
<p>&nbsp; 然后调用<br />&nbsp; document.write(document.cookie);</p>
<p>&nbsp; document.cookie是空的。</p>
<p>&nbsp; 在试验和研究了一下上面的示例程序后，会发现：</p>
<p>&nbsp; 1。你不能够读和显示cookie。如果你想看一下这个cookie你需要指定与它相同的另一个字符串变量，如下：<br />&nbsp;&nbsp; document.cookie = cookieName + &quot;=&quot; + cookieValue + &quot;; expires=&quot; + cookieExpires;<br />&nbsp;&nbsp; myvar = cookieName + &quot;=&quot; + cookieValue + &quot;; expires=&quot; + cookieExpires;<br />&nbsp;&nbsp; document.write(myvar);</p>
<p>&nbsp; 2. 浏览器用了不同的日期格式：<br />&nbsp;&nbsp;&nbsp; Netscape使用&quot;GMT&quot;结束，IE使用&ldquo;UTC&quot;，这是因为它可以更好的构建一个日期，象下面这样：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var expdate = new Date()<br />&nbsp;&nbsp; cookieExpires.setTime (expdate.getTime() + 1 * (24 * 60 * 60 * 1000)) //+1 day<br />&nbsp;&nbsp; cookieExpires.toGMTString()</p>
<p>&nbsp;&nbsp; 当你显示日期部分<br />&nbsp;&nbsp; document.write(expdate.getYear() + &quot;&lt;br&gt;&quot; + expdate.getMonth() + &quot;&lt;br&gt;&quot; + expdate.getDate());<br />&nbsp;&nbsp; 对于2000-11-15的日期，在IE中显示为2000/10/15，在Netscape下显示100/10/15（注：已确定是一些较低版本的<br />&nbsp;&nbsp; Netscape 浏览器的Y2K问题）</p>
<p>&nbsp;&nbsp; 示例中看到像下面这样的部分：<br />&nbsp;&nbsp; if (platform == &quot;Mac&quot;) {<br />&nbsp; &nbsp;lastVisit = lastVisit - (24 * 60 * 60 * 1000)<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; 但我不可能检测它。</p>
<p>&nbsp; 日期对象有getDate和getDay的方法，第二个方法返回在一周中天的索引号。</p>
<p>----------------------------------------<br />&nbsp; 知道了这些，基本上就没问题了（现在你可以看一下homepage.htm)</p>
<p>［译者注：将本文的最后示例代码拷至文本文件中并保存htm格式，然后运行]</p>
<p>&nbsp; 最后要说明的是，这不仅是一个专用的JS脚本，如果你想将它用在你的web页面上你必须最小程度的使用不同的浏览器测试它并注意它们的版本，许多的脚本程序包含了浏览器类型检测和大量的if...else语句，以处理这样不同。</p>
<p>&nbsp; 示例页面homepage.htm源代码</p>
<p>&nbsp; &lt;html&gt;<br />&nbsp; &lt;head&gt;<br />&nbsp; &lt;title&gt;Homepage&lt;/title&gt;<br />&nbsp; &lt;/head&gt;<br />&nbsp; &lt;body&gt;<br />&nbsp; &lt;a href='http://www.thehungersite.com/'&gt;Manual redirection&lt;br&gt;&lt;/a&gt;<br />&nbsp; &lt;a href=&quot;javascript:ResetCookie()&quot;&gt;Cookie reset&lt;/a&gt;</p>
<p>&nbsp; &lt;script language=&quot;JavaScript&quot;&gt;<br />&nbsp; &lt;!-- <br />&nbsp; var bVisitedToday = false;</p>
<p>&nbsp; var lastVisit = GetCookie(&quot;lastVisit&quot;);<br />&nbsp; if (lastVisit != null) <br />&nbsp; {<br />&nbsp; lastVisit = 1 * lastVisit;<br />&nbsp; var lastHere = new Date(lastVisit);&nbsp; <br />&nbsp; var rightNow = new Date();</p>
<p>&nbsp; if(lastHere.getYear() == rightNow.getYear()<br />&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; lastHere.getMonth() == rightNow.getMonth()<br />&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; lastHere.getDate() == rightNow.getDate())<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; bVisitedToday = true;<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp; }</p>
<p>&nbsp; if(bVisitedToday == false)<br />&nbsp; {<br />&nbsp; setLastlastVisitCookie();<br />&nbsp; window.location=&quot;http://www.thehungersite.com/&quot;<br />&nbsp; }<br />&nbsp; else<br />&nbsp; {<br />&nbsp; //window.location=&quot;about:blank&quot;<br />&nbsp; }</p>
<p>&nbsp; function getCookieVal (offset)<br />&nbsp; {<br />&nbsp; var endstr = document.cookie.indexOf (&quot;;&quot;, offset);<br />&nbsp; if (endstr == -1)<br />&nbsp;&nbsp;&nbsp; endstr = document.cookie.length;<br />&nbsp; return unescape(document.cookie.substring(offset, endstr));<br />&nbsp; }<br />&nbsp; function GetCookie (name)&nbsp;<br />&nbsp; {<br />&nbsp; var arg = name + &quot;=&quot;;<br />&nbsp; var alen = arg.length;<br />&nbsp; var clen = document.cookie.length;<br />&nbsp; var i = 0;<br />&nbsp; while (i &lt; clen) {<br />&nbsp;&nbsp;&nbsp; var j = i + alen;<br />&nbsp;&nbsp;&nbsp; if (document.cookie.substring(i, j) == arg)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getCookieVal (j);<br />&nbsp;&nbsp;&nbsp; i = document.cookie.indexOf(&quot; &quot;, i) + 1;<br />&nbsp;&nbsp;&nbsp; if (i == 0) break; <br />&nbsp; }<br />&nbsp; return null;<br />&nbsp; }<br />&nbsp; function SetCookie (name, value)<br />&nbsp; {<br />&nbsp; var argv = SetCookie.arguments;<br />&nbsp; var argc = SetCookie.arguments.length;<br />&nbsp; var expires = (argc &gt; 2) ? argv[2] : null;<br />&nbsp; var path = (argc &gt; 3) ? argv[3] : null;<br />&nbsp; var domain = (argc &gt; 4) ? argv[4] : null;<br />&nbsp; var secure = (argc &gt; 5) ? argv[5] : false;<br />&nbsp; document.cookie = name + &quot;=&quot; + escape (value) +<br />&nbsp;&nbsp;&nbsp; ((expires == null) ? &quot;&quot; : (&quot;; expires=&quot; + expires.toGMTString())) +<br />&nbsp;&nbsp;&nbsp; ((path == null) ? &quot;&quot; : (&quot;; path=&quot; + path)) +<br />&nbsp;&nbsp;&nbsp; ((domain == null) ? &quot;&quot; : (&quot;; domain=&quot; + domain)) +<br />&nbsp;&nbsp;&nbsp; ((secure == true) ? &quot;; secure&quot; : &quot;&quot;);<br />&nbsp; }<br />&nbsp; function setLastlastVisitCookie ()<br />&nbsp; {<br />&nbsp; var rightNow = new Date();<br />&nbsp; var expdate = new Date();<br />&nbsp; expdate.setTime (expdate.getTime() + 1 * (24 * 60 * 60 * 1000)); //+1 day<br />&nbsp; SetCookie (&quot;lastVisit&quot;, rightNow.getTime(), expdate, &quot;/&quot;);<br />&nbsp; }<br />&nbsp; function ResetCookie()<br />&nbsp; {<br />&nbsp; &nbsp; SetCookie(&quot;lastVisit&quot;, 0, null, &quot;/&quot;);<br />&nbsp; }<br />&nbsp; // --&gt;<br />&nbsp; &lt;/script&gt;<br />&nbsp; &lt;/body&gt;<br />&nbsp; &lt;/html&gt; </p>]]></description>
		</item>
		    
		
		<item>
			<title>关于document.cookie的使用 </title>
			<link>http://windowsapi.blog.sohu.com/82204679.html</link>
			<comments>http://windowsapi.blog.sohu.com/82204679.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Wed, 19 Mar 2008 13:21:30 +0800</pubDate>
			<category>WEB</category>
			<guid>http://windowsapi.blog.sohu.com/82204679.html</guid>
			<description><![CDATA[<span>我们已经知道，在 document 对象中有一个 cookie 属性。但是
Cookie 又是什么？&ldquo;某些 Web 站点在您的硬盘上用很小的文本文件存储了一些信息，这些文件就称为 Cookie。&rdquo;&mdash;&mdash; MSIE
帮助。一般来说，Cookies 是 CGI 或类似，比 HTML 高级的文件、程序等创建的，但是 javascript 也提供了对
Cookies 的很全面的访问权利。<br /><br />　　我们先要学一学 Cookie 的基本知识。<br /><br />　　每个 Cookie 都是这样的：&lt;cookie名&gt;=&lt;值&gt;<br /><br />　
　&lt;cookie名&gt;的限制与 javascript 的命名限制大同小异，少了&ldquo;不能用 javascript
关键字&rdquo;，多了&ldquo;只能用可以用在 URL
编码中的字符&rdquo;。后者比较难懂，但是只要你只用字母和数字命名，就完全没有问题了。&lt;值&gt;的要求也是&ldquo;只能用可以用在 URL
编码中的字符&rdquo;。<br /><br />　　每个 Cookie 都有失效日期，一旦电脑的时钟过了失效日期，这个 Cookie 就会被删掉。我们不能直接删掉一个 Cookie，但是可以用设定失效日期早于现在时刻的方法来间接删掉它。<br /><br />　
　每个网页，或者说每个站点，都有它自己的 Cookies，这些 Cookies
只能由这个站点下的网页来访问，来自其他站点或同一站点下未经授权的区域的网页，是不能访问的。每一&ldquo;组&rdquo;Cookies 有规定的总大小（大约
2KB 每&ldquo;组&rdquo;），一超过最大总大小，则最早失效的 Cookie 先被删除，来让新的 Cookie&ldquo;安家&rdquo;。<br /><br />　　现在我们来学习使用 documents.cookie 属性。<br /><br />　
　如果直接使用 documents.cookie 属性，或者说，用某种方法，例如给变量赋值，来获得 documents.cookie
的值，我们就可以知道在现在的文档中有多少个 Cookies，每个 Cookies
的名字，和它的值。例如，在某文档中添加&ldquo;document.write(documents.cookie)&rdquo;，结果显示：<br /><br />name=kevin; email=kevin@kevin.com; lastvisited=index.html<br /><br />这
意味着，文档包含 3 个 Cookies：name, email 和 lastvisited，它们的值分别是 kevin,
kevin@kevin.com 和 index.html。可以看到，两个 Cookies 之间是用分号和空格隔开的，于是我们可以用
cookieString.split('; ') 方法得到每个 Cookie 分开的一个数组（先用 var cookieString =
documents.cookie）。<br /><br />　　设定一个 Cookie 的方法是对 documents.cookie 赋值。与其它情况下的赋值不同，向 documents.cookie 赋值不会删除掉原有的 Cookies，而只会增添 Cookies 或更改原有 Cookie。赋值的格式：<br /><br />documents.cookie = 'cookieName=' + escape('cookievalue')<br />+ ';expires=' + expirationDateObj.toGMTString();<br /><br />是
不是看到头晕了呢？cookieName 表示 Cookie 的名称，cookievalue 表示 Cookie
的值，expirationDateObj
表示储存着失效日期的日期对象名，如果不需要指定失效日期，则不需要第二行。不指定失效日期，则浏览器默认是在关闭浏览器（也就是关闭所有窗口）之后过
期。<br /><br />　　首先 escape() 方法：为什么一定要用？因为 Cookie 的值的要求是&ldquo;只能用可以用在 URL
编码中的字符&rdquo;。我们知道&ldquo;escape()&rdquo;方法是把字符串按 URL 编码方法来编码的，那我们只需要用一个&ldquo;escape()&rdquo;方法来处理输出到
Cookie 的值，用&ldquo;unescape()&rdquo;来处理从 Cookie 接收过来的值就万无一失了。而且这两个方法的最常用途就是处理
Cookies。其实设定一个 Cookie 只是&ldquo;documents.cookie =
'cookieName=cookievalue'&rdquo;这么简单，但是为了避免在 cookievalue 中出现 URL
里不准出现的字符，还是用一个 escape() 好。<br />　　然后&ldquo;expires&rdquo;前面的分号：注意到就行了。是分号而不是其他。<br />　　最后 toGMTString() 方法：设定 Cookie 的时效日期都是用 GMT 格式的时间的，其它格式的时间是没有作用的。<br /><br />　　现在我们来实战一下。设定一个&ldquo;name=rose&rdquo;的 Cookie，在 3 个月后过期。<br /><br />var expires = new Date();<br />expires.setTime(expires.getTime() + 3 * 30 * 24 * 60 * 60 * 1000);<br />/* 三个月 x 一个月当作 30 天 x 一天 24 小时<br />x 一小时 60 分 x 一分 60 秒 x 一秒 1000 毫秒 */<br />documents.cookie = 'name=rose;expires=' + expires.toGMTString();<br /><br />为
什么没有用 escape() 方法？这是因为我们知道 rose 是一个合法的 URL 编码字符串，也就是说，'rose' ==
escape('rose')。一般来说，如果设定 Cookie 时不用 escape()，那获取 Cookie 时也不用 unescape()。<br /><br />　　再来一次：编写一个函数，作用是查找指定 Cookie 的值。<br /><br />function getCookie(cookieName) {<br />var cookieString = documents.cookie;<br />var start = cookieString.indexOf(cookieName + '=');<br />// 加上等号的原因是避免在某些 Cookie 的值里有<br />// 与 cookieName 一样的字符串。<br />if (start == -1) // 找不到<br />return null;<br />start += cookieName.length + 1;<br />var end = cookieString.indexOf(';', start);<br />if (end == -1) return unescape(cookieString.substring(start));<br />return unescape(cookieString.substring(start, end));<br />}<br /><br />这
个函数用到了字符串对象的一些方法，如果你不记得了（你是不是这般没记性啊），请快去查查。这个函数所有的 if 语句都没有带上
else，这是因为如果条件成立，程序运行的都是 return 语句，在函数里碰上 return，就会终止运行，所以不加 else
也没问题。该函数在找到 Cookie 时，就会返回 Cookie 的值，否则返回&ldquo;null&rdquo;。<br /><br />　　现在我们要删除刚才设定的 name=rose Cookie。<br /><br />var expires = new Date();<br />expires.setTime(expires.getTime() - 1);<br />documents.cookie = 'name=rose;expires=' + expires.toGMTString();<br /><br />可以看到，只需要把失效日期改成比现在日期早一点（这里是早 1 毫秒），再用同样的方法设定 Cookie，就可以删掉 Cookie 了。<br /><br />function setCookie(name, value) <br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.cookie = name + &quot;=&quot; + value <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.location.reload(); <br />&nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;<br />function readcookie(name)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var mycookie = document.cookie; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var start1 = mycookie.indexOf(name + &quot;=&quot;); <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (start1!= -1) <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; start=mycookie.indexOf(&quot;=&quot;,start1)+1;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var end = mycookie.indexOf(&quot;;&quot;,start); <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (end==-1) end=mycookie.length;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var value=unescape(mycookie.substring(start,end)); <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return value;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; } <br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; href=readcookie(&quot;href&quot;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(href==null)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $(&quot;#link&quot;).attr(&quot;href&quot;,&quot;1/css.css&quot;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $(&quot;#link&quot;).attr(&quot;href&quot;,href+&quot;/css.css&quot;);<br /></span>]]></description>
		</item>
		    
		
		<item>
			<title>ASP.NET2.0雷霆之怒盗链者的祝福</title>
			<link>http://windowsapi.blog.sohu.com/81832702.html</link>
			<comments>http://windowsapi.blog.sohu.com/81832702.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Sat, 15 Mar 2008 12:50:00 +0800</pubDate>
			<category>WEB</category>
			<guid>http://windowsapi.blog.sohu.com/81832702.html</guid>
			<description><![CDATA[<div>
					
					
					<p><font size="2">所谓<font color="#ff0000">盗链</font>就是指其他网站把我们站点的文件链接帖到他们站上，这样白白占用我们的带宽。访问对于网站盗链行为，是非常不道德的。要实现防盗链，我们就得在IIS处理URL时拦截。</font></p>
<p><font size="2">效果图：</font></p>
<p><font size="2"><strong>未加防盗链之前：hm是我的机器名，用http://hm/myweb/default.aspx和http://localhost/myweb/default访问结果一样。<br />
<img src="http://www.xrss.cn/XrssFile/2007-3/30/200733094314901.gif" alt="" />这幅图片是任人宰割的。</strong></font></p>
<p><font size="2"><strong>加了防盗链之后虽然还是同一个网站但是http://hm/myweb/default.aspx已经不能访问那副花卉图片，被以下图片替代：<br />
<img src="http://www.xrss.cn/XrssFile/2007-3/30/200733094315107.gif" alt="" /></strong></font></p>
<p><font size="2"><strong>加了防盗链之后用localhost还是正常的！http://localhost/myweb/default访问结果一样。<br />
<img src="http://www.xrss.cn/XrssFile/2007-3/30/200733094314901.gif" alt="" /><br />
</strong></font></p>
<p>&nbsp;</p>
<p><font size="2"><strong>原理：</strong></font></p>
<p><font size="2">其实hm是我的机器，但是由于服务器域名是localhost所以即使是同一个网站也不能访问，所以就更别说<br />
www.<font color="#ff0000">其他网站域名</font>.com这样的网站偷取我们的资源。关键就是IIS对所有的请求进行过滤看看是不是本站域名的。</font></p>
<p><font size="2"><strong>全部代码：</strong></font></p>
<p><font size="2"><strong>Web.Config<br />
</strong>&lt;?xml version=&quot;1.0&quot;?&gt;<br />
&lt;!-- <br />
&nbsp;&nbsp;&nbsp; 注意: 除了手动编辑此文件以外，您还可以使用 <br />
&nbsp;&nbsp;&nbsp; Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的<br />
&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;网站&rdquo;-&gt;&ldquo;Asp.Net 配置&rdquo;选项。<br />
&nbsp;&nbsp;&nbsp; 设置和注释的完整列表在 <br />
&nbsp;&nbsp;&nbsp; machine.config.comments 中，该文件通常位于 <br />
&nbsp;&nbsp;&nbsp; \Windows\Microsoft.Net\Framework\v2.x\Config 中<br />
--&gt;<br />
&lt;configuration&gt;<br />
&nbsp;&lt;appSettings/&gt;<br />
&nbsp;&lt;connectionStrings/&gt;<br />
&nbsp;&lt;system.web&gt;<br />
&nbsp;&nbsp;&nbsp;<strong><font color="#ff0000"> &lt;httpHandlers&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add verb=&quot;*&quot; path=&quot;*.jpg&quot; type=&quot;myhandler,App_Code&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/httpHandlers&gt;<br />
</font></strong>&nbsp;&nbsp;&nbsp; &lt;!-- <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置 compilation debug=&quot;true&quot; 将调试符号插入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 已编译的页面中。但由于这会 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 影响性能，因此只在开发过程中将此值 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置为 true。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&lt;compilation debug=&quot;true&quot;/&gt;<br />
&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过 &lt;authentication&gt; 节可以配置 ASP.NET 使用的 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安全身份验证模式，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以标识传入的用户。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&lt;authentication mode=&quot;Windows&quot;/&gt;<br />
&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果在执行请求的过程中出现未处理的错误，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 则通过 &lt;customErrors&gt; 节可以配置相应的处理步骤。具体说来，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开发人员通过该节可以配置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要显示的 html 错误页<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以代替错误堆栈跟踪。</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;customErrors mode=&quot;RemoteOnly&quot; defaultRedirect=&quot;GenericErrorPage.htm&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;error statusCode=&quot;403&quot; redirect=&quot;NoAccess.htm&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;error statusCode=&quot;404&quot; redirect=&quot;FileNotFound.htm&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/customErrors&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&lt;/system.web&gt;<br />
&lt;/configuration&gt;<br />
</font></p>
<p><font size="2"><strong>&nbsp;myhandler.cs&nbsp; 新建myhandler.cs&nbsp;类时系统提示你要放入<font color="#ff0000">App_Code</font>中<br />
</strong>using System;<br />
using System.Web;</font></p>
<p><font size="2">/// &lt;summary&gt;<br />
/// myhandler 的摘要说明<br />
/// &lt;/summary&gt;</font></p>
<p><font size="2">public class myhandler : IHttpHandler<br />
{<br />
&nbsp;&nbsp;&nbsp; public void ProcessRequest(HttpContext context)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string FileName = context.Server.MapPath(context.Request.FilePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (context.Request.UrlReferrer.Host == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = &quot;image/JPEG&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">context.Response.WriteFile(&quot;~/no.gif&quot;);//被替换图片<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (context.Request.UrlReferrer.Host.IndexOf(&quot;<strong>localhost</strong>&quot;) &gt; -1)//这里是你的域名</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = &quot;image/JPEG&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.WriteFile(FileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = &quot;image/JPEG&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.WriteFile(&quot;~/no.gif&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public bool IsReusable<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return true; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public myhandler()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="2"><strong>Default.aspx<br />
</strong>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</font></p>
<p><font size="2">&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt;<br />
&lt;head runat=&quot;server&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;清清月儿http://blog.csdn.net/21aspnet&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form id=&quot;form1&quot; runat=&quot;server&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;img src=&quot;pic130.jpg&quot; /&gt;&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</font></p>
<p><font size="2"><strong>pic130.jpg<br />
<img src="http://www.xrss.cn/XrssFile/2007-3/30/200733094315751.jpg" alt="" /></strong></font></p>
<p>&nbsp;</p>
<p><font size="2"><strong>no.gif<br />
<img src="http://www.xrss.cn/XrssFile/2007-3/30/200733094315543.gif" alt="" /></strong></font></p>
<p><font size="2"><strong>IIS的配置：<br />
<img style="display: block;" src="http://www.xrss.cn/XrssFile/2007-3/30/200733094315880.gif" alt="" width="450" /><br />
</strong></font></p>
<p><font size="2"><strong>配置应用程序扩展：添加一个.jpg的扩展！<br />
<img style="display: block;" src="http://www.xrss.cn/XrssFile/2007-3/30/200733094315662.gif" alt="" width="450" /></strong></font></p>
<p><font size="2"><strong>注意：在本地的</strong><font color="#ff0000">context.Request.UrlReferrer.Host就是localhost，<br />
我开始以为http://localhost/A/和http://localhost/B/是不同的</font><font size="3">context.Request.UrlReferrer.Host，那就是大错特错。</font><font size="3">http://localhost/A/</font><font color="#ff0000" size="3">和</font><font size="3">http://localhost/B/</font><font size="3">的context.Request.UrlReferrer.Host都是localhost，所以测试一个用localhost，</font>所以，本地测试用<strong>机器名</strong>例如我的是hm测试即可。经过处理后用机器名访问就不行，虽然还是同一个站点，同一个文件，此处请多注意。</font></p>
<p><font size="2"><font color="#ff0000"><strong>下面是怎么防rar文件不从主站下载：方法和图片类似，不过下载我们强迫他们到我们站点。</strong></font></font></p>
<p><font size="2">1、&nbsp; 首先创建一个类库项目ClassLibrary1：</font></p>
<p><font size="2">using System;</font></p>
<p><font size="2">using System.Web;&nbsp;&nbsp;&nbsp; // 引用System.Web组件</font></p>
<p><font size="2">&nbsp;</font></p>
<p><font size="2">&nbsp;</font></p>
<p><font size="2">&nbsp;public class MyHandler : IHttpHandler</font></p>
<p><font size="2">&nbsp;{</font></p>
<p><font size="2">&nbsp;&nbsp;public MyHandler()</font></p>
<p><font size="2">&nbsp;&nbsp;{</font></p>
<p><font size="2">&nbsp;&nbsp;}</font></p>
<p><font size="2">&nbsp;</font></p>
<p><font size="2">&nbsp;&nbsp;#region IHttpHandler 成员</font></p>
<p><font size="2">&nbsp;&nbsp;public void ProcessRequest(HttpContext context)</font></p>
<p><font size="2">&nbsp;&nbsp;{</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;// 跳转到WebForm1.aspx，由WebForm1.aspx输出rar文件</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;HttpResponse response = context.Response;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;response.Redirect(&quot;/manage/downloads.aspx&quot;);</font></p>
<p><font size="2">&nbsp;&nbsp;}</font></p>
<p><font size="2">&nbsp;</font></p>
<p><font size="2">&nbsp;&nbsp;public bool IsReusable</font></p>
<p><font size="2">&nbsp;&nbsp;{</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;get</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;{</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;// TODO:&nbsp; 添加 MyHandler.IsReusable getter 实现</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;return true;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;}</font></p>
<p><font size="2">&nbsp;&nbsp;}</font></p>
<p><font size="2">&nbsp;&nbsp;#endregion</font></p>
<p><font size="2">&nbsp;}</font></p>
<p><font size="2">&nbsp;</font></p>
<p><font size="2">2、&nbsp; 在配置文件Web.config文件节点里增加如下节点：</font></p>
<p><font size="2"><strong><font color="#ff0000">&nbsp;&lt;httpHandlers&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add verb=&quot;*&quot; path=&quot;*.rar&quot; type=&quot;myhandler,App_Code&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/httpHandlers&gt;</font></strong><br />
</font></p>
<p><font size="2">3、&nbsp; 在WebForm1.aspx里增加一个文本为&ldquo;下载&rdquo;的Button，其Click事件如下：</font></p>
<p><font size="2">注意别忘记了using System.IO;</font></p>
<p><font size="2">private void Button1_Click(object sender, System.EventArgs e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;FileInfo file = new System.IO.FileInfo(Server.MapPath(&quot;1.rar&quot;));<br />
&nbsp;&nbsp;&nbsp;Response.Clear();</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;Response.AddHeader(&quot;Content-Disposition&quot;, &quot;filename=&quot; + file.Name);</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;Response.AddHeader(&quot;Content-Length&quot;, file.Length.ToString());</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;string fileExtension = file.Extension;</font></p>
<p><font size="2">&nbsp;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;// 根据文件后缀指定文件的Mime类型</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;switch (fileExtension)</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;{</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;case &quot;.mp3&quot;:</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.ContentType = &quot;audio/mpeg3&quot;;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;case &quot;mpeg&quot;:</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.ContentType = &quot;video/mpeg&quot;;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;case &quot;jpg&quot;:</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.ContentType = &quot;image/jpeg&quot;;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;case &quot;........等等&quot;:</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.ContentType = &quot;....&quot;;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;default:</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.ContentType = &quot;application/octet-stream&quot;;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;}</font></p>
<p><font size="2">&nbsp;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;Response.WriteFile(file.FullName);</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;Response.End();<br />
&nbsp;<br />
&nbsp;&nbsp;}</font></p>
<p><font size="2">4、&nbsp;
最后一步就是在IIS里增加一个应用程序扩展。在&ldquo;默认网站&rdquo;-&gt;&ldquo;属性&rdquo;-&gt;&ldquo;主目录&rdquo;-&gt;&ldquo;配置&rdquo;。在弹出的&ldquo;应用程序配置&rdquo;窗口
里按&ldquo;添加&rdquo;，在弹出的&ldquo;添加/编辑应用程序扩展名映射&rdquo;窗口里&ldquo;可执行文件&rdquo;选择C:\WINDOWS\Microsoft.NET\
Framework\v2.0.50727\aspnet_isapi.dll，在扩展名里输入&ldquo;.rar&rdquo;，然后确定即可。</font></p>
<p><font size="2">5、&nbsp; 在IE里输入http://localhost/web/1.rar，会立即跳转到http://localhost/web/WebForm1.aspx，然后按WebForm1.aspx的&ldquo;下载&rdquo;按钮就可以下载1.rar了。</font></p> </div>]]></description>
		</item>
		    
		
		<item>
			<title>ASP.NET 2.0利用Httphandler实现URL重写（伪URL及伪静态）</title>
			<link>http://windowsapi.blog.sohu.com/81832620.html</link>
			<comments>http://windowsapi.blog.sohu.com/81832620.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Sat, 15 Mar 2008 12:48:34 +0800</pubDate>
			<category>WEB</category>
			<guid>http://windowsapi.blog.sohu.com/81832620.html</guid>
			<description><![CDATA[
						我们有时候会见到这样的地址：&ldquo;<a href="http://www.huoho.com/show-12-34.html" target="_blank">http://www.huoho.com/show-12-34.html</a>&rdquo;，
你或许认为在站点服务器根目录&ldquo;/&rdquo;下存在名为&ldquo;show-12-34.html&rdquo;的文件，其实实际它可能是不存在的，而可能你看到的内容是
&ldquo;/aspx/show.aspx?type=12&amp;id=34&rdquo;的内容，为什么要这样做呢？原因有多个方面：首先是增强URL的友好性，记
&ldquo;show-12-34.html&rdquo;总比&ldquo;/aspx/show.aspx?type=12&amp;id=34&rdquo;好记吧？其次就是方便搜索引擎收录，很
多搜索引擎更看好静态HTML页，比如：百度；其次就是出于安全性的考虑，因为这样隐藏了参数&ldquo;type&rdquo;、&ldquo;id&rdquo;。是不是很有意思呢？<br /><br />其实这是利用URL重写实现的，下面我就说一下在ASP.NET2.0下我所知道的最简单的实现方法：通过实现接口&ldquo;IHttpHandler&rdquo;来接管HTTP请求，Follow me!<br /><br /><br />1.在资源管理方案中添加一个类，类的代码如下：<br /><br />&nbsp;&nbsp; <div><div><img src="http://www.iileffel.cn/images/quote.gif" style="margin: 0px 2px -3px 0px;" alt="引用内容" /> 引用内容</div><div>//类URLRewriter程序清单：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using System;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using System.Data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using System.Configuration;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using System.Web;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using System.Web.Security;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using System.Web.UI;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using System.Web.UI.WebControls;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using System.Web.UI.WebControls.WebParts;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using System.Web.UI.HtmlControls;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// UrlRewriter URL重写类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// Author:yoyo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// blog:<a href="http://yangmingsheng.cn/" target="_blank">http://yangmingsheng.cn</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public class UrlRewriter : IHttpHandler //实现&ldquo;IHttpHandler&rdquo;接口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public UrlRewriter()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO: 在此处添加构造函数逻辑<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void ProcessRequest(HttpContext Context)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//取得原始URL屏蔽掉参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string Url = Context.Request.RawUrl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//建立正则表达式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Text.RegularExpressions.Regex Reg = new System.Text.RegularExpressions.Regex<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (@&quot;/show-(\d+)-(\d+)\..+&quot;,System.Text.RegularExpressions.RegexOptions.IgnoreCase);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//用正则表达式进行匹配<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Text.RegularExpressions.Match m =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reg.Match(Url,Url.LastIndexOf(&quot;/&quot;));//从最后一个&ldquo;/&rdquo;开始匹配<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (m.Success)//匹配成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String RealPath = <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @&quot;~/aspx/show.aspx?type=&quot; + m.Groups[1] + &quot;&amp;id=&quot; + m.Groups[2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Context.Response.Write(RealPath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Context.RewritePath(RealPath);//(RewritePath 用在无 Cookie 会话状态中。)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Server.Execute(RealPath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.Redirect(Context.Request.Url.ToString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.Redirect(Context.Request.Url.ToString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// 实现&ldquo;IHttpHandler&rdquo;接口所必须的成员<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;value&gt;&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// Author:yoyo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// blog:<a href="http://yangmingsheng.cn/" target="_blank">http://yangmingsheng.cn</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public bool IsReusable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get { return false; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> <br /><br />2.在web.config文件还要添加一下设置项<br /><br />在&lt;system.web&gt;节点下添加如下代码：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <div><div><img src="http://www.iileffel.cn/images/code.gif" style="margin: 0px 2px -3px 0px;" alt="程序代码" /> 程序代码</div><div>&lt;httpHandlers&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add verb=&quot;*&quot; path=&quot;*/show-?*-?*.aspx&quot; type=&quot;UrlRewriter&quot; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/httpHandlers&gt;</div></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />解释一下：<br /><br />verb是指允许的动作&ldquo;GET&rdquo;、&ldquo;POST&rdquo;、&ldquo;PUT&rdquo;中的一种或几种，星号&ldquo;*&rdquo;表示全部允许；<br /><br />path是指匹配路径，支持简单的通配符；<br /><br />type是指绑定的类名以及包括命名空间（如果有的话）；<br /><br />对了，首先你要建立一个WEB窗体&ldquo;show.aspx&rdquo;在目录&ldquo;aspx&rdquo;下，因为这个文件就是实际接受请求并显示相关内容的页面。<br /><br />OK！，编译，打开网站输入地址<a href="http://localhost/show-12-34.aspx" target="_blank">http://localhost:80/show-12-34.aspx</a> 访问一下，检查看是不是显示的&ldquo;/aspx/show.aspx?type=12&amp;id=34&rdquo;的内容呢？！<br /><br />上面我是设置了匹配ASPX文件，因为IIS里.HTML扩展名默认是不归ASP.NET接管的，如果要接管HTML请求，<br />请将IIS的扩展名.HTML映射到&ldquo;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll&rdquo;，<br />然后将上面的aspx改成html：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;httpHandlers&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add verb=&quot;*&quot; path=&quot;*/show-?*-?*.html&quot; type=&quot;UrlRewriter&quot; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/httpHandlers&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> <br /><br />现在打开网站输入地址<a href="http://localhost/show-12-34.html" target="_blank">http://localhost:80/show-12-34.html</a> 访问一下~！
					   <br />]]></description>
		</item>
		    
		
		<item>
			<title>Asp.Net 构架(Http Handler 介绍)</title>
			<link>http://windowsapi.blog.sohu.com/81832533.html</link>
			<comments>http://windowsapi.blog.sohu.com/81832533.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Sat, 15 Mar 2008 12:47:01 +0800</pubDate>
			<category>WEB</category>
			<guid>http://windowsapi.blog.sohu.com/81832533.html</guid>
			<description><![CDATA[<div>
			<h2>IHttpHandler 概述</h2>
<p>可能和我一样，很多Asp.Net开发人员都有过Asp的背景，以至于我们在开发程序的时候，通常都是在&ldquo;页面级&rdquo;上思考，也就是说我们现在正在做
的这个页面应该有什么样的功能，是进行一个问卷调查还是一个数据库查询等等。而很少在&ldquo;请求级&rdquo;思考，考虑有没有办法来通过编码的方式来操控一个Http
请求。</p>
<p>实际上，Framework提供了一系列的接口和类，允许你对于Http请求进行编程，而实现这一操作的一个主要的接口，就是 IHttpHandler(另一个是IHttpModule)。</p>
<p>应该还记得第一节中我们提到过 ISAPI，它根据文件名后缀把不同的请求转交给不同的处理程序。但是仔细看看就会发现：几乎一大半的文件都交给
aspnet_isapi.dll 去处理了。很明显，aspnet_isapi.dll 不可能对每种文件采用同一种方式处理，那么
aspnet_isapi.dll
是如何更进一步处理不同的文件，交由谁去处理呢？为了搞清楚这个问题，我们需要打开机器上C:\WINDOWS\Microsoft.NET\
Framework\v2.0.50727\CONFIG\ 目录下的web.config 文件。</p>
<p><strong>NOTE：</strong>我查阅了很多资料，都说是在 machine.config
中，但实际上 v2.0.50727 下的machine.config中httpHandlers结点是这样的：&lt;httpHandlers
/&gt;，并没有给出详细的处理程序，在Web.config中才能看到。而v1.1.4322 下的machine.config中却有。</p>
<p>找到httpHandlers结点，应该可以看到如下这样的代码(做了省略)：</p>
<p>&lt;httpHandlers&gt;<br />
... ... //略<br />
&lt;add path=&quot;*.axd&quot; verb=&quot;*&quot; type=&quot;System.Web.HttpNotFoundHandler&quot;
validate=&quot;True&quot; /&gt;&lt;add path=&quot;*.aspx&quot; verb=&quot;*&quot;
type=&quot;System.Web.UI.PageHandlerFactory&quot; validate=&quot;True&quot; /&gt;<br />
&nbsp;&nbsp; &lt;add path=&quot;*.ashx&quot; verb=&quot;*&quot; type=&quot;System.Web.UI.SimpleHandlerFactory&quot; validate=&quot;True&quot; /&gt;<br />
&nbsp;&nbsp; &lt;add path=&quot;*.asax&quot; verb=&quot;*&quot; type=&quot;System.Web.HttpForbiddenHandler&quot; validate=&quot;True&quot; /&gt;<br />
&lt;add path=&quot;*.ascx&quot; verb=&quot;*&quot; type=&quot;System.Web.HttpForbiddenHandler&quot; validate=&quot;True&quot; /&gt;<br />
&nbsp;&nbsp; &lt;add path=&quot;*.config&quot; verb=&quot;*&quot; type=&quot;System.Web.HttpForbiddenHandler&quot; validate=&quot;True&quot; /&gt;<br />
&nbsp;&nbsp; &lt;add path=&quot;*.cs&quot; verb=&quot;*&quot; type=&quot;System.Web.HttpForbiddenHandler&quot; validate=&quot;True&quot; /&gt;<br />
&nbsp;&nbsp; &lt;add path=&quot;*&quot; verb=&quot;GET,HEAD,POST&quot; type=&quot;System.Web.DefaultHttpHandler&quot; validate=&quot;True&quot; /&gt;<br />
&nbsp;&nbsp; ... ... //略 <br />
&lt;/httpHandlers&gt;</p>
<p>可以看到，在&lt;httpHandlers&gt;结点中将不同的文件类型映射给不同的Handler去处理，对于.aspx来说，是由
System.Web.UI.PageHandlerFactory来处理。而对于.cs来说，是由
System.Web.HttpForbiddenHandler 处理，从ForbiddenHandler名字中出现的Forbidden
(翻译过来是&ldquo;禁止&rdquo;)可以看出，这个Handler可以避免我们的源码被看到。</p>
<p><strong>NOTE：</strong>System.Web.UI.PageHandlerFactory 是一个IHttpHandlerFactory，而不是一个单一的HttpHandler，IHttpHandlerFactory用来做什么后面会说明。</p>
<p>上面列出的是.Net Framework在处理Http请求时的所采用的默认Handler。而如果我们要用编程的方式来操控一个Http请求，我们就需要实现IHttpHandler接口，来定制我们自己的需求。</p>
<p>IHttpHandler的定义是这样的：</p>
<p>public interface IHttpHandler{<br />
&nbsp;&nbsp;&nbsp; void ProcessRequest(HttpContext context);<br />
&nbsp;&nbsp;&nbsp; bool IsReusable { get; }<br />
}</p>
<p>由上面可以看出IHttpHandler要求实现一个方法和一个属性。其中 ProcessRequest，从名字(处理请求)看就知道这里应该放置我们处理请求的主要代码。</p>
<p>IsReusable属性，MSDN上是这样解释的：获取一个值，该值指示其他请求是否可以使用 IHttpHandler 实例。也就是说后继的Http请求是不是可以继续使用实现了该接口的类的实例，一般来说，我把它设置成true。</p>
<p>那么实现此接口的类形式应该是这样的：</p>
<p>public class CustomHandler : IHttpHandler{<br />
&nbsp;&nbsp;&nbsp; public void ProcessRequest(HttpContext context)&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 处理请求的代码<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public bool IsReusable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return true; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>而为了能使用这个自定义的HttpHandler，我们需要在应用程序目录下的Web.config中注册它。</p>
<p>&nbsp;&lt;system.web&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;httpHandlers&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add path=&quot;*.jpg&quot; verb=&quot;*&quot; type=&quot;MyNameSpace.MyClass, MyDllName&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/httpHandlers&gt;<br />
&nbsp;&lt;/system.web&gt;</p>
<p>应该发现这与之前在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\目录下
web.config中看到的几乎完全一样。这里，path指的是请求的文件名称，可以使用通配符扩大范围，也可以明确指定这个handler仅用于处理
某个特定的文件(比如说：filename.aspx)的请求。verb指的是请求此文件的方式，可以是post或get，用*代表所有访问方式。
type属性由&ldquo;,&rdquo;分隔成两部分，第一部分是实现了接口的类名，第二部分是位于Bin目录下的编译过的程序集名称。</p>
<p><strong>NOTE：</strong>如果你新建一个项目，并且在项目下创建HandlerTest.cs，然后让站点引用该项目，那么在生成解决方案的时候会自动将编译好的.dll文件添到Bin目录中。<br />
&nbsp;&nbsp;&nbsp; <strong>NOTE：</strong>MyDll只写程序集名，不要加后面的.dll。</p>
<h2>使用HttpHandler实现图片防盗链</h2>
<p>有了之前这么多的准备知识，实现现在的目标就容易得多了：</p>
<p><strong>NOTE：</strong>这个例子，以及下面的一个例子均来自于《Maximizing ASP.NET Real World, Object-Oriented Development》一书：</p>
<h3>Step.1：创建文件 CustomHandler.cs，代码如下：</h3>
<p>using System;<br />
using System.Web;<br />
<br />
namespace CustomHandler{<br />
&nbsp;&nbsp;&nbsp; public class JpgHandler : IHttpHandler{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void ProcessRequest(HttpContext context){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获取文件服务器端物理路径<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string FileName = context.Server.MapPath(context.Request.FilePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果UrlReferrer为空，则显示一张默认的禁止盗链的图片<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (context.Request.UrlReferrer.Host == null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = &quot;image/JPEG&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.WriteFile(&quot;/error.jpg&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果 UrlReferrer中不包含自己站点主机域名，则显示一张默认的禁止盗链的图片<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (context.Request.UrlReferrer.Host.IndexOf(&quot;yourdomain.com&quot;) &gt; 0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = &quot;image/JPEG&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.WriteFile(FileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = &quot;image/JPEG&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.WriteFile(&quot;/error.jpg&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public bool IsReusable{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get{ return true; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<h3>Step.2 编译这个文件</h3>
<p>csc /t:library /r:System.Web.dll CustomHandler.cs</p>
<h3>Step.3 将编译好的 CustomHandler.dll 拷贝到站点的 Bin 目录下。</h3>
<h3>Step.4 在Web.Config 中注册这个Handler。</h3>
<p>&lt;system.web&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;httpHandlers&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add path=&quot;*.jpg&quot; verb=&quot;*&quot; type=&quot;CustomHandler.JpgHandler, CustomHandler&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/httpHandlers&gt;<br />
&nbsp;&lt;/system.web&gt;</p>
<p>OK，诸位可以按步骤自行测试一下，这里就不赘述了。</p>
<h2>通过IhttpHandler实现图片验证码</h2>
<p>也可以在一个.ashx文件中实现IHttpHandler，而不是采用这种提前编译的方式。</p>
<h3>Step.1 打开Vs2005，&ldquo;添加新项&rdquo;，&ldquo;一般处理程序&rdquo;。新建文件后，VS会自动在文件中添加如下的代码：</h3>
<p>&lt;%@ WebHandler Language=&quot;C#&quot; Class=&quot;Handler&quot; %&gt;<br />
<br />
using System;<br />
using System.Web;<br />
<br />
public class Handler : IHttpHandler {<br />
&nbsp;&nbsp;&nbsp; public void ProcessRequest (HttpContext context) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = &quot;text/plain&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.Write(&quot;Hello World&quot;);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; public bool IsReusable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<h3>Step.2 将代码改写成如下所示：</h3>
<p>&lt;%@ WebHandler Language=&quot;C#&quot; Class=&quot;Handler&quot; %&gt;<br />
<br />
using System;<br />
using System.Drawing;<br />
using System.Drawing.Imaging;<br />
using System.Text;<br />
using System.Web;<br />
using System.Web.SessionState;<br />
<br />
public class Handler : IHttpHandler, IRequiresSessionState {<br />
<br />
&nbsp;&nbsp;&nbsp; public void ProcessRequest(HttpContext context) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = &quot;image/gif&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //建立Bitmap对象，绘图<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bitmap basemap = new Bitmap(200, 60);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics graph = Graphics.FromImage(basemap);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; graph.FillRectangle(new SolidBrush(Color.White), 0, 0, 200, 60);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Font font = new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Random r = new Random();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string letters = &quot;ABCDEFGHIJKLMNPQRSTUVWXYZ&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string letter;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder s = new StringBuilder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //添加随机的五个字母<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int x = 0; x &lt; 5; x++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; letter = letters.Substring(r.Next(0, letters.Length - 1), 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.Append(letter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; graph.DrawString(letter, font, new SolidBrush(Color.Black), x * 38, r.Next(0, 15));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //混淆背景<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pen linePen = new Pen(new SolidBrush(Color.Black), 2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int x = 0; x &lt; 6; x++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; graph.DrawLine(linePen, new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将图片保存到输出流中&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basemap.Save(context.Response.OutputStream, ImageFormat.Gif);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Session[&quot;CheckCode&quot;] = s.ToString();&nbsp;&nbsp; //如果没有实现IRequiresSessionState，则这里会出错，也无法生成图片<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.End();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public bool IsReusable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return true; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>需要特别注意的是，Handler类不仅需要实现
IHttpHandler接口(这个显然)，为了在这个Handler类中使用SessionState，还需要实现
IRequiresSessionState接口，对于这个接口，MSDN的解释是这样的：Specifies that the target
HTTP handler requires read and write access to session-state values.
This is a marker interface and has no methods.(翻译过来是：指定当前Http
Handler需要对SessionState值的读写访问权。这是一个标记接口，没有任何方法)。</p>
<p>而实际上，IRequiresSessionState的接口定义是这样的：</p>
<p>public interface IRequiresSessionState{}</p>
<p>可见，这个接口没有任何需要实现的方法或属性，大家只要记得：<strong>如果想在HttpHandler中使用SessionState，必须实现这个接口，实际上也就是在类的标头将这个接口加进去。</strong></p>
<h3>Step.3 新建一个ImageCode.aspx页面，在HTML代码中写下：</h3>
<p>&lt;img src=&quot;Handler.ashx&quot; alt=&quot;图片验证码&quot; /&gt;</p>
<p>OK，在浏览器中打开ImageCode.aspx，应该可以看到如下所示：</p>
<p><img alt=" " src="http://www.tracefact.net/graph/HttpHandler/01.gif" height="93" width="215" /></p>
<h2>利用HttpHandler创建自定义后缀Rss源</h2>
<p>RSS如今已经可以说是随处可见，而RSS的实现方式，通常是在一个.aspx的CodeBehind文件中写一个XML文件，然后加载到
Response的OutputStream中，
Rss源通常是Rss.aspx这种形式的。通过第一章学到的ISAPI的知识，再结合本章学到的关于HttpHandler的知识，很容易想到：我们可
以自定一个以 .rss 作为后缀名的文件来实现 Rss 源，比如说Article.rss。现在我们就一步步来实现它：</p>
<p><strong>NOTE：</strong>关于RSS的更多内容，可以参阅我编译的<a href="http://www.tracefact.net/Asp-Net/Creating-Consuming-Rss-Feeds-on-Your-Web-Site.aspx"> 在Web站点中创建和使用RSS源</a>。本文不再解释Rss是什么，如何创建Rss源，为了文章的独立性，仅给出创建过程。</p>
<h3>Step.1 创建范例数据库</h3>
<p>Create Table RssSample<br />
(<br />
&nbsp;&nbsp;&nbsp; SampleId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Int Identity(1,1) &nbsp;&nbsp; Not Null,<br />
&nbsp;&nbsp;&nbsp; Title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(100)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Not Null Constraint uq_Title Unique,<br />
&nbsp;&nbsp;&nbsp; Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(50)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Not Null,<br />
&nbsp;&nbsp;&nbsp; PubDate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateTime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Not Null Default GetDate(),<br />
&nbsp;&nbsp;&nbsp; [Description] Varchar(500)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Not Null,<br />
&nbsp;&nbsp;&nbsp; Link&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(150)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Not Null<br />
<br />
&nbsp;&nbsp;&nbsp; Constraint pk_RssSample Primary Key(SampleId)<br />
)<br />
-- 插入范例数据<br />
Insert Into RssSample(Title, Author, [Description], Link)<br />
Values('标题1', '作者1', '文章摘要1', 'http://127.0.0.1/#' )<br />
<br />
-- 省略 ....</p>
<h3>Step.2 建立站点，在App_Code目录下建立RssFeedsLib.cs文件。</h3>
<p>using System;<br />
using System.Data;<br />
using System.Data.SqlClient;<br />
using System.IO;<br />
using System.Web;<br />
using System.Xml;<br />
using System.Text;<br />
<br />
namespace RssFeadsLib {<br />
&nbsp;&nbsp;&nbsp; public class RssGenerator {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static string GetRSS() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemoryStream ms = new MemoryStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlTextWriter writer = new XmlTextWriter(ms, null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection conn = new SqlConnection(&quot;Data
Source=.;Initial Catalog=Sample;User ID=sa;Password=sa&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//修改这里成你的数据库连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand cmd = new SqlCommand(&quot;select * from RssSample order by pubdate desc&quot;, conn);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader reader = cmd.ExecuteReader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartElement(&quot;rss&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteAttributeString(&quot;version&quot;, &quot;2.0&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartElement(&quot;channel&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Channel 下的结点静态写入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;title&quot;, &quot;TraceFact.Net 技术文章&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;link&quot;, &quot;http://www.tracefact.net&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;description&quot;, &quot;Dedicated to asp.net...&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;copyright&quot;, &quot;Copyright (C) 2007&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;generator&quot;, &quot;My RSS Generator&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Item 结点从数据库读取<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (reader.Read()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartElement(&quot;item&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;author&quot;, reader.GetString(reader.GetOrdinal(&quot;Author&quot;)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;title&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; reader.GetString(reader.GetOrdinal(&quot;title&quot;)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;link&quot;, reader.GetString(reader.GetOrdinal(&quot;Link&quot;)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;description&quot;, reader.GetString(reader.GetOrdinal(&quot;Description&quot;)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementString(&quot;pubDate&quot;,
reader.GetDateTime(reader.GetOrdinal(&quot;PubDate&quot;)).ToString(@&quot;ddd, dd MMM
yyyy 12:00:00 tt &quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteEndElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteEndElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteEndElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.BaseStream.Flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.Flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ms.Flush();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将流转换成String并返回<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] data = new byte[ms.Length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ms.Seek(0, SeekOrigin.Begin);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ms.Read(data, 0, data.Length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ms.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return UTF8Encoding.UTF8.GetString(data);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<h3>Step.3 创建可以处理 .rss 后缀名的 RssHandler</h3>
<p>我们在这个 RssFeedsLib命名空间下，再添加一个类，这个类用于处理对 .rss 后缀名文件的Http请求。</p>
<p>public class RSSHandler:IHttpHandler{<br />
&nbsp;&nbsp;&nbsp; public bool IsReusable<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get {return false;}<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void ProcessRequest(HttpContext context){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = &quot;text/xml&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string str = RssGenerator.GetRSS();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.Write(str);<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<h3>Step.4 在Web.config中进行配置</h3>
<p>&lt;httpHandlers&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;add path=&quot;*.rss&quot; type=&quot;RssFeadsLib.RSSHandler&quot; verb=&quot;GET&quot; /&gt;<br />
&lt;/httpHandlers&gt;</p>
<p>&nbsp;</p>
<p><strong>NOTE：</strong>因为这个类和命名空间位于App_Code中，这里就不需要再手动编译
RssFeadsLib.cs然后将编译好的.dll应用程序集放到Bin目录中了。至于为什么可以这样，将会在 《Asp.Net 构架与安全机制
Part.5 &ndash; 页面生存周期与编译模型》中解释。</p>
<h3>Step.5 在IIS 对ISAPI进行设置。</h3>
<p>应该还记得在Part.1中如何在IIS中设置ISAPI来进行文件与处理程序映射：</p>
<ol><li>打开IIS，选择本范例所用的站点，右键，选择&ldquo;属性&rdquo;。</li><li>选择&ldquo;主目录&rdquo;选项卡，点击&ldquo;配置...&rdquo;按钮。</li><li>点击&ldquo;添加&rdquo;，设置&ldquo;可执行文件&rdquo;为&ldquo;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll&rdquo;，设置&ldquo;扩展名&rdquo;为&ldquo;.rss&rdquo;，点&ldquo;确定&rdquo;。</li><li>注意，不要勾选&ldquo;检查文件是否存在&rdquo;复选框，这样不用创建文件，只要在地址栏输入任意以.rss后缀结尾的文件名，均会交由上面创建的Handler去处理，而不管这个文件是否存在，也不管请求的是Article.rss还是Sample.rss。</li></ol>
<p>进行了这些设置以后，现在IIS就知道如何去处理对.rss后缀名文件的请求了。</p>
<h3>Step.6 测试范例</h3>
<p>这个时候，随便打开一个页面，比如空白的Default.aspx，然后我们在地址栏将文件改为：Article.rss(改成abc.rss也是一样)，敲回车，应该可以看到如下的画面。</p>
<p><img alt=" " src="http://www.tracefact.net/graph/HttpHandler/02.gif" height="465" width="615" /></p>
<h2>IHttpHandlerFactory 概述</h2>
<p>现在假设我们有这样的需求，我们不仅想要处理 .rss 后缀名，还想要能够处理 .atom后缀名，假设处理atom的类命名为AtomHandler，那么我们的Web.config该如何设置呢？我想应该是这样的：</p>
<p>&lt;httpHandlers&gt;<br />
&lt;add path=&quot;*.rss&quot; type=&quot;RssFeadsLib.RSSHandler&quot; verb=&quot;GET&quot; /&gt;<br />
&lt;add path=&quot;*.atom&quot; type=&quot;RssFeadsLib.AtomHandler&quot; verb=&quot;GET&quot; /&gt;<br />
&lt;/httpHandlers&gt;</p>
<p>如果我们有很多个HttpHandler分别映射不同后缀名的请求，这样我们的Web.config会变得很冗长，或者，我们只有在程序运行时才能确切地知道使用哪个Handler，这个时候，可以考虑实现 IHttpHandlerFactory来完成这一过程。</p>
<p>IHttpHandlerFactory的定义是这样的：</p>
<p>public interface IHttpHandlerFactory{<br />
&nbsp;&nbsp;&nbsp; IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated);<br />
&nbsp;&nbsp;&nbsp; void ReleaseHandler(IHttpHandler handler);<br />
}</p>
<p>可见，需要实现两个方法，分别是 GetHandler() 和 ReleaseHandler()。</p>
<ul><li>GetHandler()，返回实现了IHttpHandler接口的类的实例。</li><li>ReleaseHandler()，使得Factory可以重复使用一个已经存在的Handler实例。</li></ul>
<p>对于上面 .atom 和 .rss 的问题，我们可以这样来实现 IHttpHandlerFactory接口：</p>
<p>class HandlerFactory:IHttpHandlerFactory{<br />
&nbsp;&nbsp;&nbsp; public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string path = context.Request.PhysicalPath;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Path.GetExtension(path) == &quot;.rss&quot;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new RSSHandler();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Path.GetExtension(path) == &quot;.atom&quot;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ATOMHandler();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void ReleaseHandler(IHttpHandler handler){<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>这时，在Web.Config 中&lt;system.web&gt;节点下进行如下设置即可：</p>
<p>&lt;httpHandlers&gt;<br />
&lt;add path=&quot;*.rss,*.atom&quot; type=&quot; RssFeadsLib.HandlerFactory&quot; verb=&quot;GET&quot; /&gt;<br />
&lt;/httpHandlers&gt;</p>
<p>但是，这不能简化IIS中ISAPI的设置，还是需要手动去对.rss和.atom分别设置。</p>
<h2>总结</h2>
<p>在本文中，我们首先讨论了aspnet_isapi.dll 如何将对不同后缀名文件的请求分发给相应的处理程序，如何查看Framework默认的处理程序Handler。</p>
<p>然后，我们通过三个实例，图片防盗链、图片验证码、处理自定义后缀名请求，详细讲解了IHttpHandler的实现方法和使用过程。</p>
<p>最后，我向大家概要地介绍了IHttpHandlerFactory接口。</p>
		</div>
		
	


	
	 | <a href="http://www.cbcto.com/cbcto/Html/sitemap.htm">网站地图</a> <a href="http://www.cbcto.com/cbcto/Html/2008120155417_57.html#">加入收藏</a> | Email:<a href="mailto:cbcto@126.com">cbcto@126.com</a> | Copyright &copy; 2007-2008 www.cbcto.com All Rights Reserved 版权所有 备案号：]]></description>
		</item>
		    
		
		<item>
			<title>利用C#创建 IIS 站点并设置.NET Framework版本为ASP.NET 2.0 </title>
			<link>http://windowsapi.blog.sohu.com/81832413.html</link>
			<comments>http://windowsapi.blog.sohu.com/81832413.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Sat, 15 Mar 2008 12:44:49 +0800</pubDate>
			<category>WEB</category>
			<guid>http://windowsapi.blog.sohu.com/81832413.html</guid>
			<description><![CDATA[<div>利
用.NET
Framework提供的System.DirectoryServices.DirectoryEntry类可以轻松创建IIS站点，并将站点设置为
ASP.NET 2.0版本。无疑，这种方法与前面的那个方法相比较，是比较好的。一下代码需要注意的地方是：<br />
<br />
1，没有做路径检查，这个很简单；<br />
2，没有做端口存在的检查，这个也不是很复杂；<br />
3，ScriptMapsList数组是为了简单起见，直接从字符串进行分解出来，这个需要注意你自己的应用；<br />
4；更多IIS权限处理，可根据需要进行添加。<br />
<br />
本方法代码如下：<br />
<br />
string ScriptMaps = @&quot;.asp,C:\WINDOWS\system32\inetsrv\asp.dll,5,GET,HEAD,POST,TRACE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .cer,C:\WINDOWS\system32\inetsrv\asp.dll,5,GET,HEAD,POST,TRACE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .cdx,C:\WINDOWS\system32\inetsrv\asp.dll,5,GET,HEAD,POST,TRACE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .asa,C:\WINDOWS\system32\inetsrv\asp.dll,5,GET,HEAD,POST,TRACE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .idc,C:\WINDOWS\system32\inetsrv\httpodbc.dll,5,GET,POST<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .shtm,C:\WINDOWS\system32\inetsrv\ssinc.dll,5,GET,POST<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .shtml,C:\WINDOWS\system32\inetsrv\ssinc.dll,5,GET,POST<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .stm,C:\WINDOWS\system32\inetsrv\ssinc.dll,5,GET,POST<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .asax,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ascx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ashx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .asmx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .aspx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .axd,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .vsdisco,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .rem,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .soap,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .config,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .cs,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .csproj,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .vb,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .vbproj,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .webinfo,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .licx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .resx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .resources,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .xoml,C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .rules,C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .master,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .skin,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .compiled,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .browser,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .mdb,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .jsl,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .vjsproj,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .sitemap,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .msgx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ad,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .dd,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ldd,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .sd,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .cd,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .adprototype,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .lddprototype,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .sdm,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .sdmDocument,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ldb,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .svc,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .mdf,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ldf,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .java,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .exclude,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .refresh,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG&quot;;<br />
<br />
String[] ScriptMapsList = System.Text.RegularExpressions.Regex.Split(ScriptMaps, &quot;\r\n&quot;);<br />
<br />
<br />
///注意：这里没有进行进行端口存在的检查<br />
// Access Flags<br />
const int MD_ACCESS_READ = 0x00000001; //Allow read access.<br />
const int MD_ACCESS_SCRIPT = 0x00000200; // Allow script execution.<br />
<br />
<br />
string entPath = &quot;IIS://localhost/w3svc&quot;;<br />
System.DirectoryServices.DirectoryEntry rootEntry = new System.DirectoryServices.DirectoryEntry(entPath);<br />
int siteID = 1;<br />
//得到现有的站点标识<br />
foreach (System.DirectoryServices.DirectoryEntry entry in rootEntry.Children)<br />
{<br />
&nbsp;&nbsp; if (entry.SchemaClassName == &quot;IIsWebServer&quot;)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; int ID = Convert.ToInt32(entry.Name);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (ID &gt;= siteID)<br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; siteID = ID + 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}<br />
<br />
System.DirectoryServices.DirectoryEntry newSiteEntry = rootEntry.Children.Add(siteID.ToString(), &quot;IIsWebServer&quot;);<br />
newSiteEntry.Properties[&quot;ServerBindings&quot;].Value = &quot;:8001:&quot;;<br />
newSiteEntry.Properties[&quot;ServerComment&quot;].Value = &quot;mengxianhui2&quot;;<br />
newSiteEntry.CommitChanges();<br />
System.DirectoryServices.DirectoryEntry vDirEntry = newSiteEntry.Children.Add(&quot;root&quot;, &quot;IIsWebVirtualDir&quot;);<br />
vDirEntry.Properties[&quot;Path&quot;].Value = @&quot;C:\mengxianhui&quot;;<br />
//System.Collections.ArrayList ScriptMapsList = new System.Collections.ArrayList();<br />
//ScriptMapsList.Add(@&quot;.aspx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG&quot;);<br />
//ScriptMapsList.Add(@&quot;.asax,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG&quot;);<br />
//ScriptMapsList.Add(@&quot;.svc,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG&quot;);<br />
//ScriptMapsList.Add(@&quot;.msgx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG&quot;);<br />
//ScriptMapsList.Add(@&quot;.config,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG&quot;);<br />
//ScriptMapsList.Add(@&quot;.ascx,c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG&quot;);<br />
vDirEntry.Properties[&quot;ScriptMaps&quot;].Value = ScriptMapsList;<br />
vDirEntry.Properties[&quot;AppFriendlyName&quot;][0] = &quot;孟宪会的网站&quot;;<br />
vDirEntry.Properties[&quot;AppIsolated&quot;][0] = 2;<br />
vDirEntry.Properties[&quot;AccessFlags&quot;][0] = MD_ACCESS_READ | MD_ACCESS_SCRIPT;<br />
vDirEntry.Properties[&quot;AppRoot&quot;][0] = &quot;LM/W3SVC/&quot; + siteID + &quot;/Root&quot;;<br />
vDirEntry.CommitChanges();<br />
newSiteEntry.CommitChanges();<br />
MessageBox.Show(&quot;创建完成！&quot;); <br /></div>
]]></description>
		</item>
		    
		
		<item>
			<title>转：中国看病最不贵？</title>
			<link>http://windowsapi.blog.sohu.com/81491029.html</link>
			<comments>http://windowsapi.blog.sohu.com/81491029.html#comment</comments>
			<dc:creator>程序人生</dc:creator>
			<pubDate>Tue, 11 Mar 2008 19:58:43 +0800</pubDate>
			<guid>http://windowsapi.blog.sohu.com/81491029.html</guid>
			<description><![CDATA[多年来中国百姓一直都在叹看病贵，因而民间广泛流传一句俗语：&ldquo;没什么，别没钱；有什么，别有病。&rdquo;放眼身边，有多少贫民百姓，因为有病没钱医，只
有躺在家里等死。想想看那些病人的亲属，眼睁睁看着自己的亲人慢慢地消逝，那种苦痛该有多么钻心；而那些病人在静静地等待死亡来临的那些日日夜夜，内心深
处，又会想些什么。<br />
　　可是2月18日，广州市政协委员、广州市卫生局副局长曾其毅居然面对成千上万人看不起病的事实居然毫不羞愧地说，其实在中国看病并不贵。&ldquo;所谓看病难看病贵，我走遍全世界，看病最不难是中国，看病最不贵是中国。&rdquo;<br />
　　政协委员曾其毅为此举例说，在中国，专家门诊的诊金是7元，但是国外要请一个医生看病，诊金是300元。
但是至于中国专家的数千上万甚至十几万元的&ldquo;红包费&rdquo;、&ldquo;快诊费&rdquo;，政协委员曾其毅则避而不谈了；至于国外良好的医疗保障制度，比如在法国，意外伤者被人
送到医院治疗，痊愈后拍拍屁股就走人，医疗费全由政府买单；政协委员曾其毅也避而不谈了；至于中国人均收入水平仅相当于许多国家的20分之一，政协委员曾
其毅也避而不谈了；至于中国十倍甚至数十倍暴利的医药费，政协委员曾其毅也避而不谈了。<br />
　　事实上，7元的专家门诊金，我到过多个城市，似乎还从来没听说过。查阅资料，数年前的全国卫生服务调查显示，1993年、1998年、2003年的农
村平均门诊费用分别为22元、25元和50元，平均住院费用分别为541元、837元和1455元（均为可比价格）。至于如今的门诊费用，早已飞涨数倍
了。<br />
　　政协委员曾其毅认为觉得看病贵是对医疗器械的不尊重：&ldquo;大家对生命、医疗技术不够尊重，所以就觉得看病贵，修一个人一百多觉得贵，&rdquo;修&ldquo;一个机器、换一个汽车零部件要几千块却没人觉得贵，这是价值观不对。&rdquo;<br />
　　想来政协委员曾其毅一向过的是荣华富贵的官员的生活，想来政协委员曾其毅一生中可能从来都没有深入基层，哪怕只观察一次穷人过的是什么生活。我想只要
政协委员曾其毅到过一户穷人家，看看他们住的房子，看看他们穿的衣服，看看他们的家什，看看他们吃饭时碗里盛的是什么，就会知道，这些嫌看病贵、看不起病
的穷人们是否能买得起什么机器，是否能买得起几千块钱的汽车零部件。当这些看不起病的穷人们生命尚得不到普遍尊重的时候，政协委员曾其毅大人，你让他们如
何去尊重那些冷冰冰的医疗器械呢？！<br />
　　在我们有许多人看不起病的国家，一个广州市卫生局的副局长，居然有条件&ldquo;走遍全世界&rdquo;。我不知道政协委员曾其毅在&ldquo;走遍全世界&rdquo;的过程中总共花了多少
钱，是否花的是我们纳税人的钱。我只是想，如果政协委员曾其毅能够思想高尚一点无私一点，当初把这些&ldquo;走遍全世界&rdquo;的钱省下来救济那些看不起病的穷人，那
会拯救多少条鲜活的生命！何况政协委员曾其毅虽然&ldquo;走遍全世界&rdquo;，现在竟然还发出&ldquo;看病最不贵是中国&rdquo;这一荒唐至极的谬论。这万里路看来是白走了。这样的
政协委员，能为人民谋福利吗？

　　<div style="display: inline;"><font color="#333399">原创文章，如转载请注明：转载自不扬杂志 [</font><font color="#0000ff"> </font><a href="http://www.byzzh.cn/"><font color="#0000ff">www.byzzh.cn</font></a><font color="#333399"> ]</font>
</div>
]]></description>
		</item>
		    
		
	</channel>
</rss>
