<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_net</title><subtitle type="text">备忘</subtitle><id>http://feed.cnblogs.com/blog/u/33181/rss</id><updated>2011-12-05T07:18:35Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/33181/rss"/><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2207405.html</id><title type="text">mysql 备忘sql</title><summary type="text">CREATE TABLE table1(SELECT ecuserid,id,PartnerType FROM table2 WHERE PartnerType=4 AND createdate BETWEEN &amp;#39;2011-09-23&amp;#39; AND &amp;#39;2011-10-10&amp;#39;)UPDATE ecuser_cooperationuser AS aLEFT JOIN ecuser_customer b ON a.KubaUserId = b.EcUserIdSET b.PartnerType = 2WHERE a.Platform=&amp;#39;彩贝&amp;#39;SELECT C</summary><published>2011-11-25T06:54:00Z</published><updated>2011-11-25T06:54:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2207405.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2207405.html"/><content type="html">&lt;p&gt;CREATE TABLE table1(SELECT ecuserid,id,PartnerType FROM table2 &lt;br /&gt;WHERE PartnerType=4 AND createdate BETWEEN '2011-09-23' AND '2011-10-10')&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;UPDATE ecuser_cooperationuser AS a&lt;br /&gt;LEFT JOIN ecuser_customer b ON a.KubaUserId = b.EcUserId&lt;br /&gt;SET b.PartnerType = 2&lt;br /&gt;WHERE a.Platform='彩贝'&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;SELECT COUNT(0) AS '会员数',CASE UserLevelId WHEN 1 THEN '蜗居会员' WHEN 2 THEN '一居会员' WHEN 3 THEN '二居会员'&amp;nbsp; WHEN 4 THEN '三居会员' &lt;br /&gt;WHEN 5 THEN '四居会员' WHEN 6 THEN '复式楼会员' WHEN 7 THEN '别墅会员' END AS '会员级别'&lt;br /&gt;&amp;nbsp; FROM ecuser_customer GROUP BY UserLevelId&lt;/p&gt;&#xD;
&lt;p&gt;CREATE TABLE temp_badip (SELECT ip FROM&amp;nbsp; (SELECT&amp;nbsp;&amp;nbsp; 用户名,MAX(登录时间) AS logintime,MAX(登录ip) AS ip,MAX(会员级别),COUNT(用户名)&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM ecuser_loginuser_201110211430 &lt;br /&gt;GROUP BY 用户名) AS t&amp;nbsp; GROUP BY ip HAVING COUNT(*)&amp;gt;20)&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2207405.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2207405.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2239280.html</id><title type="text">ActiveMQ 安装</title><summary type="text">1、环境：Windows XPapache-activemq-5.2.0-bin.zip2、安装（安装前需要有Java环境 ，先安装JDK）解压缩到apache-activemq-5.2.0-bin.zip到一个目录，比如C:\apache-activemq-5.2.03、配置配置就在C:\apache-activemq-5.2.0\conf目录下三个文件activemq.xmlcredentials.propertieslog4j.properties4、启动ActiveMQ运行C:\apache-activemq-5.2.0\bin\activemq.bat5、测试ActiveMQ默认使用</summary><published>2011-11-25T06:53:00Z</published><updated>2011-11-25T06:53:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2239280.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2239280.html"/><content type="html">&lt;div&gt;1、环境：&lt;/div&gt;&#xD;
&lt;div&gt;Windows XP&lt;/div&gt;&#xD;
&lt;div&gt;apache-activemq-5.2.0-bin.zip&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;2、安装（安装前需要有Java环境 ，先安装JDK）&lt;/div&gt;&#xD;
&lt;div&gt;解压缩到apache-activemq-5.2.0-bin.zip到一个目录，比如C:\apache-activemq-5.2.0&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;3、配置&lt;/div&gt;&#xD;
&lt;div&gt;配置就在C:\apache-activemq-5.2.0\conf目录下三个文件&lt;/div&gt;&#xD;
&lt;div&gt;activemq.xml&lt;/div&gt;&#xD;
&lt;div&gt;credentials.properties&lt;/div&gt;&#xD;
&lt;div&gt;log4j.properties&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;4、启动ActiveMQ&lt;/div&gt;&#xD;
&lt;div&gt;运行C:\apache-activemq-5.2.0\bin\activemq.bat&lt;/div&gt;&#xD;
&lt;div&gt;5、测试&lt;/div&gt;&#xD;
&lt;div&gt;ActiveMQ默认使用的TCP连接端口是61616, 通过查看该端口的信息可以测试ActiveMQ是否成功启动 netstat -an|find "61616"&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="border-right: 1px solid #cccccc; padding: 4px; border-width: 1px; border-style: solid; border-color: #cccccc; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;C:\Documents and Settings\Administrator&amp;gt;netstat -an|find "61616" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TCP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.0.0.0:61616&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.0.0.0:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LISTENING&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;6、监控&lt;/div&gt;&#xD;
&lt;div&gt;ActiveMQ5.0版本默认启动时，启动了内置的jetty服务器，提供一个demo应用和用于监控ActiveMQ的admin应用。&lt;br /&gt;admin：&lt;a href="http://127.0.0.1:8161/admin/"&gt;http://127.0.0.1:8161/admin/&lt;/a&gt; &lt;br /&gt;demo：&lt;a href="http://127.0.0.1:8161/demo/"&gt;http://127.0.0.1:8161/demo/&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2239280.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2239280.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2235201.html</id><title type="text">【转】j2ee 环境搭建</title><summary type="text">一。jdk安装与配置 jdk7于3月份刚刚发布，目前eclipse的最新版本中还没有提供对jdk7的编译支持，所以我们只下载jdk6。下载地址：http://download.java.net/jdk6/ 选择适合平台的安装文件，windows32下目前最新版本为：jdk-6u25-ea-bin-b03-windows-i586-27_feb_2011.exe 默认安装即可，安装完成后要配置环境变量。比如，我的安装目录为：C:\Program Files\Java\jdk1.6。环境变量配置如下：XP系统下，右击“我的电脑”--选择“属性”--选择“高级”--点击“环境变量”在“系统变量(S)</summary><published>2011-11-25T06:53:00Z</published><updated>2011-11-25T06:53:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2235201.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2235201.html"/><content type="html">&lt;p&gt;&lt;strong&gt;一。jdk安装与配置 &lt;/strong&gt;&lt;br /&gt;jdk7于3月份刚刚发布，目前eclipse的最新版本中还没有提供对jdk7的编译支持，所以我们只下载jdk6。&lt;br /&gt;&lt;br /&gt;下载地址：http://download.java.net/jdk6/&amp;nbsp; &lt;br /&gt;&lt;br /&gt;选择适合平台的安装文件，windows32下目前最新版本为：jdk-6u25-ea-bin-b03-windows-i586-27_feb_2011.exe&amp;nbsp; &lt;br /&gt;&lt;br /&gt;默认安装即可，安装完成后要配置环境变量。&lt;br /&gt;&lt;br /&gt;比如，我的安装目录为：C:\Program Files\Java\jdk1.6。&lt;br /&gt;&lt;br /&gt;环境变量配置如下：&lt;br /&gt;&lt;br /&gt;XP系统下，右击&amp;ldquo;我的电脑&amp;rdquo;--选择&amp;ldquo;属性&amp;rdquo;--选择&amp;ldquo;高级&amp;rdquo;--点击&amp;ldquo;环境变量&amp;rdquo;&lt;br /&gt;&lt;br /&gt;在&amp;ldquo;系统变量(S)&amp;rdquo;中&lt;br /&gt;&lt;br /&gt;新建：JAVA_HOME：C:\Program Files\Java\jdk1.6&lt;br /&gt;&lt;br /&gt;新建：CLASS_PATH：.;%JAVA_HOME%\lib&amp;nbsp; &lt;br /&gt;&lt;br /&gt;编辑：PATH：在最前面加上%JAVA_HOME%\bin;&amp;nbsp; &lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;创建环境变量后，打开cmd，输入&amp;ldquo;java -version&amp;rdquo;验证是否安装成功。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;dl &gt;&lt;dt&gt;Java code&lt;/dt&gt;&lt;dd&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000;"&gt;C:\Documents and Settings\user&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;java &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;version&#xD;
java version &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;1.5.0_11&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#xD;
Java(TM) &lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt; Runtime Environment, Standard Edition (build &lt;/span&gt;&lt;span style="color: #000000;"&gt;1.5&lt;/span&gt;&lt;span style="color: #000000;"&gt;.0_11&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;b03)&#xD;
Java HotSpot(TM) Client VM (build &lt;/span&gt;&lt;span style="color: #000000;"&gt;1.5&lt;/span&gt;&lt;span style="color: #000000;"&gt;.0_11&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;b03, mixed mode, sharing)&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/dd&gt;&lt;/dl&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;二。tomcat 安装与配置&lt;/strong&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;tomcat的官方网站：http://tomcat.apache.org/&amp;nbsp; &lt;br /&gt;&lt;br /&gt;目前最新版本为7.0，&lt;br /&gt;&lt;br /&gt;windows32下目前最新版本下载地址：http://labs.renren.com/apache-mirror/tomcat/tomcat-7/v7.0.11/bin/apache-tomcat-7.0.11-windows-x86.zip&amp;nbsp; &lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;此为解压缩版，下载后解压缩即可，tomcat是需要jdk才能运行的，如果我们配置好了jdk环境变量，那么tomcat会自动从环境变量中读取jdk信息，无需特别的配置。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;比如，我们将tomcat解压缩后的目录为：F:\apache-tomcat-7.0.11-windows-x86\apache-tomcat-7.0.11（以下简称%TOMCAT_HOME%）&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;进入%TOMCAT_HOME%/bin，双击&amp;ldquo;startup.bat&amp;rdquo;启动tomcat，如果tomcat正常启动，我们访问&amp;ldquo;http://localhost:8080/&amp;rdquo;即可打开tomcat管理页面。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;双击&amp;ldquo;shutdown.bat&amp;rdquo;，即可关闭tomcat。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;管理账户配置：&lt;br /&gt;&lt;br /&gt;进入%TOMCAT_HOME%/conf，编辑&amp;ldquo;tomcat-users.xml&amp;rdquo;，&lt;br /&gt;&lt;br /&gt;因为是开发环境，所以这里我们配置一个超级用户admin ，使其能够管理tomcat，编辑后的内容如下：&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;dl &gt;&lt;dt&gt;Java code&lt;/dt&gt;&lt;dd&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt;xml version&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; encoding&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;utf-8&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;tomcat&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;users&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;role rolename&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;manager-gui&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;role rolename&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;admin-gui&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;user username&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;admin&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; password&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;admin&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; roles&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;manager-gui,admin-gui&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;tomcat&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;users&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/dd&gt;&lt;/dl&gt;&#xD;
&lt;p&gt;&lt;br /&gt;重新启动tomcat，之后就可以使用admin账户对tomcat进行管理了，这里只说明如何配置账户，关于如何使用界面管理tomcat暂不做叙述，具体参考tomcat帮助文档吧，主要原因是在开发环境下几乎用不到这个功能，而且我比较推荐手工配置。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;三。eclipse 安装与配置 &lt;/strong&gt;&lt;br /&gt;eclipse的官网地址：http://www.eclipse.org/&amp;nbsp; &lt;br /&gt;&lt;br /&gt;我们下载J2EE版本：Eclipse IDE for Java EE Developers&amp;nbsp; &lt;br /&gt;&lt;br /&gt;目前最新版本是：Helios Service Release 2&lt;br /&gt;&lt;br /&gt;windows32 版本的下载地址：http://www.eclipse.org/downloads/download.php?file=/technology /epp/downloads/release/helios/SR2/eclipse-jee-helios-SR2-win32.zip&amp;nbsp; &lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;此版本为解压缩版本。&lt;br /&gt;&lt;br /&gt;比如我们解压缩后的eclipse的路径为：F:\eclipse-jee-helios-SR2-win32\eclipse（以下简称%ECLIPSE_HOME%）&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;如果我们配置了jdk环境变量，进入%ECLIPSE_HOME%后，双击&amp;ldquo;eclipse.exe&amp;rdquo;，即可启动eclipse，启动时会提示你选择一个workspace。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;这 里建议大家多创建一些workspace，可以根据实际的需要将不同的project创建在不同的workspace中，以免日后workspace中的 project越来越多，影响eclipse的启动速度（当然，对于近期不使用的project建议将其关闭--右键单击项目名称选择"Close Project"，如果需要开启项目，则右键单击关闭的项目名称选择"Open Project"即可。）。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;切换workspace可以在启动是进行选择，也可以等启动后在&amp;ldquo;File&amp;rdquo;--"Switch Workapsce"中进行切换。&lt;br /&gt;&lt;br /&gt;关于eclipse对workspace的管理也可以参考&amp;ldquo;http://www.iteye.com/blog/868197 &amp;rdquo;。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;第一次启动eclipse后，我们需要做一些基本的配置，通常我们需要做如下配置：&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;1）配置jdk&lt;br /&gt;&lt;br /&gt;默认情况下，eclipse会自动关联环境变量中配置的jdk，如果我们安装了多个版本的jdk，也可以手工进行配置，方法如下：&lt;br /&gt;&lt;br /&gt;&amp;ldquo;Window&amp;rdquo;--"Preferences"--"Java"--"Installed JREs"--&amp;ldquo;Add&amp;rdquo;--"Standard VM"--选择jdk安装目录。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;2）配置tomcat&lt;br /&gt;&lt;br /&gt;&amp;ldquo;Window&amp;rdquo;--"Preferences"--"Server"--"Runtime Environments"--&amp;ldquo;Add&amp;rdquo;--"Apache"--"Apache Tomcat v7.0"--选择tomcat7的目录，在JRE中选择1）中配置的jdk即可。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;配置完成，可以 &amp;ldquo;Servers&amp;rdquo;视图中进行验证。默认&amp;ldquo;Servers&amp;rdquo;视图&amp;rdquo;在&amp;ldquo;Java EE&amp;rdquo;预设视图的下方是开启的，如果没有开启，可以通过&amp;ldquo;Window&amp;rdquo;--"Show View"--&amp;ldquo;Server&amp;rdquo;--选择Servers即可打开&amp;ldquo;Servers&amp;rdquo;视图。&lt;br /&gt;&lt;br /&gt;在&amp;ldquo;Servers&amp;rdquo;视图中，右键单击--&amp;ldquo;New&amp;rdquo;--"Server"--选择&amp;ldquo;Tomcat v7.0 Server&amp;rdquo;，如果在&amp;ldquo;Server runtime environment&amp;rdquo;中看到"Apache Tomcat v7.0"，则说明配置成功。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;3）启动提速&lt;br /&gt;&lt;br /&gt;eclipse启动时会默认加载一些插件，而加载这些插件会增加eclipse的启动时间，实际上有些东东对我们来说并没有什么用，所以可以关闭，方法如下：&lt;br /&gt;&lt;br /&gt;&amp;ldquo;Window&amp;rdquo;--"Preferences"--&amp;ldquo;General&amp;rdquo;--"Startup and Shutdown"--去掉你不想要的插件即可。&lt;br /&gt;&lt;br /&gt;4）关闭验证&lt;br /&gt;&lt;br /&gt;默认eclipse会对workspace中的项目进行验证，验证的内容包括jsp内容、xml内容，等等，验证过程很消耗内存，所以建议关闭验证功能。关闭方法如下：&lt;br /&gt;&lt;br /&gt;&amp;ldquo;Window&amp;rdquo;--"Preferences"--&amp;ldquo;Validation&amp;rdquo;--"Disable All"。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;5）设置&amp;ldquo;新建&amp;rdquo;菜单项&lt;br /&gt;&lt;br /&gt;eclipse默认的新建内容并不满足需求，好多内容还需要到other中去找，不过我们可以自定义新建菜单项中的内容，方法如下：&lt;br /&gt;&lt;br /&gt;右键单击工具栏--&amp;ldquo;Customize Prespective...&amp;rdquo;--"Shortcuts"--选择你需要的新建项即可。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;6）默认文件编辑器&lt;br /&gt;&lt;br /&gt;eclipse默认会自动选择文件的编辑器，也可以在打开文件时右键单击文件--&amp;ldquo;Open With&amp;rdquo;中选择编辑器，但有时我们可能更希望让文件使用某种特定的编辑器，此时可以通过如下方法进行配置：&lt;br /&gt;&lt;br /&gt;&amp;ldquo;Window&amp;rdquo;--"Preferences"--&amp;ldquo;General&amp;rdquo;--&amp;ldquo;Editors&amp;rdquo;--"File Associations"，上方选择特定的文件名后缀类型，下面选择编辑器，可以通过Add进行添加，通过Default设置默认编辑器。&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;7）注释风格定义&lt;br /&gt;&lt;br /&gt;相信大家都知道注释的重要性，在团队中，统一注释风格更为重要。设置注释风格方法如下：&lt;br /&gt;&lt;br /&gt;&amp;ldquo;Window&amp;rdquo;--"Preferences"--"Java"--"Code Style"--&amp;ldquo;Code Templates&amp;rdquo;--根据需要自己设置吧&lt;br /&gt;&lt;br /&gt;比如Comments中&lt;br /&gt;&lt;br /&gt;Types：&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;dl &gt;&lt;dt&gt;Java code&lt;/dt&gt;&lt;dd&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&#xD;
 * &#xD;
 * &amp;lt;一句话功能简述&amp;gt;&#xD;
 * &amp;lt;功能详细描述&amp;gt;&#xD;
 * &#xD;
 * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@author&lt;/span&gt;&lt;span style="color: #008000;"&gt;  user&#xD;
 * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@version&lt;/span&gt;&lt;span style="color: #008000;"&gt;  [版本号, Aug 29, 2011]&#xD;
 * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@see&lt;/span&gt;&lt;span style="color: #008000;"&gt;  [相关类/方法]&#xD;
 * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@since&lt;/span&gt;&lt;span style="color: #008000;"&gt;  [产品/模块版本]&#xD;
 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/dd&gt;&lt;/dl&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Methods：&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;dl &gt;&lt;dt&gt;Java code&lt;/dt&gt;&lt;dd&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&#xD;
     * &amp;lt;一句话功能简述&amp;gt;&#xD;
     * &amp;lt;功能详细描述&amp;gt;&#xD;
     * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@param&lt;/span&gt;&lt;span style="color: #008000;"&gt; args [参数说明]&#xD;
     * &#xD;
     * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@return&lt;/span&gt;&lt;span style="color: #008000;"&gt; void [返回类型说明]&#xD;
     * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@exception&lt;/span&gt;&lt;span style="color: #008000;"&gt; throws [违例类型] [违例说明]&#xD;
     * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@see&lt;/span&gt;&lt;span style="color: #008000;"&gt; [类、类#方法、类#成员]&#xD;
     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/dd&gt;&lt;/dl&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;可以通过&amp;ldquo;Alt+Shift+j&amp;rdquo;自动添加注释。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;四。eclipse常用插件安装 &lt;/strong&gt;&lt;br /&gt;之所以eclipse这么受欢迎，原因就是其拥有众多的插件作为支持，这里只介绍几个常用的插件。&lt;br /&gt;&lt;br /&gt;1）svn插件&amp;nbsp; &lt;br /&gt;&lt;br /&gt;可能有些人更喜欢&amp;ldquo;小乌龟&amp;rdquo;，不过这里还是推荐安装svn的eclipse插件。&lt;br /&gt;&lt;br /&gt;官方地址：http://subclipse.tigris.org/&amp;nbsp; &lt;br /&gt;&lt;br /&gt;目前最新版本是1.6.17&lt;br /&gt;&lt;br /&gt;Eclipse update site URL: http://subclipse.tigris.org/update_1.6.x&amp;nbsp; &lt;br /&gt;Zipped downloads: http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240&amp;nbsp; &lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;插件安装方法如下：&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;ldquo;help&amp;rdquo;--&amp;ldquo;Install new software&amp;rdquo;--&amp;ldquo;add&amp;rdquo;&lt;br /&gt;&lt;br /&gt;name:svn_subclipse&lt;br /&gt;&lt;br /&gt;Location:http://subclipse.tigris.org/update_1.6.x&lt;br /&gt;&lt;br /&gt;点击&amp;ldquo;OK&amp;rdquo;后，只选择&amp;ldquo;Subclipse&amp;rdquo;，&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;点击&amp;ldquo;next&amp;rdquo;，accept后点击finish开始安装。安装完成后会提示重启eclipse。&lt;br /&gt;&lt;br /&gt;重启eclipse后，在&amp;ldquo;Window&amp;rdquo;--"Show View"--"Other"--"SVN"中选择&amp;ldquo;SVN资源库&amp;rdquo;，即可打开&amp;ldquo;SVN资源库&amp;rdquo;视图。&lt;br /&gt;&lt;br /&gt;在视图中右键单击--&amp;ldquo;新建&amp;rdquo;--&amp;ldquo;资源库位置&amp;rdquo;--输入地址--Finish即可。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2235201.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2235201.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2234596.html</id><title type="text">C#原始类型扩展方法—this参数修饰符</title><summary type="text">[转]C#原始类型扩展方法—this参数修饰符　扩展方法使您能够向现有类型“添加”方法，而无需创建新的派生类型、重新编译或 以其他方式修改原始类型。扩展方法是一种特殊的静态方法，但可以像扩展类型上的实例方法一样进行调用。对于用 C# 和 Visual Basic 编写的客户端代码，调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。　扩展方法被定义为静态方法，但它们是通过实例方法语法进行调用的。它们的第一个参数指定该方法作用于哪个类型，并且该参数以 this 修饰符为前缀。仅当您使用 using 指令将命名空间显式导入到源代码中之后，扩展方法才位于范围中。　下面的示例演示为 Syste</summary><published>2011-11-25T06:53:00Z</published><updated>2011-11-25T06:53:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2234596.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2234596.html"/><content type="html">&lt;h1 &gt;&lt;a id="ctl02_TitleUrl"  href="http://www.cnblogs.com/chinaHunk/archive/2010/12/08/1900713.html"&gt;[转]C#原始类型扩展方法&amp;mdash;this参数修饰符&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;扩展方法使您能够向现有类型&amp;ldquo;添加&amp;rdquo;方法，而无需创建新的派生类型、重新编译或 以其他方式修改原始类型。扩展方法是一种特殊的静态方法，但可以像扩展类型上的实例方法一样进行调用。对于用 C# 和 Visual Basic 编写的客户端代码，调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。&lt;/p&gt;&#xD;
&lt;p&gt;扩展方法被定义为静态方法，但它们是通过实例方法语法进行调用的。它们的第一个参数指定该方法作用于哪个类型，并且该参数以 this 修饰符为前缀。仅当您使用 using 指令将命名空间显式导入到源代码中之后，扩展方法才位于范围中。&lt;/p&gt;&#xD;
&lt;p&gt;下面的示例演示为 System.String 类定义的一个扩展方法。请注意，它是在非嵌套、非泛型静态类内部定义的：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div id="cnblogs_code_open_95719461-1c7f-4f8f-8900-e7d9fd444383"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExtensionMethods&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt;&lt;span style="color: #000000;"&gt;     {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyExtensions&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;&lt;span style="color: #000000;"&gt;         {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; WordCount(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt; String str)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt;&lt;span style="color: #000000;"&gt;             {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; str.Split(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] { &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;?&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; }, StringSplitOptions.RemoveEmptyEntries).Length;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt;&lt;span style="color: #000000;"&gt;             }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;&lt;span style="color: #000000;"&gt;         }   &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;     }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可使用以下 using 指令将 WordCount 扩展方法放入范围中：&lt;br /&gt;　　using ExtensionMethods;&lt;br /&gt;　　而且，可以在应用程序中使用以下语法对该扩展方法进行调用：&lt;br /&gt;　　string s = "Hello Extension Methods";&lt;br /&gt;　　int i = s.WordCount();&lt;br /&gt;&lt;br /&gt;　　在代码中，可以使用实例方法语法调用该扩展方法。但是，编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。因此，并未真正违反封装原则。实际上，扩展方法无法访问它们所扩展的类型中的私有变量。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;定义和调用扩展方法：&lt;br /&gt;&lt;/strong&gt;　1、定义一个静态类以包含扩展方法。该类必须对客户端代码可见。有关可访问性规则的更多信息，请参见访问修饰符（C# 编程指南）。&lt;br /&gt;　2、将该扩展方法实现为静态方法，并使其至少具有与包含类相同的可见性。&lt;br /&gt;　3、该方法的第一个参数指定方法所操作的类型；该参数必须以 this 修饰符开头。&lt;br /&gt;　4、在调用代码中，添加一条 using 指令以指定包含扩展方法类的命名空间。&lt;br /&gt;　5、按照与调用类型上的实例方法一样的方式调用扩展方法。&lt;br /&gt;　　请注意，第一个参数不是由调用代码指定的，因为它表示正应用运算符的类型，并且编译器已经知道对象的类型。您只需通过 n 为这两个形参提供实参。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例&lt;br /&gt;&lt;/strong&gt;　　下面的示例在 MyExtensions.StringExtension 类中实现了一个名为 WordCount 的扩展方法。该方法对 String 类进行操作，而该类被指定为第一个方法参数。MyExtensions 命名空间被导入到应用程序命名空间中，并且该方法是在 Main 方法内调用的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div id="cnblogs_code_open_b9047180-7f1c-4b78-8f46-49ece37057d5"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Text;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; CustomExtensions&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Extension methods must be defined in a static class&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; StringExtension&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; This is the extension method.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; The first parameter takes the "this" modifier&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; and specifies the type for which the method is defined.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; WordCount(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt; String str)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;   {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; str.Split(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] {&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;?&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;}, StringSplitOptions.RemoveEmptyEntries).Length;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;   }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; Extension_Methods_Simple&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Import the extension method namespace.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; CustomExtensions;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Program&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Main(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] args)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;   {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; s &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;The quick brown fox jumped over the lazy dog.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Call the method as if it were an &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; instance method on the type. Note that the first&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; parameter is not specified by the calling code.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; s.WordCount();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;    System.Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Word count of s is {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, i);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;   }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2234596.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2234596.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html</id><title type="text">消息队列（Message Queue）简介及其使用</title><summary type="text">利用 MSMQ（Microsoft Message Queue），应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的防故障方法。MSMQ与XML Web Services和.Net Remoting一样，是一种分布式开发技术。但是在使用XML Web Services或.Net Remoting组件时，Client端需要和Server端实时交换信息，Server需要保持联机。MSMQ则可以在Server离线的情况下工作，将Message临时保存在Client端的消息队列中，以后联机时再发送到Server端处理。</summary><published>2011-11-25T06:53:00Z</published><updated>2011-11-25T06:53:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html"/><content type="html">&lt;p&gt;利用 MSMQ（Microsoft Message Queue），应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的防故障方法。&lt;/p&gt;&#xD;
&lt;p&gt;MSMQ与XML Web Services和.Net Remoting一样，是一种分布式开发技术。但是在使用XML Web Services或.Net Remoting组件时，Client端需要和Server端实时交换信息，Server需要保持联机。MSMQ则可以在Server离线的情况下工作，将Message临时保存在Client端的消息队列中，以后联机时再发送到Server端处理。&lt;/p&gt;&#xD;
&lt;p&gt;显然，MSMQ不适合于Client需要Server端及时响应的这种情况，MSMQ以异步的方式和Server端交互，不用担心等待Server端的长时间处理过程。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;虽然XML Web Services和.Net Remoting都提供了[OneWay]属性来处理异步调用，用来解决Server端长方法调用长时间阻碍Client端。但是不能解决大量Client负载的问题，此时Server接受的请求快于处理请求。&lt;/p&gt;&#xD;
&lt;p&gt;一般情况下，[OneWay]属性不用于专门的消息服务中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1. &lt;/strong&gt;&lt;strong&gt;基本术语和概念（&lt;/strong&gt;&lt;strong&gt;Basic terms and concepts&lt;/strong&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;消息&amp;rdquo;是在两台计算机间传送的数据单位。消息可以非常简单，例如只包含文本字符串；也可以更复杂，可能包含嵌入对象。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;消息被发送到队列中。&amp;ldquo;消息队列&amp;rdquo;是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递；如果发送消息时接收者不可用，消息队列会保留消息，直到可以成功地传递它。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;消息队列&amp;rdquo;是 Microsoft 的消息处理技术，它在任何安装了 Microsoft Windows 的计算机组合中，为任何应用程序提供消息处理和消息队列功能，无论这些计算机是否在同一个网络上或者是否同时联机。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;消息队列网络&amp;rdquo;是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息，有些保存整个网络的重要信息，而有些只是发送和接收消息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;消息队列&amp;rdquo;安装期间，管理员确定哪些服务器可以互相通信，并设置特定服务器的特殊角色。构成此&amp;ldquo;消息队列&amp;rdquo;网络的计算机称为&amp;ldquo;站点&amp;rdquo;，它们之间通过&amp;ldquo;站点链接&amp;rdquo;相互连接。每个站点链接都有一个关联的&amp;ldquo;开销&amp;rdquo;，它由管理员确定，指示了经过此站点链接传递消息的频率。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;消息队列&amp;rdquo;管理员还在网络中设置一台或多台作为&amp;ldquo;路由服务器&amp;rdquo;的计算机。路由服务器查看各站点链接的开销，确定经过多个站点传递消息的最快和最有效的方法，以此决定如何传递消息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2. &lt;/strong&gt;&lt;strong&gt;队列类型（&lt;/strong&gt;&lt;strong&gt;Queue Type&lt;/strong&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有两种主要的队列类型：由您或网络中的其他用户创建的队列和系统队列。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;用户创建的队列可能是以下任何一种队列：&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;公共队列&amp;rdquo;在整个&amp;ldquo;消息队列&amp;rdquo;网络中复制，并且有可能由网络连接的所有站点访问。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;专用队列&amp;rdquo;不在整个网络中发布。相反，它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;管理队列&amp;rdquo;包含确认在给定&amp;ldquo;消息队列&amp;rdquo;网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列（如果有的话）。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;响应队列&amp;rdquo;包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列（如果有的话）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;系统生成的队列一般分为以下几类：&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;日记队列&amp;rdquo;可选地存储发送消息的副本和从队列中移除的消息副本。每个&amp;ldquo;消息队列&amp;rdquo;客户端上的单个日记队列存储从该计算机发送的消息副本。在服务器上为每个队列创建了一个单独的日记队列。此日记跟踪从该队列中移除的消息。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;死信队列&amp;rdquo;存储无法传递或已过期的消息的副本。如果过期或无法传递的消息是事务性消息，则被存储在一种特殊的死信队列中，称为&amp;ldquo;事务性死信队列&amp;rdquo;。死信存储在过期消息所在的计算机上。有关超时期限和过期消息的更多信息，请参见默认消息属性。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;报告队列&amp;rdquo;包含指示消息到达目标所经过的路由的消息，还可以包含测试消息。每台计算机上只能有一个报告队列。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;专用系统队列&amp;rdquo;是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。&lt;/p&gt;&#xD;
&lt;p&gt;在应用程序中进行的大多数工作都涉及访问公共队列及其消息。但是，根据应用程序的日记记录、确认和其他特殊处理需要，在日常操作中很可能要使用几种不同的系统队列。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3. &lt;/strong&gt;&lt;strong&gt;同步和异步通信（&lt;/strong&gt;&lt;strong&gt;Synchronous VS. Asynchronous Communication&lt;/strong&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;队列通信天生就是异步的，因为将消息发送到队列和从队列中接收消息是在不同的进程中完成的。另外，可以异步执行接收操作，因为要接收消息的人可以对任何给定的队列调用 BeginReceive 方法，然后立即继续其他任务而不用等待答复。这与人们所了解的&amp;ldquo;同步通信&amp;rdquo;截然不同。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在同步通信中，请求的发送方在执行其他任务前，必须等待来自预定接收方的响应。发送方等待的时间完全取决于接收方处理请求和发送响应所用的时间。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4. &lt;/strong&gt;&lt;strong&gt;同消息队列交互（&lt;/strong&gt;&lt;strong&gt;Interacting with Message Queues&lt;/strong&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;消息处理和消息为基于服务器的应用程序组件之间的进程间通信提供了强大灵活的机制。同组件间的直接调用相比，它们具有若干优点，其中包括：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;稳定性 &amp;mdash; 组件失败对消息的影响程度远远小于组件间的直接调用，因为消息存储在队列中并一直留在那里，直到被适当地处理。消息处理同事务处理相似，因为消息处理是有保证的。&lt;/li&gt;&#xD;
&lt;li&gt;消息优先级 &amp;mdash; 更紧急或更重要的消息可在相对不重要的消息之前接收，因此可以为关键的应用程序保证足够的响应时间。&lt;/li&gt;&#xD;
&lt;li&gt;脱机能力 &amp;mdash; 发送消息时，它们可被发送到临时队列中并一直留在那里，直到被成功地传递。当因任何原因对所需队列的访问不可用时，用户可以继续执行操作。同时，其他操作可以继续进行，如同消息已经得到了处理一样，这是因为网络连接恢复时消息传递是有保证的。&lt;/li&gt;&#xD;
&lt;li&gt;事务性消息处理 &amp;mdash; 将多个相关消息耦合为单个事务，确保消息按顺序传递、只传递一次并且可以从它们的目标队列中被成功地检索。如果出现任何错误，将取消整个事务。&lt;/li&gt;&#xD;
&lt;li&gt;安全性 &amp;mdash; MessageQueue 组件基于的消息队列技术使用 Windows 安全来保护访问控制，提供审核，并对组件发送和接收的消息进行加密和验证。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5. &lt;/strong&gt;&lt;strong&gt;在&lt;/strong&gt;&lt;strong&gt;.Net&lt;/strong&gt;&lt;strong&gt;环境下编写简单的&lt;/strong&gt;&lt;strong&gt;Message Queue&lt;/strong&gt;&lt;strong&gt;程序&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（1）先安装Message Queuing Services&lt;/p&gt;&#xD;
&lt;p&gt;通过Control Panel，&amp;ldquo;Add/Remove Programs&amp;rdquo; &amp;ndash; &amp;ldquo;Add/Remove Windows Components&amp;rdquo;步骤安装MSMQ。&lt;/p&gt;&#xD;
&lt;p&gt;MSMQ可以安装为工作组模式或域模式。如果安装程序没有找到一台运行提供目录服务的消息队列的服务器，则只可以安装为工作组模式，此计算机上的&amp;ldquo;消息队列&amp;rdquo;只支持创建专用队列和创建与其他运行&amp;ldquo;消息队列&amp;rdquo;的计算机的直接连接。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（2）配置MSMQ&lt;/p&gt;&#xD;
&lt;p&gt;打开Computer Management &amp;ndash; Message Queuing，在Private Queues下创建MSMQDemo队列&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（3）编写代码－简单演示MSMQ对象&lt;/p&gt;&#xD;
&lt;p&gt;MessageQueue 类是&amp;ldquo;消息队列&amp;rdquo;周围的包装。MessageQueue 类提供对&amp;ldquo;消息队列&amp;rdquo;队列的引用。可以在 MessageQueue 构造函数中指定一个连接到现有资源的路径，或者可在服务器上创建新队列。在调用 Send、Peek 或 Receive 之前，必须将 MessageQueue 类的新实例与某个现有队列关联。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;MessageQueue 支持两种类型的消息检索：同步和异步。同步的 Peek 和 Receive 方法使进程线程用指定的间隔时间等待新消息到达队列。异步的 BeginPeek 和 BeginReceive 方法允许主应用程序任务在消息到达队列之前，在单独的线程中继续执行。这些方法通过使用回调对象和状态对象进行工作，以便在线程之间进行信息通讯。&lt;/p&gt;&#xD;
&lt;p&gt;// Send Message&lt;/p&gt;&#xD;
&lt;p&gt;private void btnSendMessage_Click(object sender, System.EventArgs e)&lt;/p&gt;&#xD;
&lt;p&gt;{&lt;/p&gt;&#xD;
&lt;p&gt;// Open queue&lt;/p&gt;&#xD;
&lt;p&gt;System.Messaging.MessageQueue queue = new System.Messaging.MessageQueue(".\\Private$\\MSMQDemo");&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;// Create message&lt;/p&gt;&#xD;
&lt;p&gt;System.Messaging.Message message = new System.Messaging.Message();&lt;/p&gt;&#xD;
&lt;p&gt;message.Body = txtMessage.Text.Trim();&lt;/p&gt;&#xD;
&lt;p&gt;message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] {typeof(string)});&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;// Put message into queue&lt;/p&gt;&#xD;
&lt;p&gt;queue.Send(message);&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;// Receive Message&lt;/p&gt;&#xD;
&lt;p&gt;private void btnReceiveMessage_Click(object sender, System.EventArgs e)&lt;/p&gt;&#xD;
&lt;p&gt;{&lt;/p&gt;&#xD;
&lt;p&gt;// Open queue&lt;/p&gt;&#xD;
&lt;p&gt;System.Messaging.MessageQueue queue = new System.Messaging.MessageQueue(".\\Private$\\MSMQDemo");&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;// Receive message, 同步的Receive方法阻塞当前执行线程，直到一个message可以得到&lt;/p&gt;&#xD;
&lt;p&gt;System.Messaging.Message message = queue.Receive();&lt;/p&gt;&#xD;
&lt;p&gt;message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] {typeof(string)});&lt;/p&gt;&#xD;
&lt;p&gt;txtReceiveMessage.Text = message.Body.ToString();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;MSMQ&lt;/strong&gt;是&lt;strong&gt;微软&lt;/strong&gt;消息队列的英文缩写。关于消息队列的定义在网上有相关资料，这里不在过多的解释。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;一、MSMQ介绍和安装消息队列&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用消息队列的优点：稳定、消息优先级、脱机能力以及安全性。&lt;/p&gt;&#xD;
&lt;p&gt;消息队列分为用户创建的队列(专用队列)和系统队列，用户队列分为，。我是Windows XP,看下图所示(myQueue为自己创建的消息队列,msmqtriggersnotifiations为通用队列)：&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img src="http://image.tianjimedia.com/imagelist/2008/182/yr5veix1mxo8.jpg" alt="" width="249" height="294" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对消息队列有了简单的了解后，使用MSMQ进行&lt;a  href="http://product.yesky.com/software/" target="_blank"&gt;软件&lt;/a&gt;开发需要安装MSMQ，安装完后就该进入实际的开发阶段。具体的安装过程就是在控制面板里&amp;ldquo;添加/删除程序&amp;rdquo;下&amp;ldquo;添加/删除Windows组件&amp;rdquo;，完成添加就OK。安装完成后就可以通过交互界添加新的消息队列，详细如下图：&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img src="http://image.tianjimedia.com/imagelist/2008/182/p5v68pg228mm.jpg" alt="" width="633" height="470" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;出了上面这种交互界面来创建MSMQ外，也可以通过编程来完成，.NET框架里的MessageQueue类下有一静态方法Create，用来完成消息队列的创建，其定义如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;&#xD;
&lt;p align="left"&gt;1// &lt;br /&gt;&amp;nbsp;2//&amp;nbsp;摘要: &lt;br /&gt;&amp;nbsp;3//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在指定的路径中创建非事务性&amp;ldquo;消息队列&amp;rdquo;队列。 &lt;br /&gt;&amp;nbsp;4// &lt;br /&gt;&amp;nbsp;5//&amp;nbsp;参数: &lt;br /&gt;&amp;nbsp;6//&amp;nbsp;&amp;nbsp;&amp;nbsp;path: &lt;br /&gt;&amp;nbsp;7//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;要创建的队列的路径。 &lt;br /&gt;&amp;nbsp;8// &lt;br /&gt;&amp;nbsp;9//&amp;nbsp;返回结果: &lt;br /&gt;10//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;表示新队列的&amp;nbsp;System.Messaging.MessageQueue。 &lt;br /&gt;11public&amp;nbsp;static&amp;nbsp;MessageQueue&amp;nbsp;Create(string&amp;nbsp;path); &lt;br /&gt;12// &lt;br /&gt;13//&amp;nbsp;摘要: &lt;br /&gt;14//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在指定的路径中创建事务性或非事务性&amp;ldquo;消息队列&amp;rdquo;队列。 &lt;br /&gt;15// &lt;br /&gt;16//&amp;nbsp;参数: &lt;br /&gt;17//&amp;nbsp;&amp;nbsp;&amp;nbsp;transactional: &lt;br /&gt;18//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果创建事务性队列，为&amp;nbsp;true；如果创建非事务性队列，则为&amp;nbsp;false。 &lt;br /&gt;19// &lt;br /&gt;20//&amp;nbsp;&amp;nbsp;&amp;nbsp;path: &lt;br /&gt;21//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;要创建的队列的路径。 &lt;br /&gt;22// &lt;br /&gt;23//&amp;nbsp;返回结果: &lt;br /&gt;24//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;表示新队列的&amp;nbsp;System.Messaging.MessageQueue。 &lt;br /&gt;25public&amp;nbsp;static&amp;nbsp;MessageQueue&amp;nbsp;Create(string&amp;nbsp;path,&amp;nbsp;bool&amp;nbsp;transactional);&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;实现消息队列的创建简单代码(C#)，创建一个名为"myQueue"的非事务性"消息队列"，如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;　MessageQueue.Create(@".\private$\myQueue");&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;二、创建、删除和管理队列&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在.NET环境下编写Message Queue程序的前提就是需要先安装MSMQ，本文之前已经作了详细的介绍。要开发MSMQ程序就必须学习一个很重要的类(MessageQueue)， 该类位于名称空间System.Messageing下。其中有几个常用的方法必须掌握：&lt;/p&gt;&#xD;
&lt;p&gt;--Create方法:创建使用指定路径的新消息队列。&lt;/p&gt;&#xD;
&lt;p&gt;--Delete方法：删除现有的消息队列。&lt;/p&gt;&#xD;
&lt;p&gt;--Existe方法：查看指定消息队列是否存在。&lt;/p&gt;&#xD;
&lt;p&gt;--GetAllMessages()方法:得到队列中的所有消息。&lt;/p&gt;&#xD;
&lt;p&gt;--GetPublicQueues方法：在&amp;ldquo;消息队列&amp;rdquo;网络中定位消息队列。&lt;/p&gt;&#xD;
&lt;p&gt;--Peek/BeginPeek方法：查看某个特定队列中的消息队列，但不从该队列中移出消息。&lt;/p&gt;&#xD;
&lt;p&gt;--Receive/BeginReceive方法：检索指定消息队列中最前面的消息并将其从该队列中移除。&lt;/p&gt;&#xD;
&lt;p&gt;--Send方法：发送消息到指定的消息队列。&lt;/p&gt;&#xD;
&lt;p&gt;--Purge方法：清空指定队列的消息。&lt;/p&gt;&#xD;
&lt;p&gt;上述列举的方法在此就不作详细介绍，大家可以通过下面的示例程序中来体会他们各自的功能。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;三、发送和序列化消息&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;MSMQ消息队列中定义的消息由一个主体(body)和若干属性构成。消息的主体可以由文本、二进制构成，根据需要还可以被加密。在MSMQ 中消息的大小不能够超过4MB。发送消息是通过Send方法来完成的，需要一个Message参数。&lt;/p&gt;&#xD;
&lt;p&gt;1、发送消息：&lt;/p&gt;&#xD;
&lt;p&gt;步骤：连接队列--&amp;gt;指定消息格式--&amp;gt;提供要发送的数据(主体)--&amp;gt;调用Send()方法将消息发送出去。详细见后面的示例程序。&lt;/p&gt;&#xD;
&lt;p&gt;2、序列化消息：&lt;/p&gt;&#xD;
&lt;p&gt;消息序列化可以通过.NET Framework附带的三个预定义格式化程序来完成：&lt;/p&gt;&#xD;
&lt;p&gt;-- XMLMessageFormatter对象----MessageQueue组件的默认格式化程序设置。&lt;/p&gt;&#xD;
&lt;p&gt;-- BinaryMessageFormatter对象;&lt;/p&gt;&#xD;
&lt;p&gt;-- ActiveXMessageFormatter对象;&lt;/p&gt;&#xD;
&lt;p&gt;由于后两者格式化后的消息通常不能为人阅读，所以我们经常用到的是XMLMessageFormatter对象。该对象构造方法有三种重载：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1public&amp;nbsp;XmlMessageFormatter(); &lt;br /&gt;　　2public&amp;nbsp;XmlMessageFormatter(string[]&amp;nbsp;targetTypeNames); &lt;br /&gt;　　3public&amp;nbsp;XmlMessageFormatter(Type[]&amp;nbsp;targetTypes);&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;如我们后面的示例程序中用到的序列化语句：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;1//序列化为字符串 &lt;br /&gt;2XmlMessageFormatter&amp;nbsp;formatter&amp;nbsp;=&amp;nbsp;new&amp;nbsp;XmlMessageFormatter(new&amp;nbsp;Type[]&amp;nbsp;{&amp;nbsp;typeof(string)&amp;nbsp;});&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;四、读取和接收消息&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、读取消息：&lt;/p&gt;&#xD;
&lt;p&gt;也就是从指定队列中获取消息，详细请查看本文前面的关于消息操作的方法介绍。&lt;/p&gt;&#xD;
&lt;p&gt;2、接收消息有两种方式：&lt;/p&gt;&#xD;
&lt;p&gt;--&amp;gt; 通过Receive方法--具体功能请返回本文前面有详细介绍。&lt;/p&gt;&#xD;
&lt;p&gt;--&amp;gt; 通过Peek方法--具体功能请返回本文前面有详细介绍。&lt;/p&gt;&#xD;
&lt;p&gt;五、消息使用实例&lt;/p&gt;&#xD;
&lt;p&gt;通过上面一系列的介绍，了解了MessageQueue类和常用的方法后，下面我们通过一个简单的示例程序来分析消息队列的创建、发送消息以及接收消息等相关知识点：&lt;/p&gt;&#xD;
&lt;p&gt;1、通过Create方法创建使用指定路径的新消息队列&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;1/**////&amp;nbsp;&amp;lt;summary&amp;gt; &lt;br /&gt;&amp;nbsp;2///&amp;nbsp;通过Create方法创建使用指定路径的新消息队列 &lt;br /&gt;&amp;nbsp;3///&amp;nbsp;&amp;lt;/summary&amp;gt; &lt;br /&gt;&amp;nbsp;4///&amp;nbsp;&amp;lt;param&amp;nbsp;name="queuePath"&amp;gt;&amp;lt;/param&amp;gt; &lt;br /&gt;&amp;nbsp;5public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;Createqueue(string&amp;nbsp;queuePath) &lt;br /&gt;&amp;nbsp;6{ &lt;br /&gt;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try &lt;br /&gt;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!MessageQueue.Exists(queuePath)) &lt;br /&gt;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageQueue.Create(@".\private$\myQueue"); &lt;br /&gt;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;br /&gt;14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(queuePath&amp;nbsp;+&amp;nbsp;"已经存在！"); &lt;br /&gt;16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch&amp;nbsp;(MessageQueueException&amp;nbsp;e) &lt;br /&gt;19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(e.Message); &lt;br /&gt;21&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;22}&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;2、连接消息队列并发送消息到队列&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;1/**////&amp;nbsp;&amp;lt;summary&amp;gt; &lt;br /&gt;&amp;nbsp;2///&amp;nbsp;连接消息队列并发送消息到队列 &lt;br /&gt;&amp;nbsp;3///&amp;nbsp;&amp;lt;/summary&amp;gt; &lt;br /&gt;&amp;nbsp;4public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;SendMessage() &lt;br /&gt;&amp;nbsp;5{ &lt;br /&gt;&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try &lt;br /&gt;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//连接到本地的队列 &lt;br /&gt;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageQueue&amp;nbsp;myQueue&amp;nbsp;=&amp;nbsp;new&amp;nbsp;MessageQueue(".\\private$\\myQueue"); &lt;br /&gt;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Message&amp;nbsp;myMessage&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Message(); &lt;br /&gt;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myMessage.Body&amp;nbsp;=&amp;nbsp;"消息内容"; &lt;br /&gt;13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myMessage.Formatter&amp;nbsp;=&amp;nbsp;new&amp;nbsp;XmlMessageFormatter(new&amp;nbsp;Type[]&amp;nbsp;{&amp;nbsp;typeof(string)&amp;nbsp;}); &lt;br /&gt;14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//发送消息到队列中 &lt;br /&gt;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myQueue.Send(myMessage); &lt;br /&gt;16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch&amp;nbsp;(ArgumentException&amp;nbsp;e) &lt;br /&gt;18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(e.Message); &lt;br /&gt;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;21}&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;3、连接消息队列并从消息队列中接收消息&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;&amp;nbsp;1/**////&amp;nbsp;&amp;lt;summary&amp;gt; &lt;br /&gt;&amp;nbsp;2///&amp;nbsp;连接消息队列并从队列中接收消息 &lt;br /&gt;&amp;nbsp;3///&amp;nbsp;&amp;lt;/summary&amp;gt; &lt;br /&gt;&amp;nbsp;4public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;ReceiveMessage() &lt;br /&gt;&amp;nbsp;5{ &lt;br /&gt;&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//连接到本地队列 &lt;br /&gt;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageQueue&amp;nbsp;myQueue&amp;nbsp;=&amp;nbsp;new&amp;nbsp;MessageQueue(".\\private$\\myQueue"); &lt;br /&gt;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myQueue.Formatter&amp;nbsp;=&amp;nbsp;new&amp;nbsp;XmlMessageFormatter(new&amp;nbsp;Type[]&amp;nbsp;{&amp;nbsp;typeof(string)&amp;nbsp;}); &lt;br /&gt;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try &lt;br /&gt;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//从队列中接收消息 &lt;br /&gt;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Message&amp;nbsp;myMessage&amp;nbsp;=&amp;nbsp;myQueue.Receive(); &lt;br /&gt;13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;context&amp;nbsp;=&amp;nbsp;(string)myMessage.Body;&amp;nbsp;//获取消息的内容 &lt;br /&gt;14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine("消息内容为："&amp;nbsp;+&amp;nbsp;context); &lt;br /&gt;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch&amp;nbsp;(MessageQueueException&amp;nbsp;e) &lt;br /&gt;17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(e.Message); &lt;br /&gt;19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch&amp;nbsp;(InvalidCastException&amp;nbsp;e) &lt;br /&gt;21&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(e.Message); &lt;br /&gt;23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;24}&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;4、连接队列并清空队列的全部消息&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;1/**////&amp;nbsp;&amp;lt;summary&amp;gt; &lt;br /&gt;2///&amp;nbsp;清空指定队列的消息 &lt;br /&gt;3///&amp;nbsp;&amp;lt;/summary&amp;gt; &lt;br /&gt;4public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;ClearMessage() &lt;br /&gt;5{ &lt;br /&gt;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageQueue&amp;nbsp;myQueue&amp;nbsp;=&amp;nbsp;new&amp;nbsp;MessageQueue(".\\private$\\myQueue"); &lt;br /&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myQueue.Purge(); &lt;br /&gt;8}&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5、连接队列并获取队列的全部消息&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;1/**////&amp;nbsp;&amp;lt;summary&amp;gt; &lt;br /&gt;&amp;nbsp;2///&amp;nbsp;连接队列并获取队列的全部消息 &lt;br /&gt;&amp;nbsp;3///&amp;nbsp;&amp;lt;/summary&amp;gt; &lt;br /&gt;&amp;nbsp;4public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;GetAllMessage() &lt;br /&gt;&amp;nbsp;5{ &lt;br /&gt;&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//连接到本地队列 &lt;br /&gt;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageQueue&amp;nbsp;myQueue&amp;nbsp;=&amp;nbsp;new&amp;nbsp;MessageQueue(".\\private$\\myQueue"); &lt;br /&gt;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Message[]&amp;nbsp;message&amp;nbsp;=&amp;nbsp;myQueue.GetAllMessages(); &lt;br /&gt;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XmlMessageFormatter&amp;nbsp;formatter&amp;nbsp;=&amp;nbsp;new&amp;nbsp;XmlMessageFormatter(new&amp;nbsp;Type[]&amp;nbsp;{&amp;nbsp;typeof(string)&amp;nbsp;}); &lt;br /&gt;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;message.Length;&amp;nbsp;i++) &lt;br /&gt;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message[i].Formatter&amp;nbsp;=&amp;nbsp;formatter; &lt;br /&gt;13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(message[i].Body.ToString()); &lt;br /&gt;14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;15}&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;上面依次的列举出来5个方法，这里我就不做测试了。上述方法全部通过测试的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;六、复杂消息发送实例&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过上面一系列的介绍，对于简单消息的发送和接收及消息的管理应该都不会有什么问题了，下面我在介绍一下关于复杂的消息处理，现在有这样一个需 求，要求通过消息队列将一本图书信息发送到队列里，然后从消息队列里读取出来。图书的基本信息包括图书编号、图书名称、图书作者以及图书定价，这样的一个 复杂的对象类型怎么来传输呢?详细如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table style="border-width: 1px; border-style: dotted; border-color: #cccccc; table-layout: fixed; width: 95%;" border="0" cellspacing="0" cellpadding="6" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="word-wrap: break-word;" bgcolor="#f3f3f3"&gt;&amp;nbsp;1namespace&amp;nbsp;MSMQ.App &lt;br /&gt;&amp;nbsp;2{ &lt;br /&gt;&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;class&amp;nbsp;MsgQueue &lt;br /&gt;&amp;nbsp;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**////&amp;nbsp;&amp;lt;summary&amp;gt; &lt;br /&gt;&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;通过Create方法创建使用指定路径的新消息队列 &lt;br /&gt;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;/summary&amp;gt; &lt;br /&gt;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;param&amp;nbsp;name="queuePath"&amp;gt;&amp;lt;/param&amp;gt; &lt;br /&gt;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;Createqueue(string&amp;nbsp;queuePath) &lt;br /&gt;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try &lt;br /&gt;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!MessageQueue.Exists(queuePath)) &lt;br /&gt;14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageQueue.Create(@".\private$\myQueue"); &lt;br /&gt;16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show("创建队列成功！"); &lt;br /&gt;17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;br /&gt;19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(queuePath&amp;nbsp;+&amp;nbsp;"已经存在！"); &lt;br /&gt;21&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch&amp;nbsp;(MessageQueueException&amp;nbsp;e) &lt;br /&gt;24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;25&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(e.Message); &lt;br /&gt;26&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;27&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;28 &lt;br /&gt;29&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**////&amp;nbsp;&amp;lt;summary&amp;gt; &lt;br /&gt;30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;连接消息队列并发送消息到队列 &lt;br /&gt;31&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;/summary&amp;gt; &lt;br /&gt;32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;bool&amp;nbsp;SendMessage(Book&amp;nbsp;book) &lt;br /&gt;33&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;34&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool&amp;nbsp;flag&amp;nbsp;=&amp;nbsp;false; &lt;br /&gt;35&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try &lt;br /&gt;36&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;37&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//连接到本地的队列 &lt;br /&gt;38&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageQueue&amp;nbsp;myQueue&amp;nbsp;=&amp;nbsp;new&amp;nbsp;MessageQueue(".\\private$\\myQueue"); &lt;br /&gt;39 &lt;br /&gt;40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Messaging.Message&amp;nbsp;myMessage&amp;nbsp;=&amp;nbsp;new&amp;nbsp;System.Messaging.Message(); &lt;br /&gt;41&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myMessage.Body&amp;nbsp;=&amp;nbsp;book; &lt;br /&gt;42&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myMessage.Formatter&amp;nbsp;=&amp;nbsp;new&amp;nbsp;XmlMessageFormatter(new&amp;nbsp;Type[]&amp;nbsp;{&amp;nbsp;typeof(MSMQ.App.Book)&amp;nbsp;}); &lt;br /&gt;43&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//发送消息到队列中 &lt;br /&gt;44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myQueue.Send(myMessage); &lt;br /&gt;45&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flag&amp;nbsp;=&amp;nbsp;true; &lt;br /&gt;46&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;47&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch&amp;nbsp;(ArgumentException&amp;nbsp;e) &lt;br /&gt;48&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;49&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(e.Message); &lt;br /&gt;50&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;51&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;flag; &lt;br /&gt;52&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;53 &lt;br /&gt;54&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**////&amp;nbsp;&amp;lt;summary&amp;gt; &lt;br /&gt;55&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;连接消息队列并从队列中接收消息 &lt;br /&gt;56&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;/summary&amp;gt; &lt;br /&gt;57&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;string&amp;nbsp;ReceiveMessage() &lt;br /&gt;58&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;59&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//连接到本地队列 &lt;br /&gt;60&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageQueue&amp;nbsp;myQueue&amp;nbsp;=&amp;nbsp;new&amp;nbsp;MessageQueue(".\\private$\\myQueue"); &lt;br /&gt;61&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myQueue.Formatter&amp;nbsp;=&amp;nbsp;new&amp;nbsp;XmlMessageFormatter(new&amp;nbsp;Type[]&amp;nbsp;{&amp;nbsp;typeof(MSMQ.App.Book)&amp;nbsp;}); &lt;br /&gt;62&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try &lt;br /&gt;63&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//从队列中接收消息 &lt;br /&gt;65&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Messaging.Message&amp;nbsp;myMessage&amp;nbsp;=&amp;nbsp;myQueue.Receive(); &lt;br /&gt;66&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Book&amp;nbsp;book&amp;nbsp;=&amp;nbsp;(Book)myMessage.Body;&amp;nbsp;//获取消息的内容 &lt;br /&gt;67&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;string.Format("编号：{0},书名：{1},作者：{2},定价：{3}", &lt;br /&gt;68&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;book.BookId, &lt;br /&gt;69&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;book.BookName, &lt;br /&gt;70&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;book.BookAuthor, &lt;br /&gt;71&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;book.BookPrice); &lt;br /&gt;72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;73&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch&amp;nbsp;(MessageQueueException&amp;nbsp;e) &lt;br /&gt;74&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;75&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(e.Message); &lt;br /&gt;76&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;77&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch&amp;nbsp;(InvalidCastException&amp;nbsp;e) &lt;br /&gt;78&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;79&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(e.Message); &lt;br /&gt;80&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;81&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;null; &lt;br /&gt;82&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;83&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;84}&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;其实发送复杂的消息也就是在消息序列化上有些差别，别的地方与发送普通文本消息没什么大的变化，上面类里提供了创建队列，发送消息到队列，从队列获取消息三个方法，测试结果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img src="http://image.tianjimedia.com/imagelist/2008/182/73tr907hgj7b.jpg" alt="" width="389" height="423" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上述中，完成了一个复杂类型的消息发送到队列及从队列中读取的示例。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面啰嗦哈消息队列的路径配置的问题(即 上面的类中的path参数)：偷了个懒，哈哈&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://hi.csdn.net/attachment/201104/21/0_130336584091rl.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://hi.csdn.net/attachment/201104/21/0_1303365916Paya.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;举个简单的例子来说明哈吧:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a  title="view plain" href="http://blog.csdn.net/zhang_7150/article/details/6338639"&gt;view plain&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;ol  start="1"&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;//本机消息队列&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;/*公共队列，消息队列名为myQueue*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;./myQueue&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;/*专用队列，消息队列名为myQueue*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;./&lt;span &gt;private&lt;/span&gt;&lt;span&gt;$/myQueue&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;/*Format格式，计算机名为zhang，消息队列名为myQueue*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;FormatName:DIRECT=OS:zhang/Private$/myQueue&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;//远程消息队列&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;/*配置为Ip为192.168.101.130的服务器的专用消息队列，队列名为myQueue*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;FormatName:DIRECT=TCP:192.168.101.130/Private$/myQueue&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;OK，下面的小demo来测试哈我们的消息队列是否可用：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a  title="view plain" href="http://blog.csdn.net/zhang_7150/article/details/6338639"&gt;view plain&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;ol  start="1"&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;Order&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;Id&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;get&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&lt;/span&gt;&lt;span &gt;set&lt;/span&gt;&lt;span&gt;;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;DateTime&amp;nbsp;Time&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;get&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&lt;/span&gt;&lt;span &gt;set&lt;/span&gt;&lt;span&gt;;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;Program&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;path=&lt;/span&gt;&lt;span &gt;"FormatName:DIRECT=OS:zhang/Private$/myQueue"&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span &gt;//队列路径&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;timeout=20;&lt;/span&gt;&lt;span &gt;//超时时间&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Queue&amp;nbsp;mq&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Queue(path,timeout);&lt;/span&gt;&lt;span &gt;//生成消息队列对象&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;static&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Main(&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;[]&amp;nbsp;args)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Program&amp;nbsp;p&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Program();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.SendQueue();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.Recive();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;SendQueue()&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Order&amp;nbsp;o&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Order&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;&lt;span &gt;"123456"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Time&amp;nbsp;=&amp;nbsp;DateTime.Now&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mq.Send(o,&amp;nbsp;MessageQueueTransactionType.Automatic);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Recive()&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Message&amp;nbsp;m&amp;nbsp;=&amp;nbsp;mq.Receive();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Order&amp;nbsp;o&amp;nbsp;=&amp;nbsp;(Order)m.Body;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(o.Id);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2232341.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2230886.html</id><title type="text">IE中同一个url第二次AJAX调用无法触发onreadystatechange事件</title><summary type="text">如果第二次通过XMLHttpRequest去请求一个URL，则不会触发onreadystatechange时间，虽然从调试插件来看，ie是进行了这次请求。后来发现，这个是因为在ie下，如果请求的URL已经被浏览器cache，则调用send方法以后，xhr的readyState已经成为了4，即 一开始就是请求完成的状态，当然以后readystate不会再被赋值，也不会触发onreadystatechange事件。解决办法：在调用send后立即检查xhr的readystate，如果已经结束，则直接处理，不必再等待onreadystatechange事件。getJSON:function(url,c</summary><published>2011-11-25T06:53:00Z</published><updated>2011-11-25T06:53:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2230886.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2230886.html"/><content type="html">&lt;p&gt;如果第二次通过XMLHttpRequest去请求一个URL，则不会触发onreadystatechange时间，虽然从调试插件来看，ie是进行了这次请求。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;后来发现，这个是因为在ie下，如果请求的URL已经被浏览器cache，则调用send方法以后，xhr的readyState已经成为了4，即 一开始就是请求完成的状态，当然以后readystate不会再被赋值，也不会触发onreadystatechange事件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;解决办法：在调用send后立即检查xhr的readystate，如果已经结束，则直接处理，不必再等待onreadystatechange事件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;ol  start="1"&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;getJSON&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span &gt;function&lt;/span&gt;&lt;span&gt;(url,&amp;nbsp;callback,&amp;nbsp;onerror)&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;处理ajax&amp;nbsp;get请求&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;var&lt;/span&gt;&lt;span&gt;&amp;nbsp;xhr&amp;nbsp;=&amp;nbsp;window.ActiveXObject&amp;nbsp;?&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;ActiveXObject(&lt;/span&gt;&lt;span &gt;"Microsoft.XMLHTTP"&lt;/span&gt;&lt;span&gt;)&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;XMLHttpRequest();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onerror&amp;nbsp;=&amp;nbsp;$X.isFunction(onerror)&amp;nbsp;?&amp;nbsp;onerror&amp;nbsp;:&amp;nbsp;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.open(&lt;span &gt;'GET'&lt;/span&gt;&lt;span&gt;,&amp;nbsp;url,&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.setRequestHeader(&lt;span &gt;"X-Requested-With"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span &gt;"XMLHttpRequest"&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.send();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;var&lt;/span&gt;&lt;span&gt;&amp;nbsp;f&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;function&lt;/span&gt;&lt;span&gt;()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(xhr.readyState&amp;nbsp;==&amp;nbsp;4)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(xhr.status&amp;nbsp;==&amp;nbsp;200)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;try&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;var&lt;/span&gt;&lt;span&gt;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;eval(&lt;/span&gt;&lt;span &gt;'('&lt;/span&gt;&lt;span&gt;+xhr.responseText+&lt;/span&gt;&lt;span &gt;')'&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span &gt;catch&lt;/span&gt;&lt;span&gt;&amp;nbsp;(e){&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onerror&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;onerror();&amp;nbsp;&lt;span &gt;//&amp;nbsp;处理json解析错误&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr&amp;nbsp;=&amp;nbsp;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;callback(data);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span &gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onerror&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;onerror();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr&amp;nbsp;=&amp;nbsp;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;fix&amp;nbsp;memory&amp;nbsp;leaks&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(xhr.readyState&amp;nbsp;==&amp;nbsp;4)&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;for&amp;nbsp;the&amp;nbsp;stupid&amp;nbsp;ie&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span &gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.onreadystatechange&amp;nbsp;=&amp;nbsp;f;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;}&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;span&gt; http://www.iteye.com/topic/467019&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2230886.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2230886.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2227409.html</id><title type="text">Web Service 身份验证</title><summary type="text">转自：http://www.cnblogs.com/Andy_Qin/archive/2009/08/04/1538844.html解决方案一：通过通过SOAP Header身份验证。1.我们实现一个用于身份验证的类，文件名MySoapHeader.cs MySoapHeader类继承自System.Web.Services.Protocols.SoapHeader。且定义了两个成员变量，UserName和PassWord，还定义了一个用户认证的函数ValideUser。它提供了对UserName和PassWord检查的功能usingSystem;usingSystem.Data;usingS</summary><published>2011-11-25T06:53:00Z</published><updated>2011-11-25T06:53:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2227409.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2227409.html"/><content type="html">&lt;p&gt;&lt;strong&gt;转自：http://www.cnblogs.com/Andy_Qin/archive/2009/08/04/1538844.html&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;解决方案一：通过通过SOAP Header身份验证。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.&lt;span style="color: #333333; font-family: Tahoma;"&gt;我们实现一个用于身份验证的类，文件名MySoapHeader.cs &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #333333; font-family: Tahoma;"&gt;MySoapHeader类继承自&#xD;
System.Web.Services.Protocols.SoapHeader。且定义了两个成员变量，UserName和PassWord，还定&#xD;
义了一个用户认证的函数ValideUser。它提供了对UserName和PassWord检查的功能&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Data;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Configuration;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.Security;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.UI;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.UI.HtmlControls;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.UI.WebControls;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.UI.WebControls.WebParts;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.Services;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.Services.Protocols;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;MySoapHeader&amp;nbsp;的摘要说明&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MySoapHeader:SoapHeader&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MySoapHeader()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;TODO:&amp;nbsp;在此处添加构造函数逻辑&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;UserName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;PassWord;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ValideUser(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;in_UserName,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;in_PassWord)&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;((in_UserName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;zxq&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(in_PassWord&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;123456&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.下面我们创建WebService.asmx&amp;nbsp;&amp;nbsp;&amp;nbsp; WebService.cs代码如下:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Collections;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.Services;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.Services.Protocols;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;WebService&amp;nbsp;的摘要说明&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;[WebService(Namespace&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://tempuri.org/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;[WebServiceBinding(ConformsTo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WsiProfiles.BasicProfile1_1)]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WebService&amp;nbsp;:&amp;nbsp;System.Web.Services.WebService&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WebService()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果使用设计的组件，请取消注释以下行&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;InitializeComponent();&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MySoapHeader&amp;nbsp;header;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/定义用户身份验证类变量header&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[WebMethod(Description&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;用户验证测试&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[System.Web.Services.Protocols.SoapHeader(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;header&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;用户身份验证的soap头&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;HelloWorld(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;contents)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;验证是否有权访问&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(header.ValideUser(header.UserName,&amp;nbsp;header.PassWord))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;contents&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;执行了&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;您没有权限访问&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.客户端 创建个Default.aspx&lt;/p&gt;&#xD;
&lt;p&gt;Default.aspx .cs代码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Configuration;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Data;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.Security;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.UI;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.UI.HtmlControls;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.UI.WebControls;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web.UI.WebControls.WebParts;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Default&amp;nbsp;:&amp;nbsp;System.Web.UI.Page&amp;nbsp;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Page_Load(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;com.cn1yw.WebService&amp;nbsp;test&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;com.cn1yw.WebService();&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;web引用(改成您自己的)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;com.cn1yw.MySoapHeader&amp;nbsp;Header&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;com.cn1yw.MySoapHeader();&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;web引用创建soap头对象(改成您自己的)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;设置soap头变量&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Header.UserName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;zxq&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Header.PassWord&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;123456&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;test.MySoapHeaderValue&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Header;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;调用web&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Response.Write(test.HelloWorld(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;我是强&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;解决方案二：通过集成windows身份验证。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.&amp;nbsp;将web服务程序设为集成windows身份验证&amp;nbsp; &lt;br /&gt;&amp;nbsp;&lt;img src="http://images.cnblogs.com/cnblogs_com/dever/image/iis.GIF" alt="" width="450" height="365" align="bottom" hspace="5" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.客户端web引用代码 &lt;br /&gt;Test.WebReference.Service1 wr = new Test.WebReference.Service1(); //生成web service实例 &lt;br /&gt;wr.Credentials = new NetworkCredential("guest","123"); //guest是用户名，该用户需要有一定的权限 &lt;br /&gt;lblTest.Text = wr.Add(2,2).ToString(); //调用web service方法 &lt;br /&gt;该方案的优点是比较安全，性能较好，缺点是不便于移植，部署工作量大。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2227409.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2227409.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2221762.html</id><title type="text">sql 索引</title><summary type="text">主键和唯一索引的区别主键和唯一索引的一些总结 唯一索引唯一索引不允许两行具有相同的索引值。如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在employee表中的职员姓氏(lname)列上,创建了唯一索引,则所有职员不能同姓。主键索引主键索引是唯一索引的特殊类型,数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义一个主键 将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访</summary><published>2011-11-25T06:53:00Z</published><updated>2011-11-25T06:53:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2221762.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2221762.html"/><content type="html">&lt;div style="width: 800px; padding-left: 10px; padding-right: 10px; overflow: hidden;"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;主键和唯一索引的区别&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;主键和唯一索引的一些总结&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="blogtext" &gt;&#xD;
&lt;p&gt;&lt;strong&gt;唯一索引&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;唯一索引不允许两行具有相同的索引值。如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据&lt;/p&gt;&#xD;
&lt;p&gt;将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在&amp;nbsp;employee&amp;nbsp;表中的职员姓氏&amp;nbsp;(lname)&amp;nbsp;列上,创建了唯一索引,则所有职员不能同姓。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;主键索引&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;主键索引是唯一索引的特殊类型,数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义一个主键 将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。&lt;/p&gt;&#xD;
&lt;p&gt;它们的一些比较：&lt;br /&gt; (1)对于主健/unique&amp;nbsp;constraint&amp;nbsp;oracle/sql&amp;nbsp;server/mysql等都会自动建立唯一索引&lt;br /&gt; (2)主键不一定只包含一个字段,所以如果你在主键的其中一个字段建唯一索引还是必要的&lt;br /&gt; (3)主健可作外健,唯一索引不可,&amp;nbsp;&lt;br /&gt; (4)主健不可为空,唯一索引可,&lt;br /&gt; (5)主健也可是多个字段的组合.&lt;br /&gt; (6)主键不同的是&amp;nbsp;&lt;br /&gt; a.有not&amp;nbsp;null属性&amp;nbsp;&lt;br /&gt; b.每个表只能有一个&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #3366ff;"&gt;1，创建索引&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; 对于查询占主要的应用来说，索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的，或者说没有添加更为有效的索引导致。如果不加 索引的话，那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描，如果一张表的数据量很大而符合条件的结果又很少，那么不加索引会引起致命的性能下 降。但是也不是什么情况都非得建索引不可，比如性别可能就只有两个值，建索引不仅没什么优势，还会影响到更新速度，这被称为过度索引。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #3366ff;"&gt;2，复合索引&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; 比如有一条语句是这样的：select * from users where area=&amp;rsquo;beijing&amp;rsquo; and age=22;&lt;br /&gt; 如果我们是在area和age上分别创建单个索引的话，由于mysql查询每次只能使用一个索引，所以虽然这样已经相对不做索引时全表扫描提高了很多效 率，但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age, salary)的复合索引，那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引，这被称为最佳左前缀 特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边，依次递减。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;strong&gt;3，索引不会包含有NULL值的列&lt;/strong&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;只要列中包含有NULL值都将不会被包含在索引中，复合索引中只要有一列含有NULL值，那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #3366ff;"&gt;4，使用短索引&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; 对串列进行索引，如果可能应该指定一个前缀长度。例如，如果有一个CHAR(255)的 列，如果在前10 个或20 个字符内，多数值是惟一的，那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #3366ff;"&gt;5，排序的索引问题&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; mysql查询只使用一个索引，因此如果where子句中已经使用了索引的话，那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作；尽量不要包含多个列的排序，如果需要最好给这些列创建复合索引。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #3366ff;"&gt;6，like语句操作&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; 一般情况下不鼓励使用like操作，如果非使用不可，如何使用也是一个问题。like &amp;ldquo;%aaa%&amp;rdquo; 不会使用索引而like &amp;ldquo;aaa%&amp;rdquo;可以使用索引。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #3366ff;"&gt;7，不要在列上进行运算&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; select * from users where YEAR(adddate)&amp;lt;2007;&lt;/p&gt;&#xD;
&lt;p&gt;将在每个行上进行运算，这将导致索引失效而进行全表扫描，因此我们可以改成&lt;/p&gt;&#xD;
&lt;p&gt;select * from users where adddate&amp;lt;&amp;lsquo;2007-01-01&amp;rsquo;;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;strong&gt;8，不使用NOT IN和&amp;lt;&amp;gt;操作&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;NOT IN和&amp;lt;&amp;gt;操作都不会使用索引将进行全表扫描。&lt;/span&gt;NOT IN可以NOT EXISTS代替，id&amp;lt;&amp;gt;3则可使用id&amp;gt;3 or id&amp;lt;3来代替。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;普通索引就是非聚集索引，建非聚集索引必须在有聚集索引的前提下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;建普通索引&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;create&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;index&lt;/span&gt;&lt;span style="color: #000000;"&gt; 索引名 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;on&lt;/span&gt;&lt;span style="color: #000000;"&gt; 表(字段)&#xD;
&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;唯一索引&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;create&lt;/span&gt;&lt;span style="color: #000000;"&gt; unqiue &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;index&lt;/span&gt;&lt;span style="color: #000000;"&gt; 索引名 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;on&lt;/span&gt;&lt;span style="color: #000000;"&gt; 表(字段)&#xD;
&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;聚集索引&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;create&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;clustered&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;index&lt;/span&gt;&lt;span style="color: #000000;"&gt; 索引名 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;on&lt;/span&gt;&lt;span style="color: #000000;"&gt; 表(字段)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2221762.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2221762.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2253433.html</id><title type="text">redis</title><summary type="text">下载地址：https://github.com/dmajkic/redis/downloads　redis-server.exe：服务程序 redis-check-dump.exe：本地数据库检查 redis-check-aof.exe：更新日志检查 redis-benchmark.exe：性能测试，用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).启动Redis服务（conf文件指定配置文件，若不指定则默认）：D:\redis-2.0.2&amp;gt;redis-server.exe redis.conf启动cmd窗口要一直开着，关闭后则Redis</summary><published>2011-11-25T06:52:00Z</published><updated>2011-11-25T06:52:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2253433.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2253433.html"/><content type="html">&lt;p&gt;下载地址：https://github.com/dmajkic/redis/downloads&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #000000;"&gt;　redis-server.exe&lt;/span&gt;&lt;/strong&gt;：服务程序&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;redis-check-dump.exe&lt;/strong&gt;：本地数据库检查&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; redis-check-aof.exe&lt;/strong&gt;：更新日志检查&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; redis-benchmark.exe&lt;/strong&gt;：性能测试，用以模拟同时由N&lt;/span&gt;个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).&lt;/div&gt;&#xD;
&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;启动Redis服务&lt;/span&gt;（conf文件指定配置文件，若不指定则默认）：&lt;/p&gt;&#xD;
&lt;p&gt;D:\redis-2.0.2&amp;gt;&lt;span style="color: #ff0000;"&gt;redis-server.exe&lt;/span&gt; redis.conf&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/282432/2011110920095415.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;启动cmd窗口要一直开着，关闭后则Redis服务关闭&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;这时服务开启着，另外开一个窗口进行，设置客户端：&lt;/p&gt;&#xD;
&lt;p&gt;D:\redis-2.0.2&amp;gt;&lt;span style="color: #ff0000;"&gt;redis-cli.exe&lt;/span&gt; -h &lt;span style="color: #ff0000;"&gt;202.117.16.133&lt;/span&gt; -p 6379&lt;/p&gt;&#xD;
&lt;p&gt;然后可以开始玩了：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/282432/2011110920151780.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong style="font-size: 18pt;"&gt;配置文件参数说明&lt;/strong&gt; :&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1. Redis默认不是以守护进程的方式运行，可以通过该配置项修改，使用yes启用守护进程&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;daemonize no&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2. 当Redis以守护进程方式运行时，Redis默认会把pid写入/var/run/redis.pid文件，可以通过pidfile指定&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;pidfile /var/run/redis.pid&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3. 指定Redis监听端口，默认端口为6379，作者在自己的一篇博文中解释了为什么选用6379作为默认端口，因为6379在手机按键上MERZ对应的号码，而MERZ取自意大利歌女Alessia Merz的名字&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt; port 6379&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4. 绑定的主机地址&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;bind 127.0.0.1&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;5.当 客户端闲置多长时间后关闭连接，如果指定为0，表示关闭该功能&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;timeout 300&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;6. 指定日志记录级别，Redis总共支持四个级别：debug、verbose、notice、warning，默认为verbose&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;loglevel verbose&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;7. 日志记录方式，默认为标准输出，如果配置Redis为守护进程方式运行，而这里又配置为日志记录方式为标准输出，则日志将会发送给/dev/null&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; &lt;strong style="color: #ff0000;"&gt;logfile stdout&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;8. 设置数据库的数量，默认数据库为0，可以使用SELECT &amp;lt;dbid&amp;gt;命令在连接上指定数据库id&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;databases 16&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;9. 指定在多长时间内，有多少次更新操作，就将数据同步到数据文件，可以多个条件配合&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;save &amp;lt;seconds&amp;gt; &amp;lt;changes&amp;gt;&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Redis默认配置文件中提供了三个条件：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;save 900 1&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff0000;"&gt;save 300 10&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff0000;"&gt;save 60 10000&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;分别表示900秒（15分钟）内有1个更改，300秒（5分钟）内有10个更改以及60秒内有10000个更改。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;10. 指定存储至本地数据库时是否压缩数据，默认为yes，Redis采用LZF压缩，如果为了节省CPU时间，可以关闭该选项，但会导致数据库文件变的巨大&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;rdbcompression yes&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;11. 指定本地数据库文件名，默认值为dump.rdb&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;dbfilename dump.rdb&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;12. 指定本地数据库存放目录&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;dir ./&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;13. 设置当本机为slav服务时，设置master服务的IP地址及端口，在Redis启动时，它会自动从master进行数据同步&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;slaveof &amp;lt;masterip&amp;gt; &amp;lt;masterport&amp;gt;&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;14. 当master服务设置了密码保护时，slav服务连接master的密码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;masterauth &amp;lt;master-password&amp;gt;&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;15. 设置Redis连接密码，如果配置了连接密码，客户端在连接Redis时需要通过AUTH &amp;lt;password&amp;gt;命令提供密码，默认关闭&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;requirepass foobared&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;16. 设置同一时间最大客户端连接数，默认无限制，Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数，如果设置 maxclients 0，表示不作限制。当客户端连接数到达限制时，Redis会关闭新的连接并向客户端返回max number of clients reached错误信息&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;maxclients 128&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;17. 指定Redis最大内存限制，Redis在启动时会把数据加载到内存中，达到最大内存后，Redis会先尝试清除已到期或即将到期的Key，当此方法处理 后，仍然到达最大内存设置，将无法再进行写入操作，但仍然可以进行读取操作。Redis新的vm机制，会把Key存放内存，Value会存放在swap区&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;maxmemory &amp;lt;bytes&amp;gt;&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;18. 指定是否在每次更新操作后进行日志记录，Redis在默认情况下是异步的把数据写入磁盘，如果不开启，可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的，所以有的数据会在一段时间内只存在于内存中。默认为no&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;appendonly no&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;19. 指定更新日志文件名，默认为appendonly.aof&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;appendfilename appendonly.aof&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;20. 指定更新日志条件，共有3个可选值： &lt;br /&gt; &amp;nbsp; &amp;nbsp; &lt;strong&gt;&lt;span style="color: #ff0000;"&gt;no&lt;/span&gt; &lt;/strong&gt; ：表示等操作系统进行数据缓存同步到磁盘（快） &lt;br /&gt; &amp;nbsp; &amp;nbsp; &lt;strong&gt;&lt;span style="color: #ff0000;"&gt;always&lt;/span&gt; &lt;/strong&gt; ：表示每次更新操作后手动调用fsync()将数据写到磁盘（慢，安全） &lt;br /&gt; &amp;nbsp; &amp;nbsp; &lt;strong&gt;&lt;span style="color: #ff0000;"&gt;everysec&lt;/span&gt; &lt;/strong&gt; ：表示每秒同步一次（折衷，默认值）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;appendfsync everysec&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;21. 指定是否启用虚拟内存机制，默认值为no，简单的介绍一下，VM机制将数据分页存放，由Redis将访问量较少的页即冷数据swap到磁盘上，访问多的页面由磁盘自动换出到内存中（在后面的文章我会仔细分析Redis的VM机制）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;vm-enabled no&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;22. 虚拟内存文件路径，默认值为/tmp/redis.swap，不可多个Redis实例共享&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;vm-swap-file /tmp/redis.swap&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;vm-max-memory 0&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;24. Redis swap文件分成了很多的page，一个对象可以保存在多个page上面，但一个page上不能被多个对象共享，vm-page-size是要根据存储的 数据大小来设定的，作者建议如果存储很多小对象，page大小最好设置为32或者64bytes；如果存储很大大对象，则可以使用更大的page，如果不 确定，就使用默认值&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;vm-page-size 32&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;25. 设置swap文件中的page数量，由于页表（一种表示页面空闲或使用的bitmap）是在放在内存中的，，在磁盘上每8个pages将消耗1byte的内存。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;vm-pages 134217728&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的，可能会造成比较长时间的延迟。默认值为4&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;vm-max-threads 4&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;27. 设置在向客户端应答时，是否把较小的包合并为一个包发送，默认为开启&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;glueoutputbuf yes&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;28. 指定在超过一定的数量或者最大的元素超过某一临界值时，采用一种特殊的哈希算法&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;hash-max-zipmap-entries 64&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff0000;"&gt;hash-max-zipmap-value 512&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;29. 指定是否激活重置哈希，默认为开启（后面在介绍Redis的哈希算法时具体介绍）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;activerehashing yes&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;30. 指定包含其它的配置文件，可以在同一主机上多个Redis实例之间使用同一份配置文件，而同时各个实例又拥有自己的特定配置文件&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;include /path/to/local.conf&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2253433.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2253433.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sk-net/archive/2011/11/25/2249664.html</id><title type="text">Memcached、MongoDB、Redis和tokyotyrant</title><summary type="text">MongoDB实际上是一个简化版的MySQL，Mongodb的接口实际上就是类似给SQL做个封装而已。Mongodb只能支持简单的单一查询 语句，不能join，不能子查询。实际性能MySQL和Mongodb差不多，MySQL在高并发的情况下性能不太好，MongoDB会好很多。Redis读写性能都非常强悍，但是存储数据的容量受限于内存容量。支持Lists类型和Sets类型的数据，2.0增加了更多数据类型。相当于是一个支持持久存储的memcache。tokyotyrant也是是一个高性能的存储引擎，性能非常出色，每秒可以处理4-5万次读写操作。TT不是内存映射的模式，主要是文件系统存储为主。吃内存</summary><published>2011-11-25T06:52:00Z</published><updated>2011-11-25T06:52:00Z</updated><author><name>s80895304</name><uri>http://www.cnblogs.com/sk-net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2249664.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2249664.html"/><content type="html">&lt;p&gt;MongoDB实际上是一个简化版的MySQL，Mongodb的接口实际上就是类似给SQL做个封装而已。Mongodb只能支持简单的单一查询 语句，不能join，不能子查询。实际性能MySQL和Mongodb差不多，MySQL在高并发的情况下性能不太好，MongoDB会好很多。&lt;/p&gt;&#xD;
&lt;p&gt;Redis读写性能都非常强悍，但是存储数据的容量受限于内存容量。支持Lists类型和Sets类型的数据，2.0增加了更多数据类型。相当于是一个支持持久存储的memcache。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;tokyotyrant也是是一个高性能的存储引擎，性能非常出色，每秒可以处理4-5万次读写操作。TT不是内存映射的模式，主要是文件系统存储为主。吃内存少一些。&lt;/span&gt;&lt;span style="color: #000000;"&gt;TC除了支持Key-Value存储之外，还支持保存Hashtable数据类型，表结构TokyoTyrantTable，支持列，表，字段，索引，支持query查询。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;memcached：设定最大内存占用，最久不使用自动过期，高读写性能，适合最缓存。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;redis：拥有memcached的优点，储存数据支持list，适合做队列。是否可以替代memcached我还在考虑。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;mongodb：模式自由，容易搭建分布式群集，适合做储存。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;MongoDB&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 12px; line-height: 19px; white-space: pre; background-color: #fafafa;"&gt;添加到服务:mongod.exe --dbpath d:\mongodb\work\db -- logpath d:\mongodb\work\log\log.log --install&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;启动服务监听:&lt;span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 12px; line-height: 19px; white-space: pre; background-color: #fafafa;"&gt;mongod.exe --dbpath d:\mongodb\work\db -- logpath d:\mongodb\work\log\log.log &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;测试:&lt;span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 12px; line-height: 19px;"&gt;mongo.exe命令，之后进行操作&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注：dppath和logpath必须存在，默认端口为&lt;span style="font-family: Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: 12px; line-height: 19px; white-space: pre;"&gt;27017 &lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;编译redis&lt;/p&gt;&#xD;
&lt;p&gt;启动&lt;span style="color: #000000;"&gt;src&lt;/span&gt; &lt;span style="color: #000000;"&gt;/&lt;/span&gt; &lt;span style="color: #000000;"&gt;redis&lt;/span&gt; &lt;span style="color: #000000;"&gt;-&lt;/span&gt; &lt;span style="color: #000000;"&gt;server&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;客户端连接:&lt;span style="color: #000000;"&gt;src&lt;/span&gt; &lt;span style="color: #000000;"&gt;/&lt;/span&gt; &lt;span style="color: #000000;"&gt;redis&lt;/span&gt; &lt;span style="color: #000000;"&gt;-&lt;/span&gt; &lt;span style="color: #000000;"&gt;cli，连接成功后可进行操作&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;停止服务:&lt;span style="color: #000000;"&gt;src&lt;/span&gt; &lt;span style="color: #000000;"&gt;/&lt;/span&gt; &lt;span style="color: #000000;"&gt;redis&lt;/span&gt; &lt;span style="color: #000000;"&gt;-&lt;/span&gt; &lt;span style="color: #000000;"&gt;cli shutdown&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;以配置文件启动:&lt;span style="color: #000000;"&gt;src&lt;/span&gt; &lt;span style="color: #000000;"&gt;/&lt;/span&gt; &lt;span style="color: #000000;"&gt;redis&lt;/span&gt; &lt;span style="color: #000000;"&gt;-&lt;/span&gt; &lt;span style="color: #000000;"&gt;server &lt;span style="color: #ff0000;"&gt;redis.conf&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sk-net/aggbug/2249664.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sk-net/archive/2011/11/25/2249664.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
