<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_herony420</title><subtitle type="text">海纳百川，有容乃大；壁立千仞,无欲则刚</subtitle><id>http://feed.cnblogs.com/blog/u/13011/rss</id><updated>2010-06-29T02:48:42Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/13011/rss"/><entry><id>http://www.cnblogs.com/herony420/archive/2010/06/29/1767341.html</id><title type="text">Windows Server AppFabric简介</title><summary type="text">Windows Server AppFabric简介 作者：DAVID CHAPPELL  译：程守华 开拓天际 AppFabric Caching Services：可以加快频繁访问信息的速度，比如asp.net的会话数据； AppFabric Hosting Services：这会使运行或管理类似于WCF的服务更容易，特别是建立在工作流（WWF）之上的WCF服务。  Windows Serve...</summary><published>2010-06-29T02:49:00Z</published><updated>2010-06-29T02:49:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2010/06/29/1767341.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2010/06/29/1767341.html"/><content type="html">&lt;p style="text-align: center; line-height: 115%;" align="center"&gt;&lt;span style="font-size: 26pt; line-height: 115%;"&gt;Windows Server AppFabric&lt;/span&gt;&lt;span style="font-size: 26pt; line-height: 115%; font-family: 宋体;"&gt;简介&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&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;&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;&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;span style="font-family: 宋体;"&gt;作者：&lt;/span&gt;&lt;span&gt;DAVID CHAPPELL &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;译：程守华&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;开拓天际&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;/p&gt;&lt;p style="text-align: center; line-height: 115%;" align="center"&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;&lt;img src="file:///C:/Users/ADMINI%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif" alt="*" height="11" width="11" /&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;：可以加快频繁访问信息的速度，比如&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;的会话数据；&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 42pt; text-indent: -21pt; line-height: 115%;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;&lt;img src="file:///C:/Users/ADMINI%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif" alt="*" height="11" width="11" /&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;AppFabric Hosting Services&lt;span style="font-family: 宋体;"&gt;：这会使运行或管理类似于&lt;/span&gt;WCF&lt;span style="font-family: 宋体;"&gt;的服务更容易，特别是建立在工作流（&lt;/span&gt;WWF&lt;span style="font-family: 宋体;"&gt;）之上的&lt;/span&gt;WCF&lt;span style="font-family: 宋体;"&gt;服务。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 21pt; line-height: 115%;"&gt;Windows Server AppFabric&lt;span style="font-family: 宋体;"&gt;作为&lt;/span&gt;Windows Server&lt;span style="font-family: 宋体;"&gt;的扩展，应用程序可以部分或全部的免费应用。本文档分别介绍这两种服务的工作原理以及如何在应用程序中使用它们。&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;AppFabric Caching Services&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;改进用户操作体验以及系统可扩展性的一种方法是加速他们对信息的访问。例如&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;应用程序，可以非常容易的增加逻辑规模：在逻辑上的多个服务器上发布多份业务业务&lt;/span&gt;copy&lt;span style="font-family: 宋体;"&gt;，并用这些&lt;/span&gt;copy&lt;span style="font-family: 宋体;"&gt;来满足用户的访问请求，这种模式下应用程序对用户操作体验的改进就像增加服务器一样容易。&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;但是，如果多个服务器上多个应用程序访问同一个数据库时，对数据的访问则成为瓶颈。如果&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;页面等待访问数据库，增加更多的前端服务器是于事无补的。一个解决的办法就是使用更大更&lt;/span&gt;NB&lt;span style="font-family: 宋体;"&gt;的服务器，但限制是明显的：&lt;/span&gt;NB&lt;span style="font-family: 宋体;"&gt;到什么样总的有个度，且越牛的服务器它的成本也越高。现在需要一种扩展的办法：如何将频繁访问的数据分布到多台服务器上直接让其访问，从而解决访问一台数据库服务器的瓶颈。&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;一个行之有效的方法就是建立一个发布缓存服务（&lt;/span&gt;distributed cache&lt;span style="font-family: 宋体;"&gt;），这个服务向多台客户端机器分发。相对于从一个单独的数据库获取数据，现在&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;页面可以从多个不同的机器上获取数据了，负载均衡，应用程序会有更好的表现。这就是&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;要做的，下面详细加以描述。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;认识&lt;/span&gt;&lt;span&gt;AppFabric Caching Services&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;AppFabric Caching Services&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的一个主要组件是缓存客户端（&lt;/span&gt;cache client&lt;span style="font-family: 宋体;"&gt;），如&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;页面，它访问缓存群集，缓存群集由多台运行缓存服务的服务器组成，每台服务器都运行一个&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;的实例，且每个缓存服务都包含一些数据缓存。缓存客户端可以包含自己的本地缓存，通过软件方式作为&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;的一部分对外提供服务。下图&lt;/span&gt;1&lt;span style="font-family: 宋体;"&gt;简要说明这些组件：&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;img src="file:///C:/Users/ADMINI%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.jpg" v:shapes="图片_x0020_4" height="406" width="554"  alt="" /&gt;&lt;/p&gt;  &lt;p style="text-align: center; line-height: 115%;" align="center"&gt;&lt;span style="font-family: 宋体;"&gt;图&lt;/span&gt;1 &amp;nbsp;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;对频繁访问数据的加速&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align: left; text-indent: 21pt; line-height: 115%;" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;当缓存客户端第一次使用数据，这些数据可以是&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;应用程序的使用者提供的信息，也可以是数据库读取的值，可以通过&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;客户端库明确的向缓存群集使用唯一的名字来存储这些数据。（后面也会说明，&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;应用程序也可以同&lt;/span&gt;session&lt;span style="font-family: 宋体;"&gt;对象透明的来做这一切，因此使用缓存服务并不需要对代码做任何改动）对于客户端来说，缓存群集中的所有缓存服务器显示为一个逻辑的缓存服务，客户端无需知道也不需要关心具体是哪一个服务器为其提供数据，如果选择了本地缓存，客户端也可以在其本地缓存中存储数据项。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align: left; text-indent: 21pt; line-height: 115%;" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;当客户端需要再次访问相同的数据项时，需要使用数据项的名字。查询首先从本地缓存中查找（如果设置了本地缓存）。如果数据项能够找到，则直接返回缓存数据，如果数据没有在本地缓存，查询将被送到缓存群集，如果数据能够在缓存群集中找到，则从缓存群集返回数据。数据向客户端传送的过程，就是客户端提出数据请求，&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;为其准备并返回结果。如果数据没有在本地和缓存群集找到，客户端需要从其他地方查询信息，如数据库。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align: left; text-indent: 21pt; line-height: 115%;" align="left"&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;的最初项目名称为&amp;#8220;&lt;/span&gt;Velocity&lt;span style="font-family: 宋体;"&gt;&amp;#8221;，这个英文单词所代表的意思正是它所做的：对同一数据的反复快速访问。与让程序反复访问数据库相比，它提供了直接访问本地或缓存群集内存的方式。对于应用程序频繁的访问同类数据，缓存服务同时改进了可操作性及扩展性。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align: left; text-indent: 21pt; line-height: 115%;" align="left"&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;被设计由&lt;/span&gt;.net&lt;span style="font-family: 宋体;"&gt;应用程序使用，因此，缓存数据项可以是任何可以序列化的&lt;/span&gt;.net&lt;span style="font-family: 宋体;"&gt;对象。一旦对象进入缓存，应用程序可以更新缓存的版本或者显示的删除它；缓存数据也可以被缓存服务自行删除，删除条件可以是设定的过期时间或者被更频繁访问的数据替代，缓存到本地的数据项同样如此，同时，本地缓存可以设置为与缓存群集的改变自动同步。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align: left; text-indent: 21pt; line-height: 115%;" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;多个缓存客户端可以共享相同的缓存群集，这是有意义的，因为一个可伸缩扩展的应用程序可以横跨多个服务器复制它的业务逻辑（如&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;页面），并访问缓存。同时，安全也是一个需要提出的问题，为了使共享的风险降到较低，缓存客户端或缓存服务器之间传递的数据需要数字签名和加密，管理员能够限制账户对每个缓存的访问权限。尽管如此，组织还需要保证使用同一个缓存的多个客户端是可信任的，因为他们默认可以相互访问相互之间的数据。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align: left; text-indent: 21pt; line-height: 115%;" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;缓存是对各种各样的数据时非常有用的。例如，对于类似于在线销售的产品目录信息等变化较慢或基本没有变化的数据，缓存有很好的体验，它可以在同时满足多个客户端的请求；缓存的另一个应用是存储变化的数据，但同时只能有一个客户端访问，如&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;的&lt;/span&gt;session&lt;span style="font-family: 宋体;"&gt;对象。再次强调一下，不要发生对缓存的并发访问控制问题。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align: left; text-indent: 21pt; line-height: 115%;" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;但是，对于需要变化又需要同时被多个客户端访问的数据应该怎么办呢？缓存服务仍然可以使用，但情形会复杂一下，并发控制是必须的。为了解决这个问题，&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;提供了两种并发控制方式：一种是乐观的并发控制方式，即为每个缓存对象提供版本号；另一种是悲观的并发控制方式，即使用显式锁。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;场景：在&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;应用程序中使用缓存服务&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Asp.net&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;应用程序对&lt;/span&gt;&lt;span&gt;&lt;span&gt;AppFabric Caching Services&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;来说是最重要的客户端，&lt;/span&gt;asp.net session&lt;span style="font-family: 宋体;"&gt;对象中的数据就是缓存的显著代表。事实上，&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;提供了这种支持，开发人员只需要修改一下配置，&lt;/span&gt;session&lt;span style="font-family: 宋体;"&gt;对象就会透明的存储在缓存群集中。这绝对是一个好消息，无需改变现有的&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;程序的任何代码，对于分布在多台机器做负载均衡的&lt;/span&gt;web&lt;span style="font-family: 宋体;"&gt;应用程序，不再需要将&lt;/span&gt;session&lt;span style="font-family: 宋体;"&gt;写到&lt;/span&gt;sql server&lt;span style="font-family: 宋体;"&gt;中或者第三方的状态服务上。图&lt;/span&gt;2&lt;span style="font-family: 宋体;"&gt;给出了图示：&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;img src="file:///C:/Users/ADMINI%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.jpg" v:shapes="图片_x0020_10" height="328" width="541"  alt="" /&gt;&lt;/p&gt;  &lt;p style="text-align: center; line-height: 115%;" align="center"&gt;&lt;span style="font-family: 宋体;"&gt;图&lt;/span&gt;2 asp.net&lt;span style="font-family: 宋体;"&gt;应用程序的&lt;/span&gt;session&lt;span style="font-family: 宋体;"&gt;对象在&lt;/span&gt;&lt;span&gt;AppFabric Caching Services&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中的存储与使用&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;这个简单应用场景从用户将数据存储到&lt;/span&gt;session&lt;span style="font-family: 宋体;"&gt;对象开始（第一步），处理这个请求的&lt;/span&gt;web server&lt;span style="font-family: 宋体;"&gt;已经配置为使用&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;来缓存&lt;/span&gt;Session&lt;span style="font-family: 宋体;"&gt;对象，因此用户数据被写到一个或多个&lt;/span&gt;cache server&lt;span style="font-family: 宋体;"&gt;上（第二步）；下一个请求依赖于第一步提供的数据，但他被不同的&lt;/span&gt;web server&lt;span style="font-family: 宋体;"&gt;处理（第三步）；在&lt;/span&gt;web &lt;span style="font-family: 宋体;"&gt;服务器上的&lt;/span&gt;asp.net &lt;span style="font-family: 宋体;"&gt;代码访问缓存群集获取&lt;/span&gt;session&lt;span style="font-family: 宋体;"&gt;对象，这个过程使第一步存储的数据对应用程序再次使用。注意到这里并没有访问数据库，因为缓存对象并没有存放在数据库，也没有对每个请求访问同一个&lt;/span&gt;web server&lt;span style="font-family: 宋体;"&gt;。对于&lt;/span&gt;asp.net&lt;span style="font-family: 宋体;"&gt;应用程序来说，这种结果会有更好的扩展性和操作性体验。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;场景：高可用性的缓存应用&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AppFabric Caching Services&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;在内存中存储所有的缓存，而不是写到磁盘上，默认情况下，每个缓存对象都是缓存到缓存群集的一台机器上。当&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;的一台机器发生问题的时候，为了能够使数据可恢复，&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;提供了高可用性选项，&lt;/span&gt;&lt;span&gt;AppFabric Caching Services&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;为每一个缓存对象在群集中的另外一台机器上创建一份&lt;/span&gt;copy&lt;span style="font-family: 宋体;"&gt;。当首选的缓存服务的服务器发生问题时，另一台机器上的缓存&lt;/span&gt;copy&lt;span style="font-family: 宋体;"&gt;能够正常的接管工作。图&lt;/span&gt;3&lt;span style="font-family: 宋体;"&gt;说明了它的工作原理：&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;img src="file:///C:/Users/ADMINI%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image007.jpg" v:shapes="图片_x0020_13" height="347" width="554"  alt="" /&gt;&lt;/p&gt;  &lt;p style="text-align: center; line-height: 115%;" align="center"&gt;&lt;span style="font-family: 宋体;"&gt;图&lt;/span&gt;3&amp;nbsp;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;在高可用性模式下复制缓存对象的副本，在首选缓存对象发生故障时，复制的备用对象仍能够提供服务&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align: center; line-height: 115%;" align="center"&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;在图&lt;/span&gt;3&lt;span style="font-family: 宋体;"&gt;的例子中，高可用性选项被选中，因此，缓存对象都分布在两台不同的&lt;/span&gt;server&lt;span style="font-family: 宋体;"&gt;上。首选缓存&lt;/span&gt;copy&lt;span style="font-family: 宋体;"&gt;，图中填充的图形的部分，执行了所有的内存项变化，这些变化都会自动的同步到备选&lt;/span&gt;copy&lt;span style="font-family: 宋体;"&gt;上，即图中的没有填充的图形项。现在，首选服务的缓存机关掉（第一步），来自客户端的请求数据将通过备选缓存服务器提供数据（步骤&lt;/span&gt;2/3&lt;span style="font-family: 宋体;"&gt;）。&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;这个例子说明了当缓存的主&lt;/span&gt;copy&lt;span style="font-family: 宋体;"&gt;发生故障时，读数据能够通过备份正常工作，对于数据的更新也可以正常工作。一旦&lt;/span&gt;AppFabric Caching Services&lt;span style="font-family: 宋体;"&gt;检测到主服务不可用，它会把备份服务置为主服务，同时建立一份新的备份，而对于客户端来说，这一切都像没有发生一样。&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: 115%;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;不管是否选中了高可用性，&lt;/span&gt;&lt;span&gt;AppFabric Caching Services&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;提供的对高频率数据的高速访问总是很有用的。对于&lt;/span&gt;Windows&lt;span style="font-family: 宋体;"&gt;程序来说，这些都可以提供更好的逻辑支持。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;AppFabric Hosting Services&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt; line-height: 115%;"&gt;&lt;span style="font-family: 宋体;"&gt;应用程序一般是通过服务的方式暴露功能，对于&lt;/span&gt;Windows&lt;span style="font-family: 宋体;"&gt;应用程序来说，这些服务很多情况下是通过&lt;/span&gt;WCF&lt;span style="font-family: 宋体;"&gt;实现的，同时，一些服务的逻辑通过工作流来实现会更好，因此，在工作流基础上创建&lt;/span&gt;WCF&lt;span style="font-family: 宋体;"&gt;服务也会有很大的可能。我们怎么样让这些服务运行起来呢？&lt;/span&gt;windows&lt;span style="font-family: 宋体;"&gt;提供了很多通用的&lt;/span&gt;host&lt;span style="font-family: 宋体;"&gt;宿主方式，开发者可以按其所需创建&lt;/span&gt;host&lt;span style="font-family: 宋体;"&gt;程序。但创建一个高效的、可管理的&lt;/span&gt;host&lt;span style="font-family: 宋体;"&gt;宿主却不是容易的事情了。使用&lt;/span&gt;wcf&lt;span style="font-family: 宋体;"&gt;与&lt;/span&gt;wf&lt;span style="font-family: 宋体;"&gt;，通过&lt;/span&gt;Windows server&lt;span style="font-family: 宋体;"&gt;自身提供的功能方便的实现对&lt;/span&gt;host&lt;span style="font-family: 宋体;"&gt;的支持及管理，这就是&lt;/span&gt;AppFabric Hosting Services&lt;span style="font-family: 宋体;"&gt;所要做的工作。先来看一下&lt;/span&gt;WCF&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;WF&lt;span style="font-family: 宋体;"&gt;的基础工作原理：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;基础技术&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt; line-height: 115%;"&gt;WCF&lt;span style="font-family: 宋体;"&gt;提供常用暴露及使用服务的途径，&lt;/span&gt;WF&lt;span style="font-family: 宋体;"&gt;提供创建工作流逻辑的支持。因为&lt;/span&gt;WF&lt;span style="font-family: 宋体;"&gt;工作流经常使用服务与外部世界交互，我们首先从&lt;/span&gt;WCF&lt;span style="font-family: 宋体;"&gt;开始描述这两种技术：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;创建&lt;/span&gt;WCF&lt;span style="font-family: 宋体;"&gt;服务&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="file:///C:/Users/ADMINI%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg" v:shapes="图片_x0020_22" height="166" width="554"  alt="" /&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;WCF&lt;span style="font-family: 宋体;"&gt;服务通过一个或多个&lt;/span&gt;endpoint&lt;span style="font-family: 宋体;"&gt;向客户端开放，每个&lt;/span&gt;endpoint&lt;span style="font-family: 宋体;"&gt;都作为一个契约或接口暴露。服务一般把它的功能分成一些&lt;/span&gt;operations&lt;span style="font-family: 宋体;"&gt;，每个&lt;/span&gt;operation&lt;span style="font-family: 宋体;"&gt;都承载业务逻辑的一部分。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;创建工作流：&lt;/span&gt;Windows Workflow Foundation&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="file:///C:/Users/ADMINI%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpg" v:shapes="图片_x0020_25" height="269" width="554"  alt="" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;img src="http://www.cnblogs.com/herony420/aggbug/1767341.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/herony420/archive/2010/06/29/1767341.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/herony420/archive/2010/06/24/1764447.html</id><title type="text">必需参数和重载组--WF</title><summary type="text">可以对活动进行配置，以便必须绑定某些参数才能有效执行该活动。 RequiredArgument  特性用于指示活动中的某些参数是必需参数， OverloadGroup  特性用于将必需参数的多个类别组合在一起。使用这些特性，活动作者可以提供简单或复杂的活动验证配置。  使用必需参数  若要在活动中使用 RequiredArgument 特性，请使用 RequiredArgumentAttribut...</summary><published>2010-06-24T07:16:00Z</published><updated>2010-06-24T07:16:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2010/06/24/1764447.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2010/06/24/1764447.html"/><content type="html">&lt;div id="mainBody"&gt; &lt;p&gt;可以对活动进行配置，以便必须绑定某些参数才能有效执行该活动。 &lt;strong&gt;RequiredArgument&lt;/strong&gt;  特性用于指示活动中的某些参数是必需参数， &lt;strong&gt;OverloadGroup&lt;/strong&gt;  特性用于将必需参数的多个类别组合在一起。使用这些特性，活动作者可以提供简单或复杂的活动验证配置。 &lt;/p&gt; &lt;p&gt;&lt;strong&gt;使用必需参数&lt;/strong&gt;&lt;/p&gt; &lt;div id="sectionSection0"&gt; &lt;p&gt;若要在活动中使用 &lt;strong&gt;RequiredArgument&lt;/strong&gt; 特性，请使用 &lt;a href="http://www.cnblogs.com/herony420/admin/ms.help?method=page&amp;amp;id=T%3ASYSTEM.ACTIVITIES.REQUIREDARGUMENTATTRIBUTE&amp;amp;product=VS&amp;amp;productVersion=100&amp;amp;topicVersion=100&amp;amp;locale=ZH-CN&amp;amp;topicLocale=ZH-CN" target="_blank"&gt;RequiredArgumentAttribute&lt;/a&gt; 指示所需参数。下面的示例定义了一个含有两个必需参数的  &lt;code&gt;Add&lt;/code&gt; 活动。 &lt;/p&gt; &lt;div id="ID0EFCAAABA"&gt;&lt;br /&gt;&lt;div id="ID0EFCAAABA_codecollection"&gt;&lt;div style="display: block;" id="ID0EFCAAABA_code_Div2"&gt;&lt;pre&gt;&lt;codesnippet xmlns="http://msdn2.microsoft.com/mtps" enablecopycode="true" displaylanguage="C#" containsmarkup="true" runat="server"&gt;public sealed class Add : CodeActivity&amp;lt;int&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;[RequiredArgument]&lt;/strong&gt;&lt;br /&gt;    public InArgument&amp;lt;int&amp;gt; Operand1 { get; set; }&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;[RequiredArgument]&lt;/strong&gt;&lt;br /&gt;    public InArgument&amp;lt;int&amp;gt; Operand2 { get; set; }&lt;br /&gt;&lt;br /&gt;    protected override int Execute(CodeActivityContext context)&lt;br /&gt;    {&lt;br /&gt;        return Operand1.Get(context) + Operand2.Get(context);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;            &lt;/codesnippet&gt;&lt;/pre&gt;&lt;/div&gt; &lt;div style="display: none;" id="ID0EFCAAABA_code_Plain_Div2"&gt;&lt;pre&gt;public sealed class Add : CodeActivity&amp;lt;int&amp;gt; {                    [RequiredArgument]     public InArgument&amp;lt;int&amp;gt; Operand1 { get; set; }                     [RequiredArgument]     public InArgument&amp;lt;int&amp;gt; Operand2 { get; set; }      protected override int Execute(CodeActivityContext context)     {         return Operand1.Get(context) + Operand2.Get(context);     } }             &lt;/pre&gt;&lt;/div&gt;      &lt;/div&gt;&lt;/div&gt;   &lt;p&gt;在 XAML 中，也请使用 &lt;strong&gt;RequiredArgumentAttribute&lt;/strong&gt;  来指示所需参数。下面的示例定义了一个含有三个参数的 &lt;code&gt;Add&lt;/code&gt; 活动，并使用 &lt;a href="http://www.cnblogs.com/herony420/admin/ms.help?method=page&amp;amp;id=T%3ASYSTEM.ACTIVITIES.STATEMENTS.ASSIGN%601&amp;amp;product=VS&amp;amp;productVersion=100&amp;amp;topicVersion=100&amp;amp;locale=ZH-CN&amp;amp;topicLocale=ZH-CN" target="_blank"&gt;Assign&lt;/a&gt; 活动执行添加操作。 &lt;/p&gt; &lt;div id="ID0EDCAAABA"&gt; &lt;div id="ID0EDCAAABA_tabs"&gt;  &lt;div id="ID0EDCAAABA_tab1" enablecopycode="true"&gt;&lt;a xmlns=""&gt;XAML&lt;/a&gt;&lt;/div&gt; &lt;/div&gt; &lt;div id="ID0EDCAAABA_codecollection"&gt; &lt;div&gt; &lt;div&gt;&lt;a target="_blank" id="ID0EDCAAABA_copycode" title="复制到剪贴板" href="javascript:CopyToClipboard('ID0EDCAAABA','5')"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a target="_blank" id="ID0EDCAAABA_PrintText" title="Print" href="javascript:Print('ID0EDCAAABA','5')"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt; &lt;div id="ID0EDCAAABA_code_Div1"&gt;&lt;pre&gt;&lt;codesnippet xmlns="http://msdn2.microsoft.com/mtps" enablecopycode="true" displaylanguage="XAML" containsmarkup="true" runat="server"&gt;&amp;lt;Activity x:Class="ValidationDemo.Add" ...&amp;gt;&lt;br /&gt;  &amp;lt;x:Members&amp;gt;&lt;br /&gt;    &amp;lt;x:Property Name="Operand1" Type="InArgument(x:Int32)"&amp;gt;&lt;br /&gt;      &amp;lt;x:Property.Attributes&amp;gt;&lt;br /&gt;        &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;lt;RequiredArgumentAttribute /&amp;gt;&lt;/strong&gt;&lt;br /&gt;      &amp;lt;/x:Property.Attributes&amp;gt;&lt;br /&gt;    &amp;lt;/x:Property&amp;gt;&lt;br /&gt;    &amp;lt;x:Property Name="Operand2" Type="InArgument(x:Int32)"&amp;gt;&lt;br /&gt;      &amp;lt;x:Property.Attributes&amp;gt;&lt;br /&gt;        &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;lt;RequiredArgumentAttribute /&amp;gt;&lt;/strong&gt;&lt;br /&gt;      &amp;lt;/x:Property.Attributes&amp;gt;&lt;br /&gt;    &amp;lt;/x:Property&amp;gt;&lt;br /&gt;    &amp;lt;x:Property Name="Result" Type="OutArgument(x:Int32)" /&amp;gt;&lt;br /&gt;  &amp;lt;/x:Members&amp;gt;&lt;br /&gt;  &amp;lt;Assign&amp;gt;&lt;br /&gt;    &amp;lt;Assign.To&amp;gt;&lt;br /&gt;      &amp;lt;OutArgument x:TypeArguments="x:Int32"&amp;gt;[Result]&amp;lt;/OutArgument&amp;gt;&lt;br /&gt;    &amp;lt;/Assign.To&amp;gt;&lt;br /&gt;    &amp;lt;Assign.Value&amp;gt;&lt;br /&gt;      &amp;lt;InArgument x:TypeArguments="x:Int32"&amp;gt;[Operand1 + Operand2]&amp;lt;/InArgument&amp;gt;&lt;br /&gt;    &amp;lt;/Assign.Value&amp;gt;&lt;br /&gt;  &amp;lt;/Assign&amp;gt;&lt;br /&gt;&amp;lt;/Activity&amp;gt;&lt;br /&gt;            &lt;/codesnippet&gt;&lt;/pre&gt;&lt;/div&gt; &lt;div style="display: none;" id="ID0EDCAAABA_code_Plain_Div1"&gt;&lt;pre&gt;&amp;lt;Activity x:Class="ValidationDemo.Add" ...&amp;gt;   &amp;lt;x:Members&amp;gt;     &amp;lt;x:Property Name="Operand1" Type="InArgument(x:Int32)"&amp;gt;       &amp;lt;x:Property.Attributes&amp;gt;                        &amp;lt;RequiredArgumentAttribute /&amp;gt;       &amp;lt;/x:Property.Attributes&amp;gt;     &amp;lt;/x:Property&amp;gt;     &amp;lt;x:Property Name="Operand2" Type="InArgument(x:Int32)"&amp;gt;       &amp;lt;x:Property.Attributes&amp;gt;                        &amp;lt;RequiredArgumentAttribute /&amp;gt;       &amp;lt;/x:Property.Attributes&amp;gt;     &amp;lt;/x:Property&amp;gt;     &amp;lt;x:Property Name="Result" Type="OutArgument(x:Int32)" /&amp;gt;   &amp;lt;/x:Members&amp;gt;   &amp;lt;Assign&amp;gt;     &amp;lt;Assign.To&amp;gt;       &amp;lt;OutArgument x:TypeArguments="x:Int32"&amp;gt;[Result]&amp;lt;/OutArgument&amp;gt;     &amp;lt;/Assign.To&amp;gt;     &amp;lt;Assign.Value&amp;gt;       &amp;lt;InArgument x:TypeArguments="x:Int32"&amp;gt;[Operand1 + Operand2]&amp;lt;/InArgument&amp;gt;     &amp;lt;/Assign.Value&amp;gt;   &amp;lt;/Assign&amp;gt; &amp;lt;/Activity&amp;gt;             &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;p&gt;如果使用了该活动，但未绑定任何一个必需参数，则会返回以下验证错误。&lt;/p&gt; &lt;div&gt;&lt;pre&gt;未提供必需活动参数&amp;#8220;Operand1&amp;#8221;的值。&lt;/pre&gt;&lt;/div&gt; &lt;div&gt; &lt;table&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th&gt;&lt;img alt="Ee358733.note(zh-cn,VS.100).gif" src="http://127.0.0.1:47873/help/1-3316/ms.help?content/Microsoft/store/Development_Frameworks_27543092_VS_100_zh-cn_1.mshc;/IC101471" /&gt;  注意： &lt;/th&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;有关检查和处理验证错误和警告的更多信息，请参见 &lt;a href="http://www.cnblogs.com/herony420/admin/ms.help?method=page&amp;amp;id=22BEF766-C505-4FD4-AC0F-7B363B238969&amp;amp;product=VS&amp;amp;productVersion=100&amp;amp;topicVersion=100&amp;amp;locale=ZH-CN&amp;amp;topicLocale=ZH-CN" target="_blank"&gt;调用活动验证&lt;/a&gt;。  &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;&lt;/div&gt; &lt;p&gt;&lt;strong&gt;使用重载组&lt;/strong&gt;&lt;/p&gt; &lt;div id="sectionSection1"&gt; &lt;p&gt;重载组提供了一种方法，指示哪些参数组合在活动中有效。使用 &lt;a href="http://www.cnblogs.com/herony420/admin/ms.help?method=page&amp;amp;id=T%3ASYSTEM.ACTIVITIES.OVERLOADGROUPATTRIBUTE&amp;amp;product=VS&amp;amp;productVersion=100&amp;amp;topicVersion=100&amp;amp;locale=ZH-CN&amp;amp;topicLocale=ZH-CN" target="_blank"&gt;OverloadGroupAttribute&lt;/a&gt; 将参数组合在一起。将为每个组提供一个名称，该名称由  &lt;strong&gt;OverloadGroupAttribute&lt;/strong&gt; 指定，仅当绑定重载组中的一组参数时，该活动才有效。下面的示例定义了一个  &lt;code&gt;CreateLocation&lt;/code&gt; 类。&lt;br /&gt;&lt;/p&gt; &lt;div id="ID0ECAAAABA"&gt;&lt;div id="ID0ECAAAABA_codecollection"&gt;&lt;div style="display: block;" id="ID0ECAAAABA_code_Div2"&gt;&lt;pre&gt;&lt;codesnippet xmlns="http://msdn2.microsoft.com/mtps" enablecopycode="true" displaylanguage="C#" containsmarkup="true" runat="server"&gt;class CreateLocation: Activity&lt;br /&gt;{&lt;br /&gt;    [RequiredArgument]&lt;br /&gt;    public InArgument&amp;lt;string&amp;gt; Name { get; set; }&lt;br /&gt;   &lt;br /&gt;    public InArgument&amp;lt;string&amp;gt; Description { get; set; }&lt;br /&gt;&lt;br /&gt;    [RequiredArgument]&lt;br /&gt;    &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;[OverloadGroup("G1")]&lt;/strong&gt;&lt;br /&gt;    public InArgument&amp;lt;int&amp;gt; Latitude { get; set; }&lt;br /&gt;    &lt;br /&gt;    [RequiredArgument]&lt;br /&gt;    &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;[OverloadGroup("G1")]&lt;/strong&gt;&lt;br /&gt;    public InArgument&amp;lt;int&amp;gt; Longitude { get; set; }&lt;br /&gt;&lt;br /&gt;    [RequiredArgument]&lt;br /&gt;    &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;[OverloadGroup("G2")]&lt;/strong&gt;&lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;[OverloadGroup("G3")]&lt;/strong&gt;&lt;br /&gt;    public InArgument&amp;lt;string&amp;gt; Street { get; set; }&lt;br /&gt;&lt;br /&gt;    [RequiredArgument]&lt;br /&gt;    &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;[OverloadGroup("G2")]&lt;/strong&gt;&lt;br /&gt;    public InArgument&amp;lt;string&amp;gt; City { get; set; }&lt;br /&gt;&lt;br /&gt;    [RequiredArgument]&lt;br /&gt;    &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;[OverloadGroup("G2")]&lt;/strong&gt;&lt;br /&gt;    public InArgument&amp;lt;string&amp;gt; State { get; set; }&lt;br /&gt;    &lt;br /&gt;    [RequiredArgument]&lt;br /&gt;    &lt;br /&gt;              &lt;strong xmlns="http://www.w3.org/1999/xhtml"&gt;[OverloadGroup("G3")]&lt;/strong&gt;&lt;br /&gt;    public InArgument&amp;lt;int&amp;gt; Zip { get; set; }                &lt;br /&gt;}&lt;br /&gt;            &lt;/codesnippet&gt;&lt;/pre&gt;&lt;/div&gt; &lt;div style="display: none;" id="ID0ECAAAABA_code_Plain_Div2"&gt;&lt;pre&gt;class CreateLocation: Activity {     [RequiredArgument]     public InArgument&amp;lt;string&amp;gt; Name { get; set; }         public InArgument&amp;lt;string&amp;gt; Description { get; set; }      [RequiredArgument]                    [OverloadGroup("G1")]     public InArgument&amp;lt;int&amp;gt; Latitude { get; set; }          [RequiredArgument]                    [OverloadGroup("G1")]     public InArgument&amp;lt;int&amp;gt; Longitude { get; set; }      [RequiredArgument]                    [OverloadGroup("G2")][OverloadGroup("G3")]     public InArgument&amp;lt;string&amp;gt; Street { get; set; }      [RequiredArgument]                    [OverloadGroup("G2")]     public InArgument&amp;lt;string&amp;gt; City { get; set; }      [RequiredArgument]                    [OverloadGroup("G2")]     public InArgument&amp;lt;string&amp;gt; State { get; set; }          [RequiredArgument]                    [OverloadGroup("G3")]     public InArgument&amp;lt;int&amp;gt; Zip { get; set; }                 }             &lt;/pre&gt;&lt;/div&gt;      &lt;/div&gt;&lt;/div&gt;   &lt;p&gt;该活动的目的是指定美国的某个位置。为此，活动用户可以使用三组参数中的一组来指定该位置。为了指定有效的参数组合，定义了三个重载组。  &lt;code&gt;G1&lt;/code&gt; 包含 &lt;code&gt;Latitude&lt;/code&gt; 和 &lt;code&gt;Longitude&lt;/code&gt; 参数。  &lt;code&gt;G2&lt;/code&gt; 包含 &lt;code&gt;Street&lt;/code&gt;、 &lt;code&gt;City&lt;/code&gt; 和 &lt;code&gt;State&lt;/code&gt;。  &lt;code&gt;G3&lt;/code&gt; 包含 &lt;code&gt;Street&lt;/code&gt; 和 &lt;code&gt;Zip&lt;/code&gt;。 &lt;code&gt;Name&lt;/code&gt;  也是必需参数，但不属于重载组的一部分。为使该活动有效，必须绑定 &lt;code&gt;Name&lt;/code&gt; 和一个（且只有一个）重载组中的所有参数。 &lt;/p&gt; &lt;p&gt;重载组不能为另一个重载组的子集或等价集。当子集仅包含 &lt;strong&gt;RequiredArgument&lt;/strong&gt; 为  &lt;strong&gt;false&lt;/strong&gt;  的参数时例外，这是此规则的唯一例外情况。重载组可以重叠，但如果组的交集包含一个或两个重载组的所有必需参数，则会出错。如果重载组中的所有  &lt;strong&gt;RequiredArgument&lt;/strong&gt; 参数均被绑定，则该组将被视为绑定的重载组。如果一个组具有零个  &lt;strong&gt;RequiredArgument&lt;/strong&gt;  参数且至少有一个参数被绑定，则该组将被视为绑定的组。如果没有绑定任何组，除非其中的一个重载组中未包含任何  &lt;strong&gt;RequiredArgument&lt;/strong&gt; 参数，否则将会出错。不允许绑定多个重载组中的  &lt;strong&gt;RequiredArgument&lt;/strong&gt;  参数。绑定多个重载组（即，绑定一个重载组中的所有必需参数，并同时绑定另一个重载组中的所有参数）的做法是错误的。 &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/herony420/aggbug/1764447.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/herony420/archive/2010/06/24/1764447.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/herony420/archive/2010/05/20/1739869.html</id><title type="text">What is JSON：The application/json Media Type for JSON</title><summary type="text">Network Working Group D. CrockfordRequest for Comments: 4627 JSON.orgCategory: Informational July 2006摘要1. 说明2. JSON语法JSON-text = object / array begin-array = ws %x5B ws ; [ 左方括号begin-object = ws %x7B...</summary><published>2010-05-20T03:05:00Z</published><updated>2010-05-20T03:05:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2010/05/20/1739869.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2010/05/20/1739869.html"/><content type="html">&lt;p align="justify"&gt;&lt;a id="ctl04_TitleUrl"  href="http://www.cnblogs.com/hunts/archive/2006/11/19/565141.html" target="_blank"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Network Working Group&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; D. Crockford&lt;br /&gt;Request for Comments: 4627&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JSON.org&lt;br /&gt;Category: Informational&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; July 2006&lt;/p&gt;&#xD;
&lt;div align="center"&gt;&lt;pre&gt;The application/json Media Type for JavaScript Object Notation (JSON)&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;Status of This Memo&lt;/pre&gt;&lt;pre&gt;This memo provides information for the Internet community.&amp;nbsp; It does not specify an Internet standard of any kind.&amp;nbsp; Distribution of this memo is unlimited.&lt;/pre&gt;&lt;pre&gt;Copyright Notice&lt;/pre&gt;&lt;pre&gt;Copyright (C) The Internet Society (2006).&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;摘要&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;JavaScript Object Notation (JSON) 是一种轻量级、基于文本、语言无关的数据交换格式。它是从ECMAScript语言标准衍生而来的。JSON为轻便的表示结构化数据，定义了一小套格式化规则&lt;/pre&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;1.&amp;nbsp; 说明&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;JSON是结构化数据串行化的文本格式。它衍生自Javascript的对象实字，这定义在ECMAScript语言标准第三版中。&lt;/pre&gt;&lt;pre&gt;JSON能够描述四种简单的类型（字符串、数字、布尔值及null）和两种结构化类型（对象及数组）。&lt;/pre&gt;&lt;pre&gt;字符串(string)是零个或多个Unicode字符的序列。&lt;/pre&gt;&lt;pre&gt;对象(object)是无次序的零个或多个名/值(name/value)对的集合，这里的name是string类型，value则可以是string、number、boolean、null、object或array类型。&lt;/pre&gt;&lt;pre&gt;数组(array)是零个或多个value的有序序列。&lt;/pre&gt;&lt;pre&gt;"object"和"array"这两个术语来自JavaScript规范。&lt;/pre&gt;&lt;pre&gt;JSON的设计目标是使它成为小的、轻便的、文本的，而且是JavaScript的一个子集。&amp;nbsp;&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&lt;pre&gt;1.1.&amp;nbsp; 本文档使用的术语/约定&lt;/pre&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;本文档中的关键字："MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT", "SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY"和"OPTIONAL"，按照[RFC2119]中所描述的来解释。&lt;/pre&gt;&lt;pre&gt;本文档中的语法规则按照[RFC4234]中所描述的来解释。&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;2.&amp;nbsp; JSON语法&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;JSON文本是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个实字名。&lt;/pre&gt;&lt;pre&gt;JSON文本一个串行化的对象或数组。&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&gt;JSON-text = object / array &lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;以下是六个构造字符：&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&gt;begin-array&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ws %x5B ws&amp;nbsp; ; [ 左方括号&lt;/li&gt;&lt;li&gt;begin-object&amp;nbsp;&amp;nbsp;&amp;nbsp; = ws %x7B ws&amp;nbsp; ; { 左大括号&lt;/li&gt;&lt;li&gt;end-array&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ws %x5D ws&amp;nbsp; ; ] 右方括号&lt;/li&gt;&lt;li&gt;end-object&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ws %x7D ws&amp;nbsp; ; } 右大括号&lt;/li&gt;&lt;li&gt;name-separator&amp;nbsp; = ws %x3A ws&amp;nbsp; ; : 冒号&lt;/li&gt;&lt;li&gt;value-separator = ws %x2C ws&amp;nbsp; ; , 逗号 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;在这六个构造字符的前或后允许存在无意义的空白符。&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;ws = *( &lt;pre&gt;%x20 /&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;/pre&gt;&lt;pre&gt;%x09 /&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;/pre&gt;&lt;pre&gt;%x0A /&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;/pre&gt;&lt;pre&gt;%x0D&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;/pre&gt;&lt;pre&gt;)&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;pre&gt;2.1.&amp;nbsp; 值&lt;/pre&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;JSON必须（MUST）是一个对象、数组、数字或字符串，或者是下面三个实字名之一：&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;font face="Courier New"&gt;false null true&lt;/font&gt; &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;font face="Courier New"&gt;实字名必须（MUST）是小写的，且不允许有其它的实字名。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;value = false / null / true / object / array / number / string &lt;pre&gt;false = %x66.61.6c.73.65&amp;nbsp;&amp;nbsp; ; false&lt;/pre&gt;&lt;pre&gt;null&amp;nbsp; = %x6e.75.6c.6c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; null&lt;/pre&gt;&lt;pre&gt;true&amp;nbsp; = %x74.72.75.65&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; true&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;pre&gt;2.2.&amp;nbsp; 对象&lt;/pre&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;对象结构被表示为：一对大括号包围着零个或多个name/value对（或者是成员） 。名是string类型的。每个名后面根一个冒号，把名与值分开。逗号则隔开紧跟在值后的另一个名。对象中的这些名应该（SHOULD）是唯一的。&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;object = begin-object [ member *( value-separator member ) ] end-object&lt;/li&gt;&lt;li&gt;member = string name-separator value &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;pre&gt;2.3.&amp;nbsp; 数组&lt;/pre&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;数组结构表示为：方括号包围着零个或多个值（或是元素）。元素间以逗号相隔。&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&gt;array = begin-array [ value *( value-separator value ) ] end-array &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;pre&gt;2.4.&amp;nbsp; 数字&lt;/pre&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;数字的表示法与其它多数编程语言相似。一个数字包括一个可能带着负号的整数成分，它后面可能跟着一个小数部分或是指数部分。&lt;/pre&gt;&lt;pre&gt;不允许有八进制及十六进制形式。前面带有0也是被禁止的。&lt;/pre&gt;&lt;pre&gt;小数部分是一个小数点后跟着一个或多个阿拉伯数字。&lt;/pre&gt;&lt;pre&gt;指数部分以大写或小写的E开头，E后面可以跟一个正/负号。接着是一个或多个阿拉伯数字。&lt;/pre&gt;&lt;pre&gt;数字值不能表示成阿拉伯数字数字的序列（如Infinity和Nan是不允许的）。&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&gt;number = [ minus ] int [ frac ] [ exp ] &lt;pre&gt;decimal-point = %x2E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; .&lt;/pre&gt;&lt;pre&gt;digit1-9 = %x31-39&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; 1-9&lt;/pre&gt;&lt;pre&gt;e = %x65 / %x45&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; e E&lt;/pre&gt;&lt;pre&gt;exp = e [ minus / plus ] 1*DIGIT&lt;/pre&gt;&lt;pre&gt;frac = decimal-point 1*DIGIT&lt;/pre&gt;&lt;pre&gt;int = zero / ( digit1-9 *DIGIT )&lt;/pre&gt;&lt;pre&gt;minus = %x2D&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;/pre&gt;&lt;pre&gt;plus = %x2B&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;/pre&gt;&lt;pre&gt;zero = %x30&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&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;pre&gt;2.5.&amp;nbsp; 字符串&lt;/pre&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;字符串的表示法与C语言家族的规范类似。string以引号开始与结束。所有的Unicode字符都可以放置在引号中，除了转义字符：引号、反斜杆\、控制符（U+0000 - U+001F）。&lt;/pre&gt;&lt;pre&gt;所有的这些字符都因该避免。如果字符在基本的多语言环境中（U+0000 - U+FFFF），它可以以这样的六字符序列表示：一个反斜杆，后面跟一个字母U，再跟四个字符代号的十六进制编码的阿拉伯数字。A - F这些十六进制字母可以小写。所以像只包含一个反斜杆的字符可以表示成："\u005C"。&lt;/pre&gt;&lt;pre&gt;另一种办法，可以用两个转义字符序列来表示一些常用的字符。所以像只包含一个反斜杆字符的字符串可以更简洁的表示成"\\"。&lt;/pre&gt;&lt;pre&gt;转义一个在多语言环境中不存在的字符，这个字符可以表示成一个12字符的序列，编码为UTF-16的代用对（UTF-16 surrogate pair）。所以像只包含一个G音谱字符的字符串可以表示为"\uD834\uDD1E"。&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string = quotation-mark *char quotation-mark &lt;pre&gt;char = unescaped /&lt;/pre&gt;&lt;pre&gt;escape (&lt;/pre&gt;&lt;pre&gt;%x22 /&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; "&amp;nbsp;&amp;nbsp;&amp;nbsp; quotation mark&amp;nbsp; U+0022&lt;/pre&gt;&lt;pre&gt;%x5C /&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; \&amp;nbsp;&amp;nbsp;&amp;nbsp; reverse solidus U+005C&lt;/pre&gt;&lt;pre&gt;%x2F /&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; /&amp;nbsp;&amp;nbsp;&amp;nbsp; solidus&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; U+002F&lt;/pre&gt;&lt;pre&gt;%x62 /&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; b&amp;nbsp;&amp;nbsp;&amp;nbsp; backspace&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; U+0008&lt;/pre&gt;&lt;pre&gt;%x66 /&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; f&amp;nbsp;&amp;nbsp;&amp;nbsp; form feed&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; U+000C&lt;/pre&gt;&lt;pre&gt;%x6E /&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; n&amp;nbsp;&amp;nbsp;&amp;nbsp; line feed&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; U+000A&lt;/pre&gt;&lt;pre&gt;%x72 /&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; r&amp;nbsp;&amp;nbsp;&amp;nbsp; carriage return U+000D&lt;/pre&gt;&lt;pre&gt;%x74 /&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; t&amp;nbsp;&amp;nbsp;&amp;nbsp; tab&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; U+0009&lt;/pre&gt;&lt;pre&gt;%x75 4HEXDIG )&amp;nbsp; ; uXXXX&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; U+XXXX&lt;/pre&gt;&lt;pre&gt;escape = %x5C&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;/pre&gt;&lt;pre&gt;quotation-mark = %x22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; "&lt;/pre&gt;&lt;pre&gt;unescaped = %x20-21 / %x23-5B / %x5D-10FFFF&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;3.&amp;nbsp;编码&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;JSON文SHALL被编码为Unicode。缺省的编码为UTF-8。&lt;/pre&gt;&lt;pre&gt;因为JSON文本的开头两个字符总是ASCII字符[RFC0020]，我们可以通过查看前面4个字符的0部分，来判断8字节的流是UTF-8还是UTF-16(BE or LE)，或者是UTF-32(BE or LE)。&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&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; 00 00 00 xx&amp;nbsp; UTF-32BE &lt;pre&gt;00 xx 00 xx&amp;nbsp; UTF-16BE&lt;/pre&gt;&lt;pre&gt;xx 00 00 00&amp;nbsp; UTF-32LE&lt;/pre&gt;&lt;pre&gt;xx 00 xx 00&amp;nbsp; UTF-16LE&lt;/pre&gt;&lt;pre&gt;xx xx xx xx&amp;nbsp; UTF-8&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;4.&amp;nbsp;解析器&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;JSON解析器将JSON文本转换成其它的表现形式。它必须（MUST）能够接受符合JSON语法的所有文本。解析器也可以（MAY）接受非JSON的形式或一些扩展。&lt;/pre&gt;&lt;pre&gt;实现中，可以设置限制它所接受的文本大小，可以限制JSON文本的最大深度，可以设置数的范围，也可以限制字符串中的字符长度。&lt;/pre&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;5. 生成器&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;JSON生成器生成JSON文本。目标文本必须（MSUT）严格遵守JSON的语法。&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;6. IANA Considerations&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;JSON文本的MIME类型是application/json。&lt;/pre&gt;&lt;pre&gt;类型名：application&lt;/pre&gt;&lt;pre&gt;图表类型名：JSON&lt;/pre&gt;&lt;pre&gt;必需的参数：n/a&lt;/pre&gt;&lt;pre&gt;可选的参数：n/a&lt;/pre&gt;&lt;pre&gt;编码选择： 8bit if UTF-8; binary if UTF-16 or UTF-32&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;em&gt;JSON may be represented using UTF-8, UTF-16, or UTF-32.&amp;nbsp; When JSON is written in UTF-8, JSON is 8bit compatible.&amp;nbsp; When JSON is written in UTF-16 or UTF-32, the binary content-transfer-encoding must be used.&amp;nbsp;&lt;/em&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;安全考虑：&lt;/pre&gt;&#xD;
&lt;ol&gt;&lt;li&gt;脚本语言通常都有安全问题。JSON是JavaScript的子集，但是它是一个撤消了附值与调用的安全子集。&lt;/li&gt;&lt;li&gt;JSON文本可以安全的传递个JavaScript的eval()函数。如果字符没有被装入JSON标记符中的标记中，这可以通过JavaScript的两个正则表达式，使用test和replace方法，来快速的判定。&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(&lt;/p&gt;&#xD;
&lt;p&gt;text.replace(/"(\\.|[^"\\])*"/g, ''))) &amp;amp;&amp;amp;&lt;/p&gt;&#xD;
&lt;p&gt;eval('(' + text + ')');&lt;/p&gt;&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;互用性考虑： n/a&lt;/p&gt;&#xD;
&lt;p&gt;发布的规范： RFC 4627&lt;/p&gt;&#xD;
&lt;p&gt;使用该媒体类型的应用程序：&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;em&gt;JSON has been used to exchange data between applications written in all of these programming languages: ActionScript, C, C#, ColdFusion, Common Lisp, E, Erlang, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Scheme.&lt;/em&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;其它额外信息（略）&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;7. Security Considerations&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;参考第六节中的Security Considerations。&lt;/p&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;8. 例子&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;pre&gt;一个JSON对象：&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; { &lt;pre&gt;"Image": {&lt;/pre&gt;&lt;pre&gt;"Width":&amp;nbsp; 800,&lt;/pre&gt;&lt;pre&gt;"Height": 600,&lt;/pre&gt;&lt;pre&gt;"Title":&amp;nbsp; "View from 15th Floor",&lt;/pre&gt;&lt;pre&gt;"Thumbnail": {&lt;/pre&gt;&lt;pre&gt;"Url":&amp;nbsp;&amp;nbsp;&amp;nbsp; "http://www.example.com/image/481989943",&lt;/pre&gt;&lt;pre&gt;"Height": 125,&lt;/pre&gt;&lt;pre&gt;"Width":&amp;nbsp; "100"&lt;/pre&gt;&lt;pre&gt;},&lt;/pre&gt;&lt;pre&gt;"IDs": [116, 943, 234, 38793]&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;该对象的Image成员是一个对象，而Image的Thumbnail成员也是一个对象，且Image的IDs成员是一个数组。&lt;/pre&gt;&lt;pre&gt;下面是一个包含两个对象JSON数组：&lt;/pre&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; [ &lt;pre&gt;{&lt;/pre&gt;&lt;pre&gt;"precision": "zip",&lt;/pre&gt;&lt;pre&gt;"Latitude":&amp;nbsp; 37.7668,&lt;/pre&gt;&lt;pre&gt;"Longitude": -122.3959,&lt;/pre&gt;&lt;pre&gt;"Address":&amp;nbsp;&amp;nbsp; "",&lt;/pre&gt;&lt;pre&gt;"City":&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "SAN FRANCISCO",&lt;/pre&gt;&lt;pre&gt;"State":&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "CA",&lt;/pre&gt;&lt;pre&gt;"Zip":&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "94107",&lt;/pre&gt;&lt;pre&gt;"Country":&amp;nbsp;&amp;nbsp; "US"&lt;/pre&gt;&lt;pre&gt;},&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre&gt;"precision": "zip",&lt;/pre&gt;&lt;pre&gt;"Latitude":&amp;nbsp; 37.371991,&lt;/pre&gt;&lt;pre&gt;"Longitude": -122.026020,&lt;/pre&gt;&lt;pre&gt;"Address":&amp;nbsp;&amp;nbsp; "",&lt;/pre&gt;&lt;pre&gt;"City":&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "SUNNYVALE",&lt;/pre&gt;&lt;pre&gt;"State":&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "CA",&lt;/pre&gt;&lt;pre&gt;"Zip":&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "94085",&lt;/pre&gt;&lt;pre&gt;"Country":&amp;nbsp;&amp;nbsp; "US"&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre&gt;]&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;9. 参考文献&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;9.1.&amp;nbsp; 标准化参考&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; [ECMA]&amp;nbsp;&amp;nbsp;&amp;nbsp; European Computer Manufacturers Association, "ECMAScript&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&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; Language Specification 3rd Edition", December 1999,&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&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;lt;http://www.ecma-international.org/publications/files/&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&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; ecma-st/ECMA-262.pdf&amp;gt;.&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; [RFC0020] Cerf, V., "ASCII format for network interchange", RFC 20,&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&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; October 1969.&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&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; Requirement Levels", BCP 14, RFC 2119, March 1997.&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; [RFC4234] Crocker, D. and P.&amp;nbsp; Overell, "Augmented BNF for Syntax&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&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; Specifications: ABNF", RFC 4234, October 2005.&amp;nbsp;&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; [UNICODE] The Unicode Consortium, "The Unicode Standard Version 4.0",&lt;/em&gt;&lt;/pre&gt;&lt;pre&gt;&lt;em&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; 2003, http://www.unicode.org/versions/Unicode4.1.0/.&lt;/em&gt;&lt;/pre&gt;&#xD;
&lt;p align="justify"&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/herony420/aggbug/1739869.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/herony420/archive/2010/05/20/1739869.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/herony420/archive/2006/08/13/475630.html</id><title type="text">2003下一个异常service unvilable的问题</title><summary type="text">我的web应用程序是在win2003下，使用vs2003开发的asp.net程序，在部署测试时，经常出现错误：service unvilable，查看系统日志，有下面的错误，不知道是怎么造成的，非常郁闷，迟迟不能解决：事件 ID ( 0 )的描述(在资源( .NET Runtime )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。您可能可以使用 /AUX...</summary><published>2006-08-13T07:29:00Z</published><updated>2006-08-13T07:29:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2006/08/13/475630.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2006/08/13/475630.html"/></entry><entry><id>http://www.cnblogs.com/herony420/archive/2006/06/28/438164.html</id><title type="text">观雨</title><summary type="text">济南的今天晚上，下了好大的一场雨，我一直在窗外，看雨，看被雨淋到的人急匆匆的样子，突然有一种很微妙的感觉，你说在雨中行路的人是不是很像我现在的样子呢？被外界的压力赶着跑，稍有拖延就会是一个狼狈的结局，甚至自己努力的去跑了，最后还是会淋的满身皆湿。如果真的是自己，这是一个多么可怕的结果呀。。。  可能就是这样的压力吧，你根本没有办法躲避的压力，那是在大雨中胜似闲庭信步的人，应该就是看得开这个压力社会...</summary><published>2006-06-28T14:38:00Z</published><updated>2006-06-28T14:38:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2006/06/28/438164.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2006/06/28/438164.html"/></entry><entry><id>http://www.cnblogs.com/herony420/archive/2006/04/10/371348.html</id><title type="text">六十六条经典禅语 </title><summary type="text">六十六条经典禅语 1. 人之所以痛苦，在于追求错误的东西。2. 如果你不给自己烦恼，别人也永远不可能给你烦恼。因为你自己的内心，你放不下。 3. 你永远要感谢给你逆境的众生。4. 你永远要宽恕众生，不论他有多坏，甚至他伤害过你，你一定要放下，才能得到真正的快乐。 5. 当你快乐时，你要想这快乐不是永恒的。当你痛苦时，你要想这痛苦也不是永恒的。 6. 今日的执著，会造成明日的后悔。 7. 你可以拥有...</summary><published>2006-04-10T07:23:00Z</published><updated>2006-04-10T07:23:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2006/04/10/371348.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2006/04/10/371348.html"/></entry><entry><id>http://www.cnblogs.com/herony420/archive/2006/03/21/355017.html</id><title type="text">读写xml所有节点个人小结 和 读取xml节点的数据总结</title><summary type="text">读： //打开某文件(假设web.config在根目录中)string filename=Server.MapPath("/") + @"WebApplication1\web.config";XmlDocument xmldoc= new XmlDocument();xmldoc.Load(filename);//得到顶层节点列表XmlNodeList topM=xmldoc.DocumentE...</summary><published>2006-03-21T08:01:00Z</published><updated>2006-03-21T08:01:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2006/03/21/355017.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2006/03/21/355017.html"/></entry><entry><id>http://www.cnblogs.com/herony420/archive/2006/03/21/354650.html</id><title type="text">使用XPath查询获取节点后更改节点的值</title><summary type="text">public int SetEclipse(){int ret = 0;XmlDocument doc = new XmlDocument();doc.Load("SystemSet.xml");XmlElement root = doc.DocumentElement ;XmlNode eclipse = root.SelectSingleNode("descendant::HaveEclips...</summary><published>2006-03-21T02:49:00Z</published><updated>2006-03-21T02:49:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2006/03/21/354650.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2006/03/21/354650.html"/></entry><entry><id>http://www.cnblogs.com/herony420/archive/2006/02/17/332301.html</id><title type="text">使用ajax.net实现datagrid的客户端分页</title><summary type="text">其实就是使用RenderControl 方法，摘自一个老外的blogGenericAjaxWS.asmx.csusingSystem;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Diagnostics;usingSystem.We...</summary><published>2006-02-17T01:59:00Z</published><updated>2006-02-17T01:59:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2006/02/17/332301.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2006/02/17/332301.html"/></entry><entry><id>http://www.cnblogs.com/herony420/archive/2006/02/16/331949.html</id><title type="text">本人刚翻译完的ajax.net用户指南</title><summary type="text">Ajax.net用户指南程守华 译概述AJAX依靠服务器作为中介来分发和处理请求。为了完成这项工作，.net封装类依赖于客户端的请求对象，而xmlHttpRequest对象被大部分的浏览器支持，因此使用这个对象是一个不错的解决方案。因为封装的目的是隐藏xmlHttpRequest的实现，故我们不讨论他的实现细节。封装类是通过在.net的方法上增加AJAX属性标记来实现的，一旦被标记，AJAX创建客...</summary><published>2006-02-16T08:53:00Z</published><updated>2006-02-16T08:53:00Z</updated><author><name>橙子</name><uri>http://www.cnblogs.com/herony420/</uri></author><link rel="alternate" href="http://www.cnblogs.com/herony420/archive/2006/02/16/331949.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/herony420/archive/2006/02/16/331949.html"/></entry></feed>
