<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_善良，踏实，实现，坚持，厚积薄发</title><subtitle type="text">内心要善良，做人要踏实，梦想要实现，目标要坚持。</subtitle><id>http://feed.cnblogs.com/blog/u/20814/rss</id><updated>2012-01-05T14:00:35Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/20814/rss"/><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/12/24/2300751.html</id><title type="text">创业了，发一则招聘信息</title><summary type="text">黑龙江省智途科技开发有限公司 招聘(面向哈尔滨)智途科技由几位怀揣梦想的80后伙伴于2012年1月创建，主要致力于saas类产品研发，力图通过智途团队的不断进取和努力，为人们日常生活增添更多实用的科技化产品，增强人们科技生活的新体验。我们将为你提供：绝佳的共同创业的机会，具备竞争力的薪酬，以及一个“非臃肿复杂的”的团结温馨的工作团队！如果你和我们一样——怀揣创业的激情与梦想， 享受公司从小到大的成长过程迷恋并且笃信科技改变未来信任团队的力量，深深厌恶职场人事斗争，崇尚个性更懂得通力合作并以创造力为骄傲关注用户，以提供最棒的产品和服务为己任那么你可能就是我们一直要找的人我们看重的是:1) 是否品</summary><published>2011-12-24T15:30:00Z</published><updated>2011-12-24T15:30:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/12/24/2300751.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/12/24/2300751.html"/><content type="html">&lt;p&gt;黑龙江省智途科技开发有限公司 招聘(面向哈尔滨)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;智途科技由几位怀揣梦想的80后伙伴于2012年1月创建，主要致力于saas类产品研发，力图通过智途团队的不断进取和努力，为人们日常生活增添更多实用的科技化产品，增强人们科技生活的新体验。&lt;/p&gt;&#xD;
&lt;p&gt;&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;如果你和我们一样&amp;mdash;&amp;mdash;&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;/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;/p&gt;&#xD;
&lt;p align="left"&gt;1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 是否&lt;span style="background-color: #ffffff;"&gt;品德端正&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;2)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 是否有共同的理念&lt;/p&gt;&#xD;
&lt;p align="left"&gt;3)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 是否能融入我们的团队&lt;/p&gt;&#xD;
&lt;p align="left"&gt;4)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 是否有潜力&lt;/p&gt;&#xD;
&lt;p align="left"&gt;5)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 接下来才是你现在的能力&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;span style="font-size: 16px;"&gt;界面视觉设计 (1人)&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;职责：&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp; 参与产品前期界面视觉用户研究、设计流行趋势分析&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp; 设定软件产品的整体视觉风格和VI设计&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp; 参与设计体验、流程的制定和规范&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp; 分享设计经验、推动提高团队的设计能力 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;职位要求：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1) 具备敏锐的观察力，独特的视觉感受能力，扎实的美术功底及艺术修养，对GUI设计趋势有灵敏触觉和领悟能力，推动团队的设计能力&lt;/p&gt;&#xD;
&lt;p&gt;2) 从事设计行业工作3年以上，具有大型软件产品界面风格设定以及VI设定（包括界面、图标风格与统一规范等）经验&lt;/p&gt;&#xD;
&lt;p&gt;3) 对视觉用户研究有一定经验和见解，对软件可用性有一定的认识&lt;/p&gt;&#xD;
&lt;p&gt;4) 精通Photoshop、Illustartor、Flash等设计工具，了解flash（Actionscript）动画设计的优先&lt;/p&gt;&#xD;
&lt;p&gt;5) 掌握Microsoft Expression Web，Dreamweaver等制作工具&lt;/p&gt;&#xD;
&lt;p&gt;6) 美术、设计或相关专业优先&lt;/p&gt;&#xD;
&lt;p&gt;7) div + css布局，能够使用javascript/jQuery&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;待遇：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1) 我们为您提供4--6K &amp;amp; 五险的薪资待遇。&lt;/p&gt;&#xD;
&lt;p&gt;2) 除法定假日，地方节日外，如果您是少数民族，将会享有民族节日休假的待遇。如果您是已婚人士，那么您可以享受一个温馨的结婚纪念日，如果您是一位父亲或母亲，那么六月一号您可以和您的孩子一起享受美好的家庭时光。如果很不幸，您还未婚，那么每年的2月14号以及七夕情人节，我们鼓励您，和喜欢的人约会吧。&lt;/p&gt;&#xD;
&lt;p&gt;3) 您在智途的每365天里，将享有7天的带薪年假。&lt;/p&gt;&#xD;
&lt;p&gt;4) 免费的早餐饼干及饮料、水果。 免费的专业书籍。&lt;/p&gt;&#xD;
&lt;p&gt;5) 每月60元为您免费充值的公交卡。&lt;/p&gt;&#xD;
&lt;p&gt;6) 每月至少一张华辰影院的电影票。&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;应聘职位、想加入的理由&lt;/strong&gt;、&lt;strong&gt;博客地址&lt;/strong&gt;、MSN/QQ、&lt;strong&gt;简历、待遇要求&lt;/strong&gt;发至 53967699@qq.com (界面视觉设计职位请发作品url或附件，收到后我们会回复确认，如果您一天内没收到我们的回复，麻烦您再发一次)。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2300751.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/12/24/2300751.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/12/13/2285943.html</id><title type="text">使用sql server management studio 2008 连接数据库,无法查看数据库,提示 无法为该请求检索数据 错误916 - z</title><summary type="text">今日使用时代互联的海外空间,sql 2008 无限空间大小,开通账户后,使用sql server management studio 2008 连接数据库,可以链接上,但是无法查看自己的数据库,点击数据库后,提示 无法为该请求检索数据 错误916解决方法如下1：点击左侧的数据库,然后到右侧的 “名称” 上面点击右键 出来如图所示的菜单,取消掉策略运行状态和排序规则,再次点击数据库的时候,就能显示所有的数据库以及你自己的数据库了。</summary><published>2011-12-13T05:13:00Z</published><updated>2011-12-13T05:13:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/12/13/2285943.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/12/13/2285943.html"/><content type="html">&lt;p&gt;今日使用时代互联的海外空间,sql 2008 无限空间大小,开通账户后,使用sql server management studio 2008 连接数据库,可以链接上,但是无法查看自己的数据库,点击数据库后,提示 无法为该请求检索数据 错误916&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/1727050508/201103/201103241438118226.png"&gt;&lt;img style="border: 0px currentColor; margin-right: 0px; margin-left: 0px; display: inline;" title="image" src="http://images.cnblogs.com/cnblogs_com/1727050508/201103/201103241438261102.png" alt="image" width="674" height="357" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;解决方法如下&lt;/p&gt;&#xD;
&lt;p&gt;1：点击左侧的数据库,然后到右侧的 &amp;ldquo;名称&amp;rdquo;&amp;nbsp; 上面点击右键&amp;nbsp;&amp;nbsp; 出来如图所示的菜单,取消掉策略运行状态和排序规则,再次点击数据库的时候,就能显示所有的数据库以及你自己的数据库了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/1727050508/201103/201103241438351780.jpg"&gt;&lt;img style="border: 0px currentColor; display: inline;" title="0WE{Q~T3N[G80GS3{GR~MVX" src="http://images.cnblogs.com/cnblogs_com/1727050508/201103/201103241438406485.jpg" alt="0WE{Q~T3N[G80GS3{GR~MVX" width="585" height="593" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2285943.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/12/13/2285943.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/11/13/2247247.html</id><title type="text">微软SCRUM 1.0流程模板在中文版TFS2010上无法创建项目的彻底解决办法 - 转</title><summary type="text">由于 微软 SCRUM V1.0 为英文版，在国内一般的 SharePoint 为中文版，因此创建团队项目门户时由于找不到 1033 的 区域设置标识符(LCID)而创建失败。如下图：查看项目创建日志，其中有如下错误:模块: WSS异常消息: TF249033: 该站点模板不可用于区域设置标识符(LCID)。站点模板名称为: TFS2010 Agile Dashboard。LCID 为: 1033。 (类型 TeamFoundationServerException)原“http://www.almnetworks.net/zh-CN/post/2010/08/04/Microsoft-Vis</summary><published>2011-11-13T06:28:00Z</published><updated>2011-11-13T06:28:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/11/13/2247247.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/11/13/2247247.html"/><content type="html">&lt;p&gt;由于 微软 SCRUM V1.0 为英文版，在国内一般的 SharePoint 为中文版，因此创建团队项目门户时由于找不到 1033 的 区域设置标识符(LCID)而创建失败。如下图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/17255/2011111411082740.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;查看项目创建日志，其中有如下错误:&lt;/p&gt;&#xD;
&lt;p&gt;模块: WSS&lt;/p&gt;&#xD;
&lt;p&gt;异常消息: TF249033: 该站点模板不可用于区域设置标识符(LCID)。站点模板名称为: TFS2010 Agile Dashboard。LCID 为: 1033。 (类型 TeamFoundationServerException)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;原&amp;ldquo;http://www.almnetworks.net/zh-CN/post/2010/08/04/Microsoft-Visual-Studio-Scrum-10-Template-on-Chinese-Version-of-TFS.aspx&amp;rdquo; 解决办法过于麻烦。经过分析，仅需手动修改过程模板文件即可让&amp;ldquo;scrum V1.0&amp;rdquo;支持中文版的 sharepoint。过程如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、打开&amp;ldquo;scrum V1.0&amp;rdquo;的安装目录：%ProgramFiles%/Microsoft/Microsoft Visual Studio Scrum 1.0&lt;/p&gt;&#xD;
&lt;p&gt;2、使用记事本打开&amp;ldquo;Process Template/Windows SharePoint Services/WssTasks.XML&lt;/p&gt;&#xD;
&lt;p&gt;3、修改 &lt;span style="color: #990000;"&gt;language&lt;/span&gt;&lt;span &gt;&lt;span style="color: #0000ff;"&gt;="&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;1033&lt;/strong&gt;&lt;span style="color: #0000ff;"&gt;&lt;span &gt;"&lt;/span&gt;&lt;span &gt; 为 &lt;span style="color: #990000;"&gt;language&lt;/span&gt;&lt;span &gt;="&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #000000;"&gt;2052&lt;/span&gt;&lt;/strong&gt;&lt;span &gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/17255/2011111411085736.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;保存文件并关闭记事本。&lt;/p&gt;&#xD;
&lt;p&gt;4、重新上传 过程模板 到 TFS 上。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2247247.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/11/13/2247247.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/11/05/2237320.html</id><title type="text">LINQ to Entities 不识别方法&amp;quot;System.String ToString()&amp;quot;，因此该方法无法转换为存储表达式 的解决方法</title><summary type="text">一、案例1，及解决方案：“LINQ to Entities 不识别方法&amp;quot;System.String ToString()&amp;quot;，因此该方法无法转换为存储表达式。”原因是LINQ to Entities 不支持ToString()函数。可用下述方法进行转换解决：DIRequest reqeust = new DIRequest(); reqeust.FilterMode = &amp;quot;1,2,3,4,5,6,7,8,9,0&amp;quot;;List&amp;lt;int&amp;gt; result = new List&amp;lt;string&amp;gt;(reqeust.FilterMode.Split</summary><published>2011-11-05T14:08:00Z</published><updated>2011-11-05T14:08:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/11/05/2237320.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/11/05/2237320.html"/><content type="html">&lt;p&gt;&lt;strong&gt;一、案例1，及解决方案：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;&amp;ldquo;&lt;em&gt;LINQ to Entities 不识别方法"System.String ToString()"，因此该方法无法转换为存储表达式。&amp;rdquo;&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;原因是&lt;em&gt;LINQ to Entities &lt;/em&gt;不支持ToString()函数。&lt;/p&gt;&#xD;
&lt;p&gt;可用下述方法进行转换解决：&lt;/p&gt;&#xD;
&lt;p&gt;DIRequest reqeust = new DIRequest(); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;reqeust.FilterMode = "1,2,3,4,5,6,7,8,9,0";&lt;/p&gt;&#xD;
&lt;p&gt;List&amp;lt;int&amp;gt; result = new List&amp;lt;string&amp;gt;(reqeust.FilterMode.Split(',')).ConvertAll(i =&amp;gt; int.Parse(i));&lt;/p&gt;&#xD;
&lt;p&gt;return dal.T_Common_Dy.Where(m =&amp;gt; result.Any(a =&amp;gt; a == m.ParentItemID.Value)).ToList();&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;二、案例2，及解决方案：&lt;/strong&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&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取市级地区&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; JsonResult GetCity(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; id) { &amp;nbsp;&amp;nbsp;&amp;nbsp; var city &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; from c &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; db.AreaDivide &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt;c.ParentID &lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt;==&lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow;"&gt;int&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt;.Parse(id)&lt;/span&gt;&lt;span style="color: #000000;"&gt; select &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; { text &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; c.AreaName, value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; c.ID }; &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; Json(city.ToList(), JsonRequestBehavior.AllowGet); }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;以上代码也会出现如下错误：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;&amp;ldquo;&lt;em&gt;LINQ to Entities 不识别方法"System.String ToString()"，因此该方法无法转换为存储表达式。&amp;rdquo;&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&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&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取市级地区&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; JsonResult GetCity(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; id) { &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow;"&gt;int&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt; a; &lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow;"&gt;int&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt;.TryParse(id, &lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow;"&gt;out&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt; a);&lt;/span&gt;&lt;span style="color: #000000;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; var city &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; from c &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; db.AreaDivide &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt;c.ParentID &lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt;==&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt; a&lt;/span&gt;&lt;span style="color: #000000;"&gt; select &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; { text &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; c.AreaName, value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; c.ID }; &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; Json(city.ToList(), JsonRequestBehavior.AllowGet); }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&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&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Data.Objects.SqlClient;&amp;nbsp; &lt;span style="color: #008000;"&gt;//在 System.Data.Entity.dll 中&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取市级地区&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; JsonResult GetCity(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; id) { &amp;nbsp;&amp;nbsp;&amp;nbsp; var city &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; from c &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; db.AreaDivide &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt;SqlFunctions.StringConvert((&lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow;"&gt;double&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt;)c.ParentID) &lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt;==&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow;"&gt; id&lt;/span&gt;&lt;span style="color: #000000;"&gt; select &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; { text &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; c.AreaName, value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; c.ID }; &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; Json(city.ToList(), JsonRequestBehavior.AllowGet); }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2237320.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/11/05/2237320.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/10/05/2199270.html</id><title type="text">使用消息约定-MessageContract -z</title><summary type="text">使用消息约定.NET Framework 4在生成 Windows Communication Foundation (WCF) 应用程序时，开发人员通常会密切关注数据结构和序列化问题，而不必关心携带数据的消息。对于这些应用程序，为参数或返回值创建数据协定的过程很简单。(有关更多信息，请参见 在服务协定中指定数据传输.)但是，有时完全控制 SOAP 消息的结构与控制其内容一样重要。当必须提供互操作性或需要在消息或消息部分级别特别控制安全问题时，更是如此。在这些情况下，可以创建一个消息协定，以便对参数或返回值使用一种可直接序列化为所需精确 SOAP 消息的类型。本主题讨论如何使用各种消息协定属性</summary><published>2011-10-05T02:29:00Z</published><updated>2011-10-05T02:29:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/10/05/2199270.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/10/05/2199270.html"/><content type="html">&lt;h1 &gt;使用消息约定&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div id="curversion"&gt;&lt;strong&gt;.NET Framework 4&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div style="clear: both;"&gt;&lt;/div&gt;&#xD;
&lt;div id="mainSection"&gt;&#xD;
&lt;div id="mainBody"&gt;&#xD;
&lt;p&gt;在生成 Windows Communication Foundation (WCF) 应用程序时，开发人员通常会密切关注数据结构和序列化问题，而不必关心携带数据的消息。对于这些应用程序，为参数或返回值创建数据协定的过程很简单。(有关更多信息，请参见 &lt;a href="http://msdn.microsoft.com/zh-cn/library/ms732038.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;在服务协定中指定数据传输&lt;/span&gt;&lt;/a&gt;.)&lt;/p&gt;&#xD;
&lt;p&gt;但是，有时完全控制 SOAP 消息的结构与控制其内容一样重要。当必须提供互操作性或需要在消息或消息部分级别特别控制安全问题时，更是如此。在这些情况下，可以创建一个消息协定&lt;em&gt;&lt;/em&gt;，以便对参数或返回值使用一种可直接序列化为所需精确 SOAP 消息的类型。&lt;/p&gt;&#xD;
&lt;p&gt;本主题讨论如何使用各种消息协定属性为操作创建特定消息协定。&lt;/p&gt;&#xD;
&lt;h2 &gt;在操作中使用消息协定&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection0" &gt;&#xD;
&lt;p&gt;WCF 支持在远程过程调用 (RPC) 样式&lt;em&gt;&lt;/em&gt;或消息样式&lt;em&gt;&lt;/em&gt;上建模的操作。在 RPC 样式的操作中，可以使用任何可序列化的类型并可以使用本地调用可用的功能，如多个参数以及 &lt;em&gt;ref&lt;/em&gt; 和 &lt;em&gt;out&lt;/em&gt; 参数。在此样式中，所选的序列化形式控制基础消息中数据的结构，但 WCF 运行时本身会创建这些消息以支持操作。这使对 SOAP 和 SOAP 消息不熟悉的开发人员能够快速容易地创建和使用服务应用程序。&lt;/p&gt;&#xD;
&lt;p&gt;下面的代码示例演示在 RPC 样式上建模的服务操作。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_532a3a31-30b8-4e19-96a8-3f7c55baaf60');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_532a3a31-30b8-4e19-96a8-3f7c55baaf60" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[OperationContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; BankingTransactionResponse PostBankingTransaction(BankingTransaction bt);&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;通常，定义消息的架构时使用数据协定就足够了。例如在前面的示例中，如果 &lt;code&gt;BankingTransaction&lt;/code&gt; 和 &lt;code&gt;BankingTransactionResponse&lt;/code&gt; 具有定义基础 SOAP 消息内容的数据协定，则对于大多数应用程序就足够了。有关数据协定的更多信息，请参见&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms733127.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;使用数据协定&lt;/span&gt;&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;但是，有时必须精确控制如何将类型映射到通过网络传输的 SOAP 消息。对于这种情况，最常见的方案是插入自定义 SOAP 标头。另一种常见方案是定义消息头和正文的安全属性，也就是说，确定是否对这些元素进行数字签名和加密。消息样式的操作可提供这种控制。&lt;/p&gt;&#xD;
&lt;p&gt;消息样式的操作最多具有一个参数和一个返回值，其中参数和返回值的类型都是消息类型；也就是说，这两种类型可直接序列化为指定的 SOAP 消息结构。这可以是用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messagecontractattribute.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;MessageContractAttribute&lt;/span&gt;&lt;/a&gt; 标记的任何类型或 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.channels.message.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;Message&lt;/span&gt;&lt;/a&gt; 类型。下面的代码示例演示类似于前面 RPC 样式的操作，但此操作使用消息样式。&lt;/p&gt;&#xD;
&lt;p&gt;例如，如果 &lt;code&gt;BankingTransaction&lt;/code&gt; 和 &lt;code&gt;BankingTransactionResponse&lt;/code&gt; 都是具有消息协定的类型，则以下操作中的代码有效。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_b9f70c90-e613-466d-ad75-533c2ae466e0');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_b9f70c90-e613-466d-ad75-533c2ae466e0" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[OperationContract]&#xD;
BankingTransactionResponse Process(BankingTransaction bt);&#xD;
[OperationContract]&#xD;
&lt;span style="color: blue;"&gt;void&lt;/span&gt; Store(BankingTransaction bt);&#xD;
[OperationContract]&#xD;
BankingTransactionResponse GetResponse();&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;但下面的代码无效。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_4e1f2fe1-8738-4b86-a91f-3b0bfd93c172');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_4e1f2fe1-8738-4b86-a91f-3b0bfd93c172" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[OperationContract]&#xD;
&lt;span style="color: blue;"&gt;bool&lt;/span&gt; Validate(BankingTransaction bt);&#xD;
&lt;span style="color: green;"&gt;// Invalid, the return type is not a message contract.&lt;/span&gt;&#xD;
[OperationContract]&#xD;
&lt;span style="color: blue;"&gt;void&lt;/span&gt; Reconcile(BankingTransaction bt1, BankingTransaction bt2);&#xD;
&lt;span style="color: green;"&gt;// Invalid, there is more than one parameter.&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;对于涉及消息协定类型且不符合有效模式之一的任何操作会引发异常。当然，不涉及消息协定类型的操作不受这些限制的约束。&lt;/p&gt;&#xD;
&lt;p&gt;如果一个类型既有消息协定又有数据协定，则在操作中使用此类型时只考虑其消息协定。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;定义消息协定&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection1" &gt;&#xD;
&lt;p&gt;若要为某一类型定义消息协定（即定义该类型和 SOAP 信封之间的映射），请对该类型应用 &lt;strong&gt;MessageContractAttribute&lt;/strong&gt;。然后对该类型中要成为 SOAP 标头的成员应用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messageheaderattribute.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;MessageHeaderAttribute&lt;/span&gt;&lt;/a&gt;，并对要成为消息的 SOAP 正文部分的成员应用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messagebodymemberattribute.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;MessageBodyMemberAttribute&lt;/span&gt;&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;下面的代码提供了一个使用消息协定的示例。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_9dde895f-9c0f-4b81-8e14-c34facfa17b6');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_9dde895f-9c0f-4b81-8e14-c34facfa17b6" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; BankingTransaction&#xD;
{&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Operation operation;&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; DateTime transactionDate;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;private&lt;/span&gt; Account sourceAccount;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;private&lt;/span&gt; Account targetAccount;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; amount;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;当使用此类型作为操作参数时，会生成一个具有额外标头（名为 &lt;code&gt;operation&lt;/code&gt; 和 &lt;code&gt;transactionDate&lt;/code&gt;）的 SOAP 信封，这些标头中包含 &lt;code&gt;operation&lt;/code&gt; 和 &lt;code&gt;transactionDate&lt;/code&gt; 字段的内容。SOAP 正文由一个包装元素构成，该包装元素包含类型为 &lt;code&gt;Account&lt;/code&gt; 数据协定类型的 &lt;code&gt;sourceAccount and targetAccount&lt;/code&gt; 元素和类型为整数类型的 &lt;code&gt;amount&lt;/code&gt; 元素。&lt;/p&gt;&#xD;
&lt;p&gt;可以对所有字段、属性和事件应用 &lt;strong&gt;MessageHeaderAttribute&lt;/strong&gt; 和 &lt;strong&gt;MessageBodyMemberAttribute&lt;/strong&gt;，而不管这些字段、属性和事件是公用的、私有的、受保护的还是内部的。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;th&gt;&lt;img id="note"  title="ms730255.note(zh-cn,VS.100).gif" alt="ms730255.note(zh-cn,VS.100).gif" src="http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif" xmlns="" /&gt;注意：&lt;/th&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;消息协定中会忽略 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.knowntypeattribute.aspx"&gt;KnownTypeAttribute&lt;/a&gt; 属性。如果需要 &lt;strong&gt;KnownTypeAttribute&lt;/strong&gt;，可以将其放在使用所述消息协定的操作上。&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;在消息协定内部使用自定义类型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection2" &gt;&#xD;
&lt;p&gt;每个单独的消息头和消息正文部分均使用为消息所使用的服务协定选择的序列化引擎进行序列化（转换为 XML）。默认序列化引擎 &lt;strong&gt;XmlFormatter&lt;/strong&gt; 可以显式处理（通过具有 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datacontractattribute.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.Runtime.Serialization.DataContractAttribute&lt;/span&gt;&lt;/a&gt;）或隐式处理（通过作为基元类型而具有 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.serializableattribute.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.SerializableAttribute&lt;/span&gt;&lt;/a&gt; 等）具有数据协定的任何类型。有关更多信息，请参见 &lt;a href="http://msdn.microsoft.com/zh-cn/library/ms733127.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;使用数据协定&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;在前面的示例中，&lt;code&gt;Operation&lt;/code&gt; 和 &lt;code&gt;BankingTransactionData&lt;/code&gt; 类型必须具有数据约，定且 &lt;code&gt;transactionDate&lt;/code&gt; 可序列化，因为 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.datetime.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;DateTime&lt;/span&gt;&lt;/a&gt; 是基元类型（因此具有隐式数据协定）。&lt;/p&gt;&#xD;
&lt;p&gt;不过，也可以切换到另一个序列化引擎 &lt;strong&gt;XmlSerializer&lt;/strong&gt;。如果进行切换，应确保用于消息头和正文部分的所有类型都可以使用 &lt;strong&gt;XmlSerializer&lt;/strong&gt; 进行序列化。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;在消息协定内部使用数组&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection3" &gt;&#xD;
&lt;p&gt;可以采用两种方式在消息协定中使用重复元素的数组。&lt;/p&gt;&#xD;
&lt;p&gt;第一种方式是直接在数组上使用 &lt;strong&gt;MessageHeaderAttribute&lt;/strong&gt; 或 &lt;strong&gt;MessageBodyMemberAttribute&lt;/strong&gt;。在这种情况下，整个数组序列化为一个具有多个子元素的元素（即一个标头或一个正文部分）。考虑下面示例中的类。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_b1b9dedc-2193-40e9-8ac3-7d5287f86fc2');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_b1b9dedc-2193-40e9-8ac3-7d5287f86fc2" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; BankingDepositLog&#xD;
{&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; numRecords&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; DepositRecord records[];&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; branchID;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这会使 SOAP 标头类似于下面所示。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;other&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_4f33b8f1-b56f-4fc7-8b92-777f8c810cd2');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_4f33b8f1-b56f-4fc7-8b92-777f8c810cd2" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;&amp;lt;BankingDepositLog&amp;gt;&#xD;
&amp;lt;numRecords&amp;gt;3&amp;lt;/numRecords&amp;gt;&#xD;
&amp;lt;records&amp;gt;&#xD;
  &amp;lt;DepositRecord&amp;gt;Record1&amp;lt;/DepositRecord&amp;gt;&#xD;
  &amp;lt;DepositRecord&amp;gt;Record2&amp;lt;/DepositRecord&amp;gt;&#xD;
  &amp;lt;DepositRecord&amp;gt;Record3&amp;lt;/DepositRecord&amp;gt;&#xD;
&amp;lt;/records&amp;gt;&#xD;
&amp;lt;branchID&amp;gt;20643&amp;lt;/branchID&amp;gt;&#xD;
&amp;lt;/BankingDepositLog&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;另一种方式是使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messageheaderarrayattribute.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;MessageHeaderArrayAttribute&lt;/span&gt;&lt;/a&gt;。在这种情况下，每个数组元素都单独序列化，从而使每个数组元素都具有一个标头，类似于下面所示。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;other&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_f0f833cb-bf69-431e-9854-a36debc8cff2');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_f0f833cb-bf69-431e-9854-a36debc8cff2" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;&amp;lt;numRecords&amp;gt;3&amp;lt;/numRecords&amp;gt;&#xD;
&amp;lt;records&amp;gt;Record1&amp;lt;/records&amp;gt;&#xD;
&amp;lt;records&amp;gt;Record2&amp;lt;/records&amp;gt;&#xD;
&amp;lt;records&amp;gt;Record3&amp;lt;/records&amp;gt;&#xD;
&amp;lt;branchID&amp;gt;20643&amp;lt;/branchID&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;数组项的默认名称是对其应用 &lt;strong&gt;MessageHeaderArrayAttribute&lt;/strong&gt; 属性的成员的名称。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;MessageHeaderArrayAttribute&lt;/strong&gt; 属性继承自 &lt;strong&gt;MessageHeaderAttribute&lt;/strong&gt;。它具有与非数组属性相同的一组功能，例如，可以像设置单一标头的顺序、名称和命名空间那样设置标头数组的顺序、名称和命名空间。在对数组使用 &lt;strong&gt;Order&lt;/strong&gt; 属性时，该属性将应用于整个数组。&lt;/p&gt;&#xD;
&lt;p&gt;可以将 &lt;strong&gt;MessageHeaderArrayAttribute&lt;/strong&gt; 只应用于数组，而不应用于集合。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;在消息协定中使用字节数组&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection4" &gt;&#xD;
&lt;p&gt;与非数组属性（&lt;strong&gt;MessageBodyMemberAttribute&lt;/strong&gt; 和 &lt;strong&gt;MessageHeaderAttribute&lt;/strong&gt;）一起使用时，字节数组不被视为数组，而被视为一种特殊的基元类型，在生成的 XML 中表示为 Base64 编码的数据。&lt;/p&gt;&#xD;
&lt;p&gt;在将字节数组与数组属性 &lt;strong&gt;MessageHeaderArrayAttribute&lt;/strong&gt; 一起使用时，结果取决于正在使用的序列化程序。如果使用默认序列化程序，会将数组表示为每个字节一个单独项。但如果选择 &lt;strong&gt;XmlSerializer&lt;/strong&gt;（在服务协定上使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.xmlserializerformatattribute.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;XmlSerializerFormatAttribute&lt;/span&gt;&lt;/a&gt;），则会将字节数组视为 Base64 数据，而不管是使用数组属性还是非数组属性。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;对消息部分进行签名和加密&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection5" &gt;&#xD;
&lt;p&gt;消息协定可以指示消息头和/或正文是否应进行数字签名和加密。&lt;/p&gt;&#xD;
&lt;p&gt;这可以通过在 &lt;strong&gt;MessageHeaderAttribute&lt;/strong&gt; 和 &lt;strong&gt;MessageBodyMemberAttribute&lt;/strong&gt; 特性上设置 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messagecontractmemberattribute.protectionlevel.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.ServiceModel.MessageContractMemberAttribute.ProtectionLevel&lt;/span&gt;&lt;/a&gt; 属性来完成。该属性是 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.net.security.protectionlevel.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.Net.Security.ProtectionLevel&lt;/span&gt;&lt;/a&gt; 类型的枚举，可以设置为 &lt;span &gt;None&lt;/span&gt;（不加密或签名）、&lt;span &gt;Sign&lt;/span&gt;（仅数字签名）或 &lt;span &gt;EncryptAndSign&lt;/span&gt;（加密并数字签名）。默认值为 &lt;strong&gt;EncryptAndSign&lt;/strong&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;若要让这些安全功能起作用，必须正确配置绑定和行为。如果在没有正确配置的情况下使用这些安全功能（例如，在不提供凭据的情况下试图对消息进行签名），则会在验证时引发异常。&lt;/p&gt;&#xD;
&lt;p&gt;对于消息头，会分别为每个消息头确定其保护级别。&lt;/p&gt;&#xD;
&lt;p&gt;对于消息正文部分，保护级别可理解为&amp;ldquo;最低保护级别&amp;rdquo;。无论包含几个正文部分，正文都只有一个保护级别。正文的保护级别由所有正文部分的最高 &lt;strong&gt;ProtectionLevel&lt;/strong&gt; 属性设置确定。不过，您应该将每个正文部分的保护级别设置为实际要求的最低保护级别。&lt;/p&gt;&#xD;
&lt;p&gt;考虑下面代码示例中的类。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_db0fd71d-4fec-480f-94aa-4073420b91b3');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_db0fd71d-4fec-480f-94aa-4073420b91b3" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; PatientRecord&#xD;
{&#xD;
   [MessageHeader(ProtectionLevel=None)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; recordID;&#xD;
   [MessageHeader(ProtectionLevel=Sign)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; patientName;&#xD;
   [MessageHeader(ProtectionLevel=EncryptAndSign)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; SSN;&#xD;
   [MessageBodyMember(ProtectionLevel=None)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; comments;&#xD;
   [MessageBodyMember(ProtectionLevel=Sign)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; diagnosis;&#xD;
   [MessageBodyMember(ProtectionLevel=EncryptAndSign)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; medicalHistory;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在此示例中，&lt;code&gt;recordID&lt;/code&gt; 标头未受保护，&lt;code&gt;patientName&lt;/code&gt; 为 &lt;code&gt;signed&lt;/code&gt;，&lt;code&gt;SSN&lt;/code&gt; 进行了加密和签名。至少有一个正文部分 &lt;code&gt;medicalHistory&lt;/code&gt; 已应用 &lt;strong&gt;EncryptAndSign&lt;/strong&gt;，因此将对整个消息正文进行加密和签名，即使 comments 和 diagnosis 正文部分指定了较低的保护级别。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;控制标头和正文部分的名称和命名空间&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection6" &gt;&#xD;
&lt;p&gt;在消息协定的 SOAP 表示形式中，每个标头和正文部分都映射为一个具有名称和命名空间的 XML 元素。&lt;/p&gt;&#xD;
&lt;p&gt;默认情况下，命名空间与消息加入的服务协定的命名空间相同，名称由应用 &lt;strong&gt;MessageHeaderAttribute&lt;/strong&gt; 或 &lt;strong&gt;MessageBodyMemberAttribute&lt;/strong&gt; 属性的成员名称确定。&lt;/p&gt;&#xD;
&lt;p&gt;通过操作 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messagecontractmemberattribute.name.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.ServiceModel.MessageContractMemberAttribute.Name&lt;/span&gt;&lt;/a&gt; 和 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messagecontractmemberattribute.namespace.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.ServiceModel.MessageContractMemberAttribute.Namespace&lt;/span&gt;&lt;/a&gt;（在 &lt;strong&gt;MessageHeaderAttribute&lt;/strong&gt; 和 &lt;strong&gt;MessageBodyMemberAttribute&lt;/strong&gt; 特性的父类上）可以更改这些默认值。&lt;/p&gt;&#xD;
&lt;p&gt;考虑下面代码示例中的类。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_99891d95-7f8d-45f5-8681-1f9108cc8a75');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_99891d95-7f8d-45f5-8681-1f9108cc8a75" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; BankingTransaction&#xD;
{&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Operation operation;&#xD;
  [MessageHeader(Namespace=&lt;span style="color: #a31515;"&gt;"http://schemas.contoso.com/auditing/2005"&lt;/span&gt;)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; IsAudited;&#xD;
  [MessageBodyMember(Name=&lt;span style="color: #a31515;"&gt;"transactionData"&lt;/span&gt;)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; BankingTransactionData theData;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在此示例中，&lt;code&gt;IsAudited&lt;/code&gt; 标头位于代码中指定的命名空间中，表示 &lt;code&gt;theData&lt;/code&gt; 成员的正文部分由名为 &lt;code&gt;transactionData&lt;/code&gt; 的 XML 元素表示。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;控制是否包装 SOAP 正文部分&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection7" &gt;&#xD;
&lt;p&gt;默认情况下，SOAP 正文部分会在包装元素内部进行序列化。例如，下面的代码演示从 &lt;code&gt;HelloGreetingMessage&lt;/code&gt; 消息的消息协定中的 &lt;strong&gt;MessageContractAttribute&lt;/strong&gt; 类型的名称生成的 &lt;code&gt;HelloGreetingMessage&lt;/code&gt; 包装元素。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;&lt;span style="color: #e66a38;" color="#e66a38"&gt;C#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a href="javascript: CodeSnippet_SetLanguage('CodeSnippetContainerLang', 'Programming', 'Visual Basic');"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;VB&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_7f77f567-6b8f-4f29-8811-cfee5ee0a886');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_7f77f567-6b8f-4f29-8811-cfee5ee0a886" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; HelloGreetingMessage&#xD;
{&#xD;
  &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; localGreeting;&#xD;
&#xD;
  [MessageBodyMember(&#xD;
    Name = &lt;span style="color: #a31515;"&gt;"Salutations"&lt;/span&gt;, &#xD;
    Namespace = &lt;span style="color: #a31515;"&gt;"http://www.examples.com"&lt;/span&gt;&#xD;
  )]&#xD;
  &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Greeting&#xD;
  {&#xD;
    &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; localGreeting; }&#xD;
    &lt;span style="color: blue;"&gt;set&lt;/span&gt; { localGreeting = value; }&#xD;
  }&#xD;
}&#xD;
&#xD;
&lt;span style="color: green;"&gt;/*&#xD;
 The following is the request message, edited for clarity.&#xD;
  &#xD;
  &amp;lt;s:Envelope&amp;gt;&#xD;
    &amp;lt;s:Header&amp;gt;&#xD;
      &amp;lt;!-- Note: Some header content has been removed for clarity.&#xD;
      &amp;lt;a:Action&amp;gt;http://GreetingMessage/Action&amp;lt;/a:Action&amp;gt; &#xD;
      &amp;lt;a:To s:mustUnderstand="1"&amp;gt;&amp;lt;/a:To&amp;gt;&#xD;
    &amp;lt;/s:Header&amp;gt;&#xD;
    &amp;lt;s:Body u:Id="_0" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"&amp;gt;&#xD;
      &amp;lt;HelloGreetingMessage xmlns="Microsoft.WCF.Documentation"&amp;gt;&#xD;
        &amp;lt;Salutations xmlns="http://www.examples.com"&amp;gt;Hello.&amp;lt;/Salutations&amp;gt;&#xD;
      &amp;lt;/HelloGreetingMessage&amp;gt;&#xD;
    &amp;lt;/s:Body&amp;gt;&#xD;
 &amp;lt;/s:Envelope&amp;gt;&#xD;
 */&lt;/span&gt;&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;若要取消包装元素，请将 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messagecontractattribute.iswrapped.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;IsWrapped&lt;/span&gt;&lt;/a&gt; 属性设置为 &lt;strong&gt;false&lt;/strong&gt;。若要控制包装元素的名称和命名空间，请使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messagecontractattribute.wrappername.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;WrapperName&lt;/span&gt;&lt;/a&gt; 和 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messagecontractattribute.wrappernamespace.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;WrapperNamespace&lt;/span&gt;&lt;/a&gt; 属性。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;th&gt;&lt;img id="note"  title="ms730255.note(zh-cn,VS.100).gif" alt="ms730255.note(zh-cn,VS.100).gif" src="http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif" xmlns="" /&gt;注意：&lt;/th&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;消息中具有多个未包装的消息正文部分不符合 WS-I 基本配置文件 1.1 的规定，在设计新消息协定时不建议这样做。但是，在某些特定的互操作性方案中，必需要具有多个未包装的消息正文部分。如果要在消息正文中传输多段数据，则建议使用默认（包装）模式。未包装的消息中具有多个消息头是完全可以的。&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;SOAP 操作&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection8" &gt;&#xD;
&lt;p&gt;SOAP 和相关 Web 服务标准定义了一个名为 &lt;strong&gt;Action&lt;/strong&gt; 的属性，该属性可用于发送的每个 SOAP 消息。操作的 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.operationcontractattribute.action.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.ServiceModel.OperationContractAttribute.Action&lt;/span&gt;&lt;/a&gt; 和 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.operationcontractattribute.replyaction.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.ServiceModel.OperationContractAttribute.ReplyAction&lt;/span&gt;&lt;/a&gt; 属性控制此属性的值。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;SOAP 标头属性&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection9" &gt;&#xD;
&lt;p&gt;SOAP 标准定义了下列可存在于标头上的属性：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li &gt;&lt;strong&gt;Actor/Role&lt;/strong&gt;（在 SOAP 1.1 中为 &lt;strong&gt;Actor&lt;/strong&gt;，在 SOAP 1.2 中为 &lt;strong&gt;Role&lt;/strong&gt;）&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;strong&gt;MustUnderstand&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;strong&gt;Relay&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Actor&lt;/strong&gt; 或 &lt;strong&gt;Role&lt;/strong&gt; 属性指定要使用给定标头的节点的统一资源标识符 (URI)。&lt;strong&gt;MustUnderstand&lt;/strong&gt; 属性指定处理标头的节点是否必须理解该标头。&lt;strong&gt;Relay&lt;/strong&gt; 属性指定要将标头中继到下游节点。WCF 不会对传入消息的这些属性执行任何处理，但 &lt;strong&gt;MustUnderstand&lt;/strong&gt; 属性除外，该属性将在本主题后面的&amp;ldquo;消息协定版本管理&amp;rdquo;部分中说明。但它允许您根据需要读取和写入这些属性，如下所述。&lt;/p&gt;&#xD;
&lt;p&gt;发送消息时，默认情况下不会发出这些属性。您可以采取两种方式更改这一行为。第一种方式是通过更改 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messageheaderattribute.actor.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.ServiceModel.MessageHeaderAttribute.Actor&lt;/span&gt;&lt;/a&gt;、&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messageheaderattribute.mustunderstand.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.ServiceModel.MessageHeaderAttribute.MustUnderstand&lt;/span&gt;&lt;/a&gt; 和 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messageheaderattribute.relay.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.ServiceModel.MessageHeaderAttribute.Relay&lt;/span&gt;&lt;/a&gt; 属性，以静态方式将这些特性设置为任何需要的值，如下面的代码示例所示。（请注意，没有 &lt;strong&gt;Role&lt;/strong&gt; 属性；如果使用 SOAP 1.2，则设置 &lt;strong&gt;Actor&lt;/strong&gt; 属性会发出 &lt;strong&gt;Role&lt;/strong&gt; 特性）。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_3c4b5df7-fd7e-486d-ac56-b5f7519359ce');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_3c4b5df7-fd7e-486d-ac56-b5f7519359ce" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; BankingTransaction&#xD;
{&#xD;
  [MessageHeader(Actor=&lt;span style="color: #a31515;"&gt;"http://auditingservice.contoso.com"&lt;/span&gt;, MustUnderstand=&lt;span style="color: blue;"&gt;true&lt;/span&gt;)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; IsAudited;&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Operation operation;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; BankingTransactionData theData;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;第二种方式是通过代码以动态方式控制这些属性。为此，您可以将所需的标头包装在 &lt;a href="http://msdn.microsoft.com/zh-cn/library/ms586745.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;MessageHeader&lt;/span&gt;&lt;/a&gt; 类型中（切勿将此类型与非泛型版本混淆），并与 &lt;strong&gt;MessageHeaderAttribute&lt;/strong&gt; 一起使用该类型。然后，可以在 &lt;strong&gt;MessageHeader&lt;/strong&gt; 上使用属性来设置 SOAP 特性，如下面的代码示例所示。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_256bd58a-f7ee-466f-9b9c-99acc112513b');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_256bd58a-f7ee-466f-9b9c-99acc112513b" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; BankingTransaction&#xD;
{&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; MessageHeader&amp;lt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; IsAudited;&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Operation operation;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; BankingTransactionData theData;&#xD;
}&#xD;
&lt;span style="color: green;"&gt;// application code:&lt;/span&gt;&#xD;
BankingTransaction bt = &lt;span style="color: blue;"&gt;new&lt;/span&gt; BankingTransaction();&#xD;
bt.IsAudited = &lt;span style="color: blue;"&gt;new&lt;/span&gt; MessageHeader&amp;lt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt;();&#xD;
bt.IsAudited.Content = &lt;span style="color: blue;"&gt;false&lt;/span&gt;; &lt;span style="color: green;"&gt;// Set IsAudited header value to "false"&lt;/span&gt;&#xD;
bt.IsAudited.Actor=&lt;span style="color: #a31515;"&gt;"http://auditingservice.contoso.com"&lt;/span&gt;;&#xD;
bt.IsAudited.MustUnderstand=&lt;span style="color: blue;"&gt;true&lt;/span&gt;;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;如果同时使用动态和静态控制机制，则静态设置用作默认设置，但可以在以后使用动态机制重写，如下面的代码所示。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;other&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_4a7ca822-bffe-4ca7-9898-ad63977acd7d');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_4a7ca822-bffe-4ca7-9898-ad63977acd7d" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[C#]&#xD;
[MessageHeader(MustUnderstand=true)] public MessageHeader&amp;lt;Person&amp;gt; documentApprover;&#xD;
// later on in the code:&#xD;
BankingTransaction bt = new BankingTransaction();&#xD;
bt.documentApprover = new MessageHeader&amp;lt;Person&amp;gt;();&#xD;
bt.documentApprover.MustUnderstand = false; // override the static default of 'true'&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;允许创建具有动态属性控制的重复标头，如下面的代码所示。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_5f105ddf-e673-4a86-8760-a9721dc70abb');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_5f105ddf-e673-4a86-8760-a9721dc70abb" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageHeaderArray] &lt;span style="color: blue;"&gt;public&lt;/span&gt; MessageHeader&amp;lt;Person&amp;gt; documentApprovers[];&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在接收端，仅当对类型中的标头使用 &lt;strong&gt;MessageHeader&lt;/strong&gt; 类时才能读取这些 SOAP 属性。请检查 &lt;strong&gt;MessageHeader&lt;/strong&gt; 类型的标头的 &lt;strong&gt;Actor&lt;/strong&gt;、&lt;strong&gt;Relay&lt;/strong&gt; 或 &lt;strong&gt;MustUnderstand&lt;/strong&gt; 属性 (Property) 以发现所接收消息的属性 (Attribute) 设置。&lt;/p&gt;&#xD;
&lt;p&gt;当接收到消息然后发回该消息时，SOAP 属性设置仅对 &lt;strong&gt;MessageHeader&lt;/strong&gt; 类型的标头往返一次。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;SOAP 正文部分的顺序&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection10" &gt;&#xD;
&lt;p&gt;在某些情况下，可能需要控制正文部分的顺序。默认情况下，正文元素采用字母顺序，但可以通过 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.messagebodymemberattribute.order.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.ServiceModel.MessageBodyMemberAttribute.Order&lt;/span&gt;&lt;/a&gt; 属性进行控制。此属性具有与 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datamemberattribute.order.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.Runtime.Serialization.DataMemberAttribute.Order&lt;/span&gt;&lt;/a&gt; 属性相同的语义，但在继承方案中的行为除外（在消息协定中，基类型正文成员不排列在派生类型正文成员之前）。有关更多信息，请参见 &lt;a href="http://msdn.microsoft.com/zh-cn/library/ms729813.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;数据成员顺序&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;在下面的示例中，&lt;code&gt;amount&lt;/code&gt; 通常排在第一位，因为按字母顺序它排在第一位。但 &lt;strong&gt;Order&lt;/strong&gt; 属性将它放在了第三位。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_e6d09661-ebeb-4f57-9a1f-ecb8fa525acd');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_e6d09661-ebeb-4f57-9a1f-ecb8fa525acd" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; BankingTransaction&#xD;
{&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Operation operation;&#xD;
  [MessageBodyMember(Order=1)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Account sourceAccount;&#xD;
  [MessageBodyMember(Order=2)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Account targetAccount;&#xD;
  [MessageBodyMember(Order=3)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; amount;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;消息协定版本管理&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection11" &gt;&#xD;
&lt;p&gt;有时，您可能需要更改消息协定。例如，应用程序的新版本可能会向消息中添加额外的标头。在从新版本应用程序向旧版本应用程序发送消息时，系统必须处理额外的标头；同样，反方向操作时系统必须处理缺少的标头。&lt;/p&gt;&#xD;
&lt;p&gt;下面的规则适用于标头的版本管理：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li &gt;WCF 不反对缺少标头，相应的成员将保留其默认值。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;WCF 还忽略意外的额外标头。此规则的一种例外情况是在传入的 SOAP 消息中，额外标头的 &lt;strong&gt;MustUnderstand&lt;/strong&gt; 属性设置为 &lt;strong&gt;true&lt;/strong&gt;。在这种情况下，由于存在一个无法处理但必须理解的标头，因此会引发异常。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;消息正文具有类似的版本管理规则，即忽略缺少和附加的消息正文部分。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;继承注意事项&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection12" &gt;&#xD;
&lt;p&gt;消息协定类型可以继承自另一个类型，前提是基类型也具有消息协定。&lt;/p&gt;&#xD;
&lt;p&gt;在使用继承自其他消息协定类型的消息协定类型创建或访问消息时，下面的规则适用：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li &gt;继承层次结构中的所有消息头集合在一起构成消息头的完整集合。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;继承层次结构中的所有消息正文部分集合在一起构成消息正文的完整集合。正文部分按照通常排序规则排列（按 &lt;strong&gt;System.ServiceModel.MessageBodyMemberAttribute.Order&lt;/strong&gt; 属性，然后按字母顺序排序），与它们在继承层次结构中的位置无关。在使用消息协定继承时，强烈建议消息正文部分不要出现在继承树的多个级别上。如果基类和派生类用相同的名称定义标头或正文部分，则使用最基础的类中的成员来存储该标头或正文部分的值。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;考虑下面代码示例中的类。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_8f371cae-825a-439b-b7da-5745f6c611db');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_8f371cae-825a-439b-b7da-5745f6c611db" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; PersonRecord&#xD;
{&#xD;
  [MessageHeader(Name=&lt;span style="color: #a31515;"&gt;"ID"&lt;/span&gt;)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; personID;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; patientName;&#xD;
}&#xD;
&#xD;
[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; PatientRecord : PersonRecord&#xD;
{&#xD;
  [MessageHeader(Name=&lt;span style="color: #a31515;"&gt;"ID"&lt;/span&gt;)] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; patientID;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; diagnosis;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;code&gt;PatientRecord&lt;/code&gt; 类描述了一个消息，该消息具有一个名为 &lt;code&gt;ID&lt;/code&gt; 的标头。该标头对应于 &lt;code&gt;personID&lt;/code&gt; 而不对应于 &lt;code&gt;patientID&lt;/code&gt; 成员，因为选择了最基础的成员。因此，在这种情况下，&lt;code&gt;patientID&lt;/code&gt; 字段无用。消息正文包含 &lt;code&gt;diagnosis&lt;/code&gt; 元素，后面跟随 &lt;code&gt;patientName&lt;/code&gt; 元素，因为这是这些元素的字母顺序。表注意，该示例演示了一种强烈建议不要使用的模式：基消息协定和派生消息协定都具有消息正文部分。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;WSDL 注意事项&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection13" &gt;&#xD;
&lt;p&gt;在从使用消息协定的服务生成 Web 服务描述语言 (WSDL) 协定时，必须记住生成的 WSDL 中并不会反映所有的消息协定功能。请考虑以下几点：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li &gt;WSDL 无法表示标头数组的概念。使用 &lt;strong&gt;MessageHeaderArrayAttribute&lt;/strong&gt; 创建具有标头数组的消息时，生成的 WSDL 只反映一个标头而不是该数组。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;生成的 WSDL 文档可能不反映某些保护级别信息。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;在 WSDL 中生成的消息类型的名称与消息协定类型的类名称相同。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;在多个操作中使用同一个消息协定时，会在 WSDL 文档中生成多个消息类型。对于后续使用，会在名称中添加数字&amp;ldquo;2&amp;rdquo;、&amp;ldquo;3&amp;rdquo;等以使名称唯一。在导回 WSDL 时，会创建多个消息协定类型，除了名称不同外，这些消息协定类型完全相同。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;SOAP 编码注意事项&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection14" &gt;&#xD;
&lt;p&gt;WCF 允许但不推荐使用 XML 的旧式 SOAP 编码样式。使用这种样式时（在应用于服务协定的 &lt;strong&gt;System.ServiceModel.XmlSerializerFormatAttribute&lt;/strong&gt; 上将 &lt;strong&gt;Use&lt;/strong&gt; 属性设置为 &lt;strong&gt;Encoded&lt;/strong&gt;），下面的附加注意事项适用：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li &gt;不支持消息头；这意味着属性 &lt;strong&gt;MessageHeaderAttribute&lt;/strong&gt; 和数组属性 &lt;strong&gt;MessageHeaderArrayAttribute&lt;/strong&gt; 与 SOAP 编码不兼容。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;如果未包装消息协定，即如果属性 &lt;strong&gt;IsWrapped&lt;/strong&gt; 设置为 &lt;strong&gt;false&lt;/strong&gt;，则消息协定只能具有一个正文部分。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;请求消息协定的包装元素的名称必须与操作名称匹配。为此请使用消息协定的 &lt;strong&gt;WrapperName&lt;/strong&gt; 属性。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;响应消息协定的包装元素的名称必须与具有&amp;ldquo;Response&amp;rdquo;后缀的操作名称相同。为此请使用消息协定的 &lt;strong&gt;WrapperName&lt;/strong&gt; 属性。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&#xD;
&lt;li &gt;SOAP 编码保留对象引用。例如，请考虑下面的代码。&lt;br /&gt;&lt;br /&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_a0dfb983-7793-4231-9228-b72849a540a4');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_a0dfb983-7793-4231-9228-b72849a540a4" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract(WrapperName=&lt;span style="color: #a31515;"&gt;"updateChangeRecord"&lt;/span&gt;)]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; ChangeRecordRequest&#xD;
{&#xD;
  [MessageBodyMember] Person changedBy;&#xD;
  [MessageBodyMember] Person changedFrom;&#xD;
  [MessageBodyMember] Person changedTo;&#xD;
}&#xD;
&#xD;
[MessageContract(WrapperName=&lt;span style="color: #a31515;"&gt;"updateChangeRecordResponse"&lt;/span&gt;)]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; ChangeRecordResponse&#xD;
{&#xD;
  [MessageBodyMember] Person changedBy;&#xD;
  [MessageBodyMember] Person changedFrom;&#xD;
  [MessageBodyMember] Person changedTo;&#xD;
}&#xD;
&#xD;
&lt;span style="color: green;"&gt;// application code:&lt;/span&gt;&#xD;
ChangeRecordRequest cr = &lt;span style="color: blue;"&gt;new&lt;/span&gt; ChangeRecordRequest();&#xD;
Person p = &lt;span style="color: blue;"&gt;new&lt;/span&gt; Person(&lt;span style="color: #a31515;"&gt;"John Doe"&lt;/span&gt;);&#xD;
cr.changedBy=p;&#xD;
cr.changedFrom=p;&#xD;
cr.changedTo=p;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;使用 SOAP 编码序列化消息后，&lt;code&gt;changedFrom&lt;/code&gt; 和 &lt;code&gt;changedTo&lt;/code&gt; 不包含其自己的 &lt;code&gt;p&lt;/code&gt; 副本，而是指向 &lt;code&gt;changedBy&lt;/code&gt; 元素内的副本。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;性能注意事项&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="sectionSection15" &gt;&#xD;
&lt;p&gt;每个消息头和消息正文部分相互独立地进行序列化。因此，可以为每个标头和正文部分重新声明相同的命名空间。为了提高性能，特别是对于消息在网络上的大小，请将多个标头和正文部分合并成一个标头或正文部分。例如，不要使用下面代码：&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_dbec3a24-24de-4a51-b061-f44c129f259b');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_dbec3a24-24de-4a51-b061-f44c129f259b" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; BankingTransaction&#xD;
{&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Operation operation;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Account sourceAccount;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Account targetAccount;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; amount;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;请使用此代码。&lt;/p&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&#xD;
&lt;link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/Areas/Brand/Content/CodeSnippet.css" /&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;a&gt;C#&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;a style="display: block;" title="复制到剪贴板。" href="javascript:CodeSnippet_CopyCode('CodeSnippetContainerCode_f877c2d8-0531-4688-b5ab-8aa6edb018aa');" name="CodeSnippetCopyLink"&gt;&lt;/a&gt;复制&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_f877c2d8-0531-4688-b5ab-8aa6edb018aa" &gt;&#xD;
&lt;div style="color: black;"&gt;&#xD;
&lt;pre&gt;[MessageContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; BankingTransaction&#xD;
{&#xD;
  [MessageHeader] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Operation operation;&#xD;
  [MessageBodyMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; OperationDetails details;&#xD;
}&#xD;
&#xD;
[DataContract]&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; OperationDetails&#xD;
{&#xD;
  [DataMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Account sourceAccount;&#xD;
  [DataMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; Account targetAccount;&#xD;
  [DataMember] &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; amount;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h3 &gt;基于事件的异步协定和消息协定&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;基于事件的异步模型设计准则规定，如果返回了多个值，则一个值会作为 &lt;strong&gt;Result&lt;/strong&gt; 属性返回，其他值会作为 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.eventargs.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;EventArgs&lt;/span&gt;&lt;/a&gt; 对象上的属性返回。因此产生的结果之一是，如果客户端使用基于事件的异步命令选项导入元数据，且该操作返回多个值，则默认的 &lt;strong&gt;EventArgs&lt;/strong&gt; 对象将返回一个值作为 &lt;strong&gt;Result&lt;/strong&gt; 属性，返回的其余值是 &lt;strong&gt;EventArgs&lt;/strong&gt; 对象的属性。&lt;/p&gt;&#xD;
&lt;p&gt;如果要将消息对象作为 &lt;strong&gt;Result&lt;/strong&gt; 属性来接收并要使返回的值作为该对象上的属性，请使用 &lt;strong&gt;/messageContract&lt;/strong&gt; 命令选项。这会生成一个签名，该签名会将响应消息作为 &lt;strong&gt;EventArgs&lt;/strong&gt; 对象上的 &lt;strong&gt;Result&lt;/strong&gt; 属性返回。然后，所有内部返回值就都是响应消息对象的属性了。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h2 &gt;&lt;span id="seeAlsoNoToggle"&gt;&lt;/span&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2199270.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/10/05/2199270.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/09/29/2195492.html</id><title type="text">15138删除对于用户失败,数据库主体在该数据库中拥有架构</title><summary type="text">解决方法一 先删除此用户对应的架构，然后在删除对应的用户 步骤 1。SQL SERVER MANAGEMENT STUDIO--》数据库--》安全性--》构架，先删除对应的构架 2。SQL SERVER MANAGEMENT STUDIO--》数据库--》安全性--》用户，删除对应的用户 解决方法二 --执行如下SQL语句 ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo; --然后手动删除就可以了。</summary><published>2011-09-29T06:40:00Z</published><updated>2011-09-29T06:40:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/29/2195492.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/29/2195492.html"/><content type="html">&lt;p&gt;解决方法一 &lt;br /&gt;&lt;br /&gt;先删除此用户对应的架构，然后在删除对应的用户 &lt;br /&gt;步骤 &lt;br /&gt;1。SQL SERVER MANAGEMENT STUDIO--》数据库--》安全性--》构架，先删除对应的构架 &lt;br /&gt;2。SQL SERVER MANAGEMENT STUDIO--》数据库--》安全性--》用户，删除对应的用户 &lt;br /&gt;&lt;br /&gt;解决方法二 &lt;br /&gt;&lt;br /&gt;--执行如下SQL语句 &lt;br /&gt;&lt;br /&gt;ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo; &lt;br /&gt;--然后手动删除就可以了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2195492.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/29/2195492.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/09/28/2194198.html</id><title type="text">ASP.NET MVC AuthorizeAttribute 相关</title><summary type="text">AuthorizeAttribute 类.NET Framework 4表示一个特性，该特性用于限制调用方对操作方法的访问。继承层次结构System.Object System.Attribute System.Web.Mvc.FilterAttribute System.Web.Mvc.AuthorizeAttribute命名空间： System.Web.Mvc程序集： System.Web.Mvc（在 System.Web.Mvc.dll 中）许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限。在某些应用程序中，即使是登录的用户，也会限制他们可以查看的内容或可以编辑的字</summary><published>2011-09-28T06:09:00Z</published><updated>2011-09-28T06:09:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/28/2194198.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/28/2194198.html"/><content type="html">&lt;h1 &gt;AuthorizeAttribute 类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div id="curversion"&gt;&lt;strong&gt;.NET Framework 4&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div style="clear: both;"&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div id="mainSection"&gt;&#xD;
&lt;div id="mainBody"&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span id="xn1_8ccf9b9d5858debd7605f67377d0e778" &gt;表示一个特性，该特性用于限制调用方对操作方法的访问。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div xmlns=""&gt;&#xD;
&#xD;
&lt;div &gt;&#xD;
&lt;div&gt;&lt;a  title="折叠" href="javascript:void(0)"&gt;&lt;img  src="http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif" /&gt;&lt;strong&gt;&lt;span &gt;&lt;span style="color: #3f529c; font-size: large;" color="#3f529c" size="5"&gt;继承层次结构&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&#xD;
&lt;div &gt;&lt;strong&gt;&lt;strong&gt;&lt;span style="color: #3f529c; font-size: large;" color="#3f529c" size="5"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;hr  /&gt;&lt;strong&gt;&lt;span style="color: #3f529c; font-size: large;" color="#3f529c" size="5"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a id="familyToggle" xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;/a&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.object.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System&lt;span&gt;.&lt;/span&gt;Object&lt;/span&gt;&lt;/a&gt;&lt;br xmlns="http://www.w3.org/1999/xhtml" /&gt; &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.attribute.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System&lt;span&gt;.&lt;/span&gt;Attribute&lt;/span&gt;&lt;/a&gt;&lt;br xmlns="http://www.w3.org/1999/xhtml" /&gt; &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.web.mvc.filterattribute.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.Web.Mvc&lt;span&gt;.&lt;/span&gt;FilterAttribute&lt;/span&gt;&lt;/a&gt;&lt;br xmlns="http://www.w3.org/1999/xhtml" /&gt; &lt;span  xmlns="http://www.w3.org/1999/xhtml"&gt;System.Web.Mvc&lt;span xmlns=""&gt;.&lt;/span&gt;AuthorizeAttribute&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;strong&gt;命名空间：&lt;/strong&gt; &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.web.mvc.aspx"&gt;&lt;span style="color: #1364c4;" color="#1364c4"&gt;System.Web.Mvc&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;程序集：&lt;/strong&gt; &lt;span&gt;System.Web.Mvc&lt;/span&gt;（在 System.Web.Mvc.dll 中）&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span id="xn23_c89e98c601dc18c9d0af88827ae0d9fa" &gt;许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限。&lt;/span&gt;&lt;span id="xn24_d86d542c6eb856b9705b0e173e64d886" &gt;在某些应用程序中，即使是登录的用户，也会限制他们可以查看的内容或可以编辑的字段。&lt;/span&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span id="xn25_342a192cfced8f2b7a45de91cad97b3e" &gt;要限制对 ASP.NET MVC 视图的访问，您可以限制对呈现视图的操作方法的访问。&lt;/span&gt;&lt;span id="xn26_fdd66235fe65adf0306bd8e5d26b7e68" &gt;为此，MVC 框架提供 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;AuthorizeAttribute&lt;/span&gt;&lt;/span&gt; 类。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;使用 AuthorizeAttribute&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;&lt;span id="xn31_c213be5ebfe555d62f02d764b1a3678b" &gt;当您使用 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;AuthorizeAttribute&lt;/span&gt;&lt;/span&gt; 标记一个操作方法时，则限制只有经过身份验证和授权的用户才能访问该操作方法。&lt;/span&gt;&lt;span id="xn32_3f58d20c8e5eef5e53936d6ecce54900" &gt;如果您使用该特性标记控制器，则限制控制器中的所有操作方法。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn33_470f73ed511071adc094954c45aa1d50" &gt;&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;Authorize&lt;/span&gt;&lt;/span&gt; 特性允许您指明将授权限制给预定义角色或各个用户。&lt;/span&gt;&lt;span id="xn34_eabdc037881dc5b2b0945bd992552b47" &gt;这使您可以高度控制谁有权查看网站上的任何页面。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn35_95b77a733593b1de95a2a880f2eb25d0" &gt;如果未经授权的用户尝试访问用 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;Authorize&lt;/span&gt;&lt;/span&gt; 特性标记的方法，则 MVC 框架会返回 401 HTTP 状态代码。&lt;/span&gt;&lt;span id="xn36_e618a590900d230edc3e17a17640a293" &gt;如果站点配置为使用 ASP.NET Forms 身份验证，401 状态代码会导致浏览器将用户重定向到登录页。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;span style="color: #f56400; font-family: Arial; font-size: medium;" face="Arial" color="#f56400" size="4"&gt;&lt;/span&gt;&amp;nbsp;以上转自：&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.web.mvc.authorizeattribute.aspx#using_authorizeattribute"&gt;http://msdn.microsoft.com/zh-cn/library/system.web.mvc.authorizeattribute.aspx#using_authorizeattribute&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;span style="color: #f56400; font-family: Arial; font-size: medium;" face="Arial" color="#f56400" size="4"&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;span style="color: #f56400; font-family: Arial; font-size: medium;" face="Arial" color="#f56400" size="4"&gt;自定义AuthorizeAttribute&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;网站的权限判断是一个非常普遍的需求，从文章&lt;a href="http://www.cnblogs.com/shanyou/archive/2010/03/27/1698639.html"&gt;ASP.NET MVC的Action Filter&lt;/a&gt;中我们知道实现这样的需求只要从&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx"&gt;AuthorizeAttribute&lt;/a&gt;集成，重写相关的判断逻辑就可以了。这里记录一下：&lt;/p&gt;&#xD;
&lt;p&gt;namespace TokenAcl.Web.Helper &lt;br /&gt;{ &lt;br /&gt; public class TokenAclAuthorizeAttribute : AuthorizeAttribute &lt;br /&gt; { &lt;br /&gt; protected override bool AuthorizeCore(HttpContextBase httpContext) &lt;br /&gt; { &lt;br /&gt; bool result = false; &lt;br /&gt; if (httpContext == null) &lt;br /&gt; { &lt;br /&gt; throw new ArgumentNullException("httpContext"); &lt;br /&gt; } &lt;br /&gt; string[] users = Users.Split(','); &lt;br /&gt; string[] roles = Roles.Split(','); &lt;br /&gt; if (!httpContext.User.Identity.IsAuthenticated) &lt;br /&gt; return false; &lt;br /&gt; if (roles.Length != 0) &lt;br /&gt; { &lt;br /&gt; List&amp;lt;Role&amp;gt; rightRoles = RightClient.GetAllRole(TakenAclMenu.SystemID, TakenAclMenu.UserID); &lt;br /&gt; foreach (var role in roles) &lt;br /&gt; { &lt;br /&gt; if (rightRoles.Where(x =&amp;gt; x.Code == role).Count() &amp;gt; 0) &lt;br /&gt; { &lt;br /&gt; result = true; &lt;br /&gt; break; &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; if (!result) &lt;br /&gt; { &lt;br /&gt; httpContext.Response.StatusCode = 403; &lt;br /&gt; } &lt;br /&gt; return result; &lt;br /&gt; }&lt;/p&gt;&#xD;
&lt;p&gt;public override void OnAuthorization(AuthorizationContext filterContext) &lt;br /&gt; { &lt;br /&gt; base.OnAuthorization(filterContext); &lt;br /&gt; if (filterContext.HttpContext.Response.StatusCode == 403) &lt;br /&gt; { &lt;br /&gt; filterContext.Result = new RedirectResult("/Admin/Dashboard"); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;从AuthorizeAttribute继承过来实现了一个类TokenAclAuthorizeAttribute ，重写了方法AuthorizeCore，使用自己开发的权限系统进行权限的验证，如果没有通过认证，这表示没有权限访问，设置&lt;a href="http://www.cnblogs.com/samlin/archive/2008/08/21/http-StatusCode.html"&gt;HTTP 状态代码&lt;/a&gt;为403。 这样还是不行，还得重写另一个方法OnAuthorization。AuthorizeCore方法返回false，MVC 此时将返回的ActionResult是HttpUnauthorizedResult：&lt;/p&gt;&#xD;
&lt;p&gt;public class HttpUnauthorizedResult : ActionResult { &lt;br /&gt;public override void ExecuteResult(ControllerContext context) { &lt;br /&gt;if (context == null) { &lt;br /&gt;throw new ArgumentNullException("context"); &lt;br /&gt; } &lt;br /&gt;// 401 is the HTTP status code for unauthorized access - setting this &lt;br /&gt;// will cause the active authentication module to execute its default &lt;br /&gt;// unauthorized handler &lt;br /&gt; context.HttpContext.Response.StatusCode = 401; &lt;br /&gt; } &lt;br /&gt; }&lt;/p&gt;&#xD;
&lt;p&gt;从HttpUnauthorizedResult的源码可以看出，HttpUnauthorizedResult的执行很简单，就是设置当前的HttpContext.Response的状态码为401，这样就回激活authentication module 执行它默认的 unauthorized handler，也就是跳转到登陆页面的，这似乎也不符合逻辑，认证和授权应该是验证的两个方面。这不符合要求，用户已经登陆成功了，只是没有权限而已。我这里只是重写OnAuthorization方法，重定向到一个页面而已，也可以写一个ActionResult。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;span &gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;span &gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;span &gt;以上转自：&lt;a href="http://www.cnblogs.com/shanyou/archive/2010/03/27/1698639.html"&gt;http://www.cnblogs.com/shanyou/archive/2010/03/27/1698639.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2194198.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/28/2194198.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/09/27/2192867.html</id><title type="text">Manual Addressing 相关</title><summary type="text">最近在做一个WCF路由器，其中关于Manual Addressing的知识，经过在artech处查阅，得知：Manual Addressing可能大家已经看到了，在custombing中的httpTransport 配置项中，将manualAddressing设置为true。manualAddressing在默认的情况下为false，意为着将按照WS-Addressing的方式进行Adressing。当该属性设为false，WCF会将client端的Endpoint的Address地址写入SOAP的To header中，而将manualAddressing设为true，可以保留现有SOAP的T</summary><published>2011-09-27T02:39:00Z</published><updated>2011-09-27T02:39:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/27/2192867.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/27/2192867.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: x-small;" size="2"&gt;最近在做一个WCF路由器，其中关于Manual Addressing的知识，经过在artech处查阅，得知：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: x-small;" size="2"&gt;Manual Addressing&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: x-small;" size="2"&gt;可能大家已经看到了，&lt;span style="background-color: #ff9900;"&gt;在custombing中的httpTransport 配置项中，将manualAddressing设置为true。manualAddressing在默认的情况下为false，意为着将按照WS-Addressing的方式进行Adressing。当该属性设为false，WCF会将client端的Endpoint的Address地址写入SOAP的To header中，而将manualAddressing设为true，可以保留现有SOAP的To header中的地址&lt;/span&gt;，在本例中InterceptService接收到的SOAP的To address为&lt;a href="http://127.0.0.1:9999/calculateservice" target="_blank"&gt;&lt;span style="color: #000000;" color="#000000"&gt;http://127.0.0.1:9999/calculateservice&lt;/span&gt;&lt;/a&gt;，然后在&amp;lt;client&amp;gt;中的endpoint address则是&lt;a href="http://127.0.0.1:8888/Interceptservice%22" target="_blank"&gt;&lt;span style="color: #000000;" color="#000000"&gt;http://127.0.0.1:8888/Interceptservice&lt;/span&gt;&lt;/a&gt;。&lt;span style="background-color: #ff9900;"&gt;如果manualAddressing = false，那么To address将会变成&lt;a href="http://127.0.0.1:8888/Interceptservice%22" target="_blank"&gt;&lt;span style="background-color: #ff9900;"&gt;&lt;span style="color: #000000;" color="#000000"&gt;http://127.0.0.1:8888/Interceptservice&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;。当该SOAP抵达CalculateService时，由于ChannelDispatcher根据两个Message Filter（Address Filter和Contract Filter）定位到对应的Endpoint。Address Filter就是根据SOAP的To address来进行筛选的，在默认的情况下，是找不到对应的Endpoint的。反之，我们manualAddressing=true，将保留SOAP的To header中的address。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2192867.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/27/2192867.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/09/26/2191729.html</id><title type="text">ARR:Application Request Routing</title><summary type="text">ARR简单的说就是一个IIS7的负载均衡模块，可以一次管理多个IIS 6/7的服务器集群，规则基于URL，或者基于HOST NAME，或者基于HTTP HEADER。微软的Application Request Routing(ARR) 2.0使得Web管理员，虚拟主机提供商，内容分发网络（CDN）通过基于规则路由，机器名匹配，HTTP请求的负载均衡和分布式磁盘缓存来提高Web应用程序的的可扩展性和可靠性。有了ARR技术，管理员可以优化资源以及应用服务器的管理成本。负载均衡可以有效的提高资源的利用率 使用ARR，管理员可以创建强大的基于规则的URL，HTTP HEADERS 变量，并决定最合适</summary><published>2011-09-26T07:08:00Z</published><updated>2011-09-26T07:08:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/26/2191729.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/26/2191729.html"/><content type="html">&lt;p&gt;ARR简单的说就是一个IIS7的负载均衡模块，可以一次管理多个IIS 6/7的服务器集群，规则基于URL，或者基于HOST NAME，或者基于HTTP HEADER。微软的Application Request Routing(ARR) 2.0使得Web管理员，虚拟主机提供商，内容分发网络（CDN）通过基于规则路由，机器名匹配，HTTP请求的负载均衡和分布式磁盘缓存来提高Web应用程序的的可扩展性和可靠性。有了ARR技术，管理员可以优化资源以及应用服务器的管理成本。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;负载均衡可以有效的提高资源的利用率 &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用ARR，管理员可以创建强大的基于规则的URL，HTTP HEADERS 变量，并决定最合适的WEB应用服务器。ARR在应用层进行路由选择，并可以在其上加上BIG IP 5这类硬件负载均衡器或者是Windows 负载均衡技术，进行三层架构路由。典型的几种方式：使用ARR，管理员可以将*.aspx路由到一个独立应用服务器上。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;使用标准的IIS MANAGER更容易管理多个WEB FARMS &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ARR给予管理员，创建、管理、应用LOAD BALANCING（负载均衡）规则的能力，管理员可以需求轻松地添加一个服务器到WEB FARMS里去，ARR同时包含了对每台单独的服务器实时流量、URL测试的监视能力。管理员这时有能力在IIS 7的MANAGER中查看WEB FARMS中每个服务器的统计信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;优化带宽的使用和通过缓存扩展服务器的能力&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ARR可以在磁盘上缓存任何经过服务器的HTTP通信。 通过结合磁盘缓存连同层次化的IIS网站运行ARR的IIS web服务器，CDN和层次化服务器的能力可以大大降低到达源服务器的网络流量。&lt;/p&gt;&#xD;
&lt;p&gt;特性：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;基于HTTP的路由决策&lt;/li&gt;&#xD;
&lt;li&gt;化过的负载均衡算法&lt;/li&gt;&#xD;
&lt;li&gt;基于流量以及URL的服务器健康状态检查&lt;/li&gt;&#xD;
&lt;li&gt;基于COOKIES识别单个客户端，并自动分配到WEB FARMS中制定服务器的能力。&lt;/li&gt;&#xD;
&lt;li&gt;主机名的匹配简化Web服务器的管理，并创造更多的商业机会。&lt;/li&gt;&#xD;
&lt;li&gt;多服务器场管理，使管理试点和A / B测试方案。&lt;/li&gt;&#xD;
&lt;li&gt;管理并监视所有的服务器配置。&lt;/li&gt;&#xD;
&lt;li&gt;支持FAILED REQUEST TRACING RULES&lt;/li&gt;&#xD;
&lt;li&gt;基于磁盘高速缓存&lt;/li&gt;&#xD;
&lt;li&gt;缓存层次管理&lt;/li&gt;&#xD;
&lt;li&gt;CDN/ECN 环境的缓存代理节点&lt;/li&gt;&#xD;
&lt;li&gt;缓存压缩对象&lt;/li&gt;&#xD;
&lt;li&gt;使用IIS管理器浏览缓存的内容&lt;/li&gt;&#xD;
&lt;li&gt;通过匹配的URL模式删除缓存内容&lt;/li&gt;&#xD;
&lt;li&gt;重写缓存控制指令&lt;/li&gt;&#xD;
&lt;li&gt;热身缓存模式&lt;/li&gt;&#xD;
&lt;li&gt;支持智能字节范围的&lt;/li&gt;&#xD;
&lt;li&gt;支持智能现场请求&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;刚刚整理好的，关于ARR的资料打包下载: &lt;a title="http://cid-33478a966734670f.skydrive.live.com/self.aspx/.Public/ARR.7z" href="http://cid-33478a966734670f.skydrive.live.com/self.aspx/.Public/ARR.7z" target="_blank"&gt;&lt;span style="color: #1e50a2;" color="#1e50a2"&gt;http://cid-33478a966734670f.skydrive.live.com/self.aspx/.Public/ARR.7z&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Application Request Routing: &lt;a title="http://www.iis.net/expand/ApplicationRequestRouting" href="http://www.iis.net/expand/ApplicationRequestRouting" target="_blank"&gt;&lt;span style="color: #1e50a2;" color="#1e50a2"&gt;http://www.iis.net/expand/ApplicationRequestRouting&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Application Request Routing and the IIS 7.0 Web Management Service:&lt;a href="http://blogs.msdn.com/carlosag/archive/2008/08/21/ARRandWMSVC.aspx" target="_blank"&gt;&lt;span style="color: #1e50a2;" color="#1e50a2"&gt;http://blogs.msdn.com/carlosag/archive/2008/08/21/ARRandWMSVC.aspx&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IIS request filtering woes: &lt;a href="http://improve.dk/blog/2009/09/23/iis-request-filtering-woes" target="_blank"&gt;&lt;span style="color: #1e50a2;" color="#1e50a2"&gt;http://improve.dk/blog/2009/09/23/iis-request-filtering-woes&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Fixing Flash bugs and intercepting IIS Application Request Routing cookies :&lt;a href="http://improve.dk/blog/2009/12/09/fixing-flash-bugs-by-intercepting-iis-application-request-routing-cookies" target="_blank"&gt;&lt;span style="color: #1e50a2;" color="#1e50a2"&gt;http://improve.dk/blog/2009/12/09/fixing-flash-bugs-by-intercepting-iis-application-request-routing-cookies&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;转自：&lt;a href="http://www.cnblogs.com/shanyou/archive/2010/02/18/1669265.html"&gt;http://www.cnblogs.com/shanyou/archive/2010/02/18/1669265.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2191729.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/26/2191729.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/EasyLive2006/archive/2011/09/25/2190215.html</id><title type="text">T4模板技术相关 from artech</title><summary type="text">一、我们的目标是：从XML文件到C#代码再次重申一下我们需要通过“代码生成”需要达到的目的。无论对于怎么样的应用，我们都需要维护一系列的消息。消息的类型很多，比如验证消息、确认消息、日志消息等。我们一般会将消息储存在一个文件或者数据库中进行维护，并提供一些API来获取相应的消息项。这些API一般都是基于消息的ID来获取的，换句话说，消息获取的方式是以一种“弱类型”的编程方式实现的。如果我们能够根据消息存储的内容动态地生成相应的C#或者VB.NET代码，那么我们就能够以一种强类型的方式来获取相应的消息项了。比如说，现在我们定义了如下一个MessageEntry类型来表示一个消息条目。为了简单，我</summary><published>2011-09-25T05:45:00Z</published><updated>2011-09-25T05:45:00Z</updated><author><name>KidYang</name><uri>http://www.cnblogs.com/EasyLive2006/</uri></author><link rel="alternate" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/25/2190215.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/25/2190215.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: medium;" size="4"&gt;&lt;span style="font-weight: bold;"&gt;一、我们的目标是：从XML文件到C#代码&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再次重申一下我们需要通过&amp;ldquo;代码生成&amp;rdquo;需要达到的目的。无论对于怎么样的应用，我们都需要维护一系列的消息。消息的类型很多，比如验证消息、确认消息、日志消息等。我们一般会将消息储存在一个文件或者数据库中进行维护，并提供一些API来获取相应的消息项。这些API一般都是基于消息的ID来获取的，换句话说，消息获取的方式是以一种&amp;ldquo;&lt;span style="color: #ff0000;" color="#ff0000"&gt;弱类型&lt;/span&gt;&amp;rdquo;的编程方式实现的。&lt;span style="color: #ff0000;" color="#ff0000"&gt;如果我们能够根据消息存储的内容动态地生成相应的C#或者VB.NET代码，那么我们就能够以一种强类型的方式来获取相应的消息项了&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;比如说，现在我们定义了如下一个MessageEntry类型来表示一个消息条目。为了简单，我们尽量简化MessageEntry的定义，仅仅保留三个属性Id、Value和Category。Category表示该消息条目所属的类型，你可以根据具体的需要对其分类（比如根据模块名称或者Severity等）。Value是一个消息真实的内容，可以包含一些占位符（{0}，{1},&amp;hellip;{N}）。通过指定占位符对用的值，最中格式化后的文本通过Format返回。&lt;/p&gt;&#xD;
&lt;div style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;" id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MessageEntry&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Id { get; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Value { get; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Category { get; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum6"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; MessageEntry(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; id, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; category)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum8"&gt;   8:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum9"&gt;   9:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Id         = id;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Value      = &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Category   = category;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum12"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Format(&lt;span style="color: #0000ff;"&gt;params&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;[] args)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum14"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum15"&gt;  15:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Value, args);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum16"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum17"&gt;  17:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;现在我们所有的消息定义在如下一个XML文件中，&amp;lt;message&amp;gt;XML元素代码一个具体的MessageEntry，相应的属性（Attribute）和MessageEntry的属性（Property）相对应。&lt;/p&gt;&#xD;
&lt;div style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;" id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000;"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1.0"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="utf-8"&lt;/span&gt; ?&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;messages&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum3"&gt;   3:&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;message&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="MandatoryField"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="The {0} is mandatory."&lt;/span&gt;  &lt;span style="color: #ff0000;"&gt;category&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Validation"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum4"&gt;   4:&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;message&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="GreaterThan"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="The {0} must be greater than {1}."&lt;/span&gt;  &lt;span style="color: #ff0000;"&gt;category&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Validation"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum5"&gt;   5:&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;message&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="ReallyDelete"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Do you really want to delete the {0}."&lt;/span&gt;  &lt;span style="color: #ff0000;"&gt;category&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Confirmation"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;messages&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在上面的XML中，定义了两个类别（Validation和Confirmation）的三条MessageEntry。&lt;span style="color: #ff0000;" color="#ff0000"&gt;我们需要通过我们的代码生成工具生成一个包含如下C#代码的CS文件&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;div style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;" id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&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; Messages&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum3"&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; Validation&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum4"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum5"&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; MessageEntry MandatoryField = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MessageEntry(&lt;span style="color: #006080;"&gt;"MandatoryField"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"The {0} is mandatory."&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"Validation"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum6"&gt;   6:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; MessageEntry GreaterThan = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MessageEntry(&lt;span style="color: #006080;"&gt;"GreaterThan"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"The {0} must be greater than {1}."&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"Validation"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum7"&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum8"&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; Confirmation&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum9"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; MessageEntry ReallyDelete = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MessageEntry(&lt;span style="color: #006080;"&gt;"ReallyDelete"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"Do you really want to delete the {0}."&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"Confirmation"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum11"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum12"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;那么如何通过T4的方式来实现从&amp;ldquo;数据&amp;rdquo;（XML）到&amp;ldquo;代码&amp;rdquo;的转换呢？在投入到这个稍微复杂的工作之前，我们先来弄个简单的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;" size="4"&gt;&lt;span style="font-weight: bold;"&gt;二、从Hello World讲起&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们之前一直在讲T4，可能还有人不知道T4到底代表什么。T4是对&amp;ldquo;&lt;span style="color: #ff0000;" color="#ff0000"&gt;Text Template Transformation Toolkit&lt;/span&gt;&amp;rdquo;（4个T）的简称。T4直接包含在VS2008和VS2010中，是一个基于文本文件转换的工具包。T4的核心是一个基于&amp;ldquo;文本模板&amp;rdquo;的转换引擎（以下简称&lt;span style="color: #ff0000;" color="#ff0000"&gt;T4引擎&lt;/span&gt;），我们可以通过它生成一切类型的文本型文件，比如我们常用的代码文件类型包括：C#、VB.NET、T-SQL、XML甚至是配置文件等。&lt;/p&gt;&#xD;
&lt;p&gt;对于需要通过T4来进行代码生成工作的我们来说，需要做的仅仅是根据转换源（Transformation Source），比如数据表、XML等（由于例子简单，HelloWord模板没有输入源）和目标文本（比如最终需要的C#或者T-SQL代码等）定义相应的模板。T4模板作用就&lt;span style="color: #ff0000;" color="#ff0000"&gt;相当于进行XML转化过程中使用的XSLT&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;T4模板的定义非常简单，整个模板的内容包括两种形式：&lt;span style="color: #ff0000;" color="#ff0000"&gt;静态形式&lt;/span&gt;和&lt;span style="color: #ff0000;" color="#ff0000"&gt;动态动态&lt;/span&gt;。前者就是直接写在模板中作为&lt;span style="color: #ff0000;" color="#ff0000"&gt;原样输出&lt;/span&gt;的文本，后者是基于某种语言编写代码，T4引擎会动态执行它们。这和我们通过&lt;span style="color: #ff0000;" color="#ff0000"&gt;内联的方式编写的ASP.NET页面&lt;/span&gt;很相似：HTML是静态的，以C#或者VB.NET代码便写的动态执行的代码通过相应的标签内嵌其中。为了让读者对T4模板有一个直观的认识，我们先来尝试写一个最简单的。假设我们需要通过代码生成的方式生成如下一段简单的C#代码：&lt;/p&gt;&#xD;
&lt;div style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;" id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum2"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; Artech.CodeGeneration&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum4"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Program&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum6"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum7"&gt;   7:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum8"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum9"&gt;   9:&lt;/span&gt;             Console.WriteLine(&lt;span style="color: #006080;"&gt;"Hello, {0}"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"Foo"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum10"&gt;  10:&lt;/span&gt;             Console.WriteLine(&lt;span style="color: #006080;"&gt;"Hello, {0}"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"Bar"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum11"&gt;  11:&lt;/span&gt;             Console.WriteLine(&lt;span style="color: #006080;"&gt;"Hello, {0}"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"Baz"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum12"&gt;  12:&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum13"&gt;  13:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum14"&gt;  14:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;现在我们直接通过VS来创建一个T4模板来生成我们期望的C#代码。右击项目文件，选择"Add"|"New Item",在模板列表中选择&lt;span style="color: #ff0000;" color="#ff0000"&gt;"Text Template"&lt;/span&gt;。指定文件名后确定，一个后缀名为.&lt;span style="color: #ff0000;" color="#ff0000"&gt;tt&lt;/span&gt;的文件会被创建，然后在该文件中编写如下的代码。&lt;/div&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&lt;/span&gt; &amp;lt;#@ template debug=&lt;span style="color: #006080;"&gt;"false"&lt;/span&gt; hostspecific=&lt;span style="color: #006080;"&gt;"false"&lt;/span&gt; language=&lt;span style="color: #006080;"&gt;"C#"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum2"&gt;   2:&lt;/span&gt; &amp;lt;#@ assembly name=&lt;span style="color: #006080;"&gt;"System.Core.dll"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum3"&gt;   3:&lt;/span&gt; &amp;lt;#@ import &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;=&lt;span style="color: #006080;"&gt;"System"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum4"&gt;   4:&lt;/span&gt; &amp;lt;#@ output extension=&lt;span style="color: #006080;"&gt;".cs"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum6"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; Artech.CodeGeneration&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum8"&gt;   8:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Program&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum10"&gt;  10:&lt;/span&gt;     {     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum12"&gt;  12:&lt;/span&gt;         {    &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum13"&gt;  13:&lt;/span&gt;             &amp;lt;#&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum14"&gt;  14:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;(var person &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.InitializePersonList()) &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum15"&gt;  15:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum16"&gt;  16:&lt;/span&gt;             #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum17"&gt;  17:&lt;/span&gt;                 Console.WriteLine(&lt;span style="color: #006080;"&gt;"Hello, {0}"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"&amp;lt;#=  person#&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum18"&gt;  18:&lt;/span&gt;             &amp;lt;#&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum19"&gt;  19:&lt;/span&gt;             } &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum20"&gt;  20:&lt;/span&gt;             #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum21"&gt;  21:&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum22"&gt;  22:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum23"&gt;  23:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum24"&gt;  24:&lt;/span&gt;  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum25"&gt;  25:&lt;/span&gt; &amp;lt;#+ &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum26"&gt;  26:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] InitializePersonList()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum27"&gt;  27:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum28"&gt;  28:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[]{&lt;span style="color: #006080;"&gt;"Foo"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"Bar"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"Baz"&lt;/span&gt;};&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum29"&gt;  29:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum30"&gt;  30:&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;保存该文件后，一个.cs文件将会作为该TT文件的附属文件被添加（如右图所示的HelloWorld.cs）。上述的这个TT文件虽然简单，却包含了构成一个T4模板的基本元素。在解读该T4模板之前，我们有必要先来了解一个完整的T4模板是如何构成的。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;" size="4"&gt;&lt;span style="font-weight: bold;"&gt;三、T4模板的基本结构&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;假设我们用&amp;ldquo;块&amp;rdquo;（Block）来表示构成T4模板的基本单元，它们基本上可以分成5类：&lt;span style="color: #ff0000;" color="#ff0000"&gt;指令块（Directive Block）&lt;/span&gt;、&lt;span style="color: #ff0000;" color="#ff0000"&gt;文本块（Text Block）&lt;/span&gt;、&lt;span style="color: #ff0000;" color="#ff0000"&gt;代码语句块（Statement Block）&lt;/span&gt;、&lt;span style="color: #ff0000;" color="#ff0000"&gt;表达式块（Expression Block）&lt;/span&gt;和&lt;span style="color: #ff0000;" color="#ff0000"&gt;类特性块（Class Feature Block）&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、指令块（Directive Block）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;和ASP.NET页面的指令一样，它们出现在文件头，通过&lt;span style="color: #ff0000;" color="#ff0000"&gt;&amp;lt;#@&amp;hellip;#&amp;gt;&lt;/span&gt;表示。其中&amp;lt;#@ template &amp;hellip;#&amp;gt;指令是必须的，用于定义模板的基本属性，比如编程语言、基于的文化、是否支持调式等等。比较常用的指令还包括用于程序集引用的&amp;lt;#@ assembly&amp;hellip;#&amp;gt;，用于导入命名空间的&amp;lt;#@ import&amp;hellip;#&amp;gt;等等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、文本块（Text Block）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;文本块就是直接原样输出的静态文本，不需要添加任何的标签。在上面的模板文件中，处理定义在&amp;lt;#&amp;hellip; #&amp;gt;、&amp;lt;#+&amp;hellip; #&amp;gt;和&amp;lt;#=&amp;hellip; #&amp;gt;中的文本都属于文本块。比如在指令块结束到第一个&amp;ldquo;&amp;lt;#&amp;rdquo;标签之间的内容就是一段静态的文本块。&lt;/p&gt;&#xD;
&lt;div style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;" id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum2"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; Artech.CodeGeneration&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum4"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Program&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum6"&gt;   6:&lt;/span&gt;     {     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum7"&gt;   7:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum8"&gt;   8:&lt;/span&gt;         {    &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum9"&gt;   9:&lt;/span&gt;             &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、代码语句块（Statement Block）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;代码语句块通过&lt;span style="color: #ff0000;" color="#ff0000"&gt;&amp;lt;#Statement#&amp;gt;&lt;/span&gt;的形式表示，中间是一段通过相应编程语言编写的程序调用，我们可以通过代码语句快控制文本转化的流程。在上面的代码中，我们通过代码语句块实现对一个数组进行遍历，输出重复的Console.WriteLine(&amp;ldquo;Hello, {0}&amp;rdquo;, &amp;ldquo;Xxx&amp;rdquo;)语句。&lt;/p&gt;&#xD;
&lt;div style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;" id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&lt;/span&gt; &amp;lt;#&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;(var person &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.InitializePersonList()) &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum4"&gt;   4:&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum5"&gt;   5:&lt;/span&gt;     Console.Write(&lt;span style="color: #006080;"&gt;"Hello, {0}"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"&amp;lt;#=  person#&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum6"&gt;   6:&lt;/span&gt; &amp;lt;#&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum7"&gt;   7:&lt;/span&gt; } &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum8"&gt;   8:&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4、表达式块（Expression Block）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;表达式块以&lt;span style="color: #ff0000;" color="#ff0000"&gt;&amp;lt;#=Expression#&amp;gt;&lt;/span&gt;的形式表示，通过它之际上动态的解析的字符串表达内嵌到输出的文本中。比如在上面的foreach循环中，每次迭代输出的人名就是通过表达式块的形式定义的（&amp;lt;#= person#&amp;gt;）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5、类特性块（Class Feature Block）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果文本转化需要一些比较复杂的逻辑，我们需要写在一个单独的辅助方法中，甚至是定义一些单独的类，我们就是将它们定义在类特性块中。类特性块的表现形式为&lt;span style="color: #ff0000;" color="#ff0000"&gt;&amp;lt;#+ FeatureCode #&amp;gt;，&lt;/span&gt;对于Hello World模板，得到人名列表的InitializePersonList方法就定义在类特性块中。&lt;/p&gt;&#xD;
&lt;div style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;" id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&lt;/span&gt; &amp;lt;#+ &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum2"&gt;   2:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] InitializePersonList()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum3"&gt;   3:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum4"&gt;   4:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[]{&lt;span style="color: #006080;"&gt;"Foo"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"Bar"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"Baz"&lt;/span&gt;};&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum5"&gt;   5:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum6"&gt;   6:&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;了解T4模板的&amp;ldquo;五大块&amp;rdquo;之后，相信读者对定义在HelloWord.tt中的模板体现的文本转化逻辑应该和清楚了吧。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: medium;" size="4"&gt;&lt;span style="font-weight: bold;"&gt;四、通过T4模板实现从&amp;ldquo;数据到代码&amp;rdquo;的转变&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在我们来完成我们开篇布置得任务：如何将一个已知结构的表示消息列表的XML转换成C#代码，使得我们可以一强类型的编程方式获取和格式化相应的消息条目。我们的T4模板定义如下&lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&lt;/span&gt; &amp;lt;#@ template debug=&lt;span style="color: #006080;"&gt;"false"&lt;/span&gt; hostspecific=&lt;span style="color: #006080;"&gt;"true"&lt;/span&gt; language=&lt;span style="color: #006080;"&gt;"C#"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum2"&gt;   2:&lt;/span&gt; &amp;lt;#@ assembly name=&lt;span style="color: #006080;"&gt;"System.Core.dll"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum3"&gt;   3:&lt;/span&gt; &amp;lt;#@ assembly name=&lt;span style="color: #006080;"&gt;"System.Xml"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum4"&gt;   4:&lt;/span&gt; &amp;lt;#@ import &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;=&lt;span style="color: #006080;"&gt;"System"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum5"&gt;   5:&lt;/span&gt; &amp;lt;#@ import &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;=&lt;span style="color: #006080;"&gt;"System.Xml"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum6"&gt;   6:&lt;/span&gt; &amp;lt;#@ import &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;=&lt;span style="color: #006080;"&gt;"System.Linq"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum7"&gt;   7:&lt;/span&gt; &amp;lt;#@ output extension=&lt;span style="color: #006080;"&gt;".cs"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum8"&gt;   8:&lt;/span&gt;  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MessageCodeGenrator&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum10"&gt;  10:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum11"&gt;  11:&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; Messages&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum12"&gt;  12:&lt;/span&gt;     {    &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum13"&gt;  13:&lt;/span&gt;         &amp;lt;# &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum14"&gt;  14:&lt;/span&gt;         XmlDocument messageDoc = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; XmlDocument();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum15"&gt;  15:&lt;/span&gt;         messageDoc.Load(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Host.ResolvePath(&lt;span style="color: #006080;"&gt;"Messages.xml"&lt;/span&gt;));&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum16"&gt;  16:&lt;/span&gt;       &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum17"&gt;  17:&lt;/span&gt;         var messageEntries = messageDoc.GetElementsByTagName(&lt;span style="color: #006080;"&gt;"message"&lt;/span&gt;).Cast&amp;lt;XmlElement&amp;gt;();  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum18"&gt;  18:&lt;/span&gt;         var categories = (from element &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; messageEntries&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum19"&gt;  19:&lt;/span&gt;                             select element.Attributes[&lt;span style="color: #006080;"&gt;"category"&lt;/span&gt;].Value).Distinct();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (var category &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; categories)  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum21"&gt;  21:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum22"&gt;  22:&lt;/span&gt;             #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum23"&gt;  23:&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; &amp;lt;#=  category#&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum24"&gt;  24:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum25"&gt;  25:&lt;/span&gt;                 &amp;lt;#&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum26"&gt;  26:&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (var element &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; messageDoc.GetElementsByTagName(&lt;span style="color: #006080;"&gt;"message"&lt;/span&gt;).Cast&amp;lt;XmlElement&amp;gt;().Where(element =&amp;gt; element.Attributes[&lt;span style="color: #006080;"&gt;"category"&lt;/span&gt;].Value == category))  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum27"&gt;  27:&lt;/span&gt;                 {                      &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum28"&gt;  28:&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; id           = element.Attributes[&lt;span style="color: #006080;"&gt;"id"&lt;/span&gt;].Value;  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum29"&gt;  29:&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;        = element.Attributes[&lt;span style="color: #006080;"&gt;"value"&lt;/span&gt;].Value;  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum30"&gt;  30:&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; categotry    = element.Attributes[&lt;span style="color: #006080;"&gt;"category"&lt;/span&gt;].Value;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum31"&gt;  31:&lt;/span&gt;                 #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum32"&gt;  32:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; MessageEntry &amp;lt;#= id #&amp;gt; = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MessageEntry(&lt;span style="color: #006080;"&gt;"&amp;lt;#= id #&amp;gt;"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"&amp;lt;#=  value#&amp;gt;"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"&amp;lt;#=  categotry#&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum33"&gt;  33:&lt;/span&gt;             &amp;lt;#  } #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum34"&gt;  34:&lt;/span&gt;             }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum35"&gt;  35:&lt;/span&gt;     &amp;lt;# } #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum36"&gt;  36:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum37"&gt;  37:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;模板体现出来的转化流程就是：加载XML文件（Messages.xml），然后获取所有的消息类别，为每个消息类别创建一个内嵌于静态类Messages中的以类别命名的类。然后遍历每个类别下的所有消息条目，定义类型为MessageEntry的静态熟悉。&lt;/p&gt;&#xD;
&lt;p&gt;在这里有一点需要特别指出的是：整个代码生成的输入，即XML文件Messages.xml和模板文件位于相同的目录下，但是我们需要通过&lt;span style="color: #ff0000;" color="#ff0000"&gt;Host&lt;/span&gt;属性的&lt;span style="color: #ff0000;" color="#ff0000"&gt;ResolvePath&lt;/span&gt;方法去解析文件的物理路径。对ResolvePath方法的调用，需要模板&amp;lt;#@ template &amp;hellip;#&amp;gt;指令中的&lt;span style="color: #ff0000;" color="#ff0000"&gt;hostspecific&lt;/span&gt;设置为&lt;span style="color: #ff0000;" color="#ff0000"&gt;true&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;div style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;" id="codeSnippetWrapper"&gt;&#xD;
&lt;div style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;" id="codeSnippet"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #606060;" id="lnum1"&gt;   1:&lt;/span&gt; &amp;lt;#@ template debug=&lt;span style="color: #006080;"&gt;"false"&lt;/span&gt; hostspecific=&lt;span style="color: #006080;"&gt;"true"&lt;/span&gt; language=&lt;span style="color: #006080;"&gt;"C#"&lt;/span&gt; #&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;" size="4"&gt;&lt;span style="font-weight: bold;"&gt;五、T4的文本转化的实现&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;和我之前采用的代码生成方式（CodeDOM+Custom Tool）一样，对于T4模板的代码生成，VS最终还是通过Custom Tool来完成的。如果你查看TT文件的属性，你会发现Custom Tool会自动设置成：&lt;span style="color: #ff0000;" color="#ff0000"&gt;TextTemplatingFileGenerator&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/artech/Windows-Live-Writer/bd655a7b587b_C6C7/image_12.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/artech/Windows-Live-Writer/bd655a7b587b_C6C7/image_thumb_4.png" width="390" height="255" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当TextTemplatingFileGenerator被触发后（修改后的文件被保存，或者认为执行Custom Tool），会通过T4引擎完成文本的转换和输出工作。具体来讲，T4引擎的文本转化和输出机制可以通过下图来表示。T4引擎首先对模板的静态内容和动态内容进行解析，最终生成一个继承自&lt;a href="http://msdn2.microsoft.com/en-us/bb126526"&gt;&lt;span style="color: #ff6600;" color="#ff6600"&gt;Microsoft.VisualStudio.TextTemplating.TextTransformation&lt;/span&gt;&lt;/a&gt;的类，所有的文本转化逻辑被放入被重写的Transformation方法中。然后动态创建该对象，执行该方法并将最终的类型以附加文件的形式输出来。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文转自蒋金楠：&lt;a href="http://www.cnblogs.com/artech/archive/2010/10/23/1859529.html"&gt;http://www.cnblogs.com/artech/archive/2010/10/23/1859529.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/EasyLive2006/aggbug/2190215.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/EasyLive2006/archive/2011/09/25/2190215.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
