<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-小庄</title><link>http://www.cnblogs.com/xiaozhuang/</link><description>Linq  WCF Silverlight Ajax  ExtJS.......</description><language>zh-cn</language><lastBuildDate>Thu, 28 Aug 2008 06:55:31 GMT</lastBuildDate><pubDate>Thu, 28 Aug 2008 06:55:31 GMT</pubDate><ttl>60</ttl><item><title>Asp.Net开发架构设计（二）</title><link>http://www.cnblogs.com/xiaozhuang/archive/2008/08/21/1272963.html</link><dc:creator>小庄</dc:creator><author>小庄</author><pubDate>Thu, 21 Aug 2008 03:29:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaozhuang/archive/2008/08/21/1272963.html</guid><wfw:comment>http://www.cnblogs.com/xiaozhuang/comments/1272963.html</wfw:comment><comments>http://www.cnblogs.com/xiaozhuang/archive/2008/08/21/1272963.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaozhuang/comments/commentRss/1272963.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaozhuang/services/trackbacks/1272963.html</trackback:ping><description><![CDATA[摘要: 上回说到，我们配置了一下UnityConfig层，在这个层中定义了一个IContainerAccessor的接口和一个返回IUnityContainer类型的方法，这个方法的主要作用就是把Service层中的接口类和Business层中的接口实现类装配到UnityContainer中并返回，也就是指定那个接口实现类去实现某个接口类（晕，好像有点绕口啊）。Xiaozhuang.UnityConfig&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaozhuang/archive/2008/08/21/1272963.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaozhuang/aggbug/1272963.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41937/" target="_blank">[新闻]Google拟在9月发布自有浏览器 或采用火狐内核</a>]]></description></item><item><title>Asp.Net开发架构设计(一)</title><link>http://www.cnblogs.com/xiaozhuang/archive/2008/08/15/1268907.html</link><dc:creator>小庄</dc:creator><author>小庄</author><pubDate>Fri, 15 Aug 2008 10:08:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaozhuang/archive/2008/08/15/1268907.html</guid><wfw:comment>http://www.cnblogs.com/xiaozhuang/comments/1268907.html</wfw:comment><comments>http://www.cnblogs.com/xiaozhuang/archive/2008/08/15/1268907.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaozhuang/comments/commentRss/1268907.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaozhuang/services/trackbacks/1268907.html</trackback:ping><description><![CDATA[<p>
<p>&nbsp;</p>
<span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 这几天园子里关于软件架构的讨论还是相当激烈，大家都想要一种能最大限度的降低各层之间依赖关系的的架构来适应变化的需求，谁都不喜欢改一点而动全身，尽量降低各层的改动产生的相互影响。</span>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">本篇我以理论和实践（源代码）两个方面和大家探讨一下我的方案，希望大家多提宝贵意见。</span></p>
<p><span style="font-family: 宋体">一、软件架构的概念问题，什么是软件的架构</span>?<span style="font-family: 宋体">我的理解是：软件的架构包括两个方面的内容，一个是软件的开发架构，一个是软件的部署架构，所谓部署架构就是指部署时的分布式，集群等设计问题；开发架构就是我们平常说的软件分层设计问题，也就是我们今天要谈的问题。</span></p>
<p><span style="font-family: 宋体">二、何谓分层？分层的方式有几种？分层也就是把一个大的软件解决方案分成多个项目进行开发，分为三种，一种是按照代码的功能层次进行分层，分为数据库访问层，业务逻辑层，</span>UI<span style="font-family: 宋体">层等，一种是按照要实现的功能模块进行分层，例如新闻管理层，博客管理层等，第三种就是把前两者结合起来进行分层：先按照代码功能划分好层次，然后再在每一层中分层成各个功能模块。</span></p>
<p><span style="font-family: 宋体">三、面向接口能够降低各层之间的依赖关系吗？还需要什么？面向接口只是把对对象的直接调用转到了对接口的调用身上，但对接口的调用也需要对象的实例化为前提，因为有对象实例化的存在，所以接口并不能屏蔽掉背后的对象来完成功能；在这种情况下，依赖注入</span>/<span style="font-family: 宋体">控制反转等概念应运而生，</span>IOC<span style="font-family: 宋体">容器出现了，它能够让对象自动实例化，并管理对象的生存空间。</span></p>
<p><span style="font-family: 宋体">四、说了这么多，到底应该怎样分？我们不妨从软件的开发过程上来考虑，做软件的都知道我们要进行需求分析，要有需求分析文档，需求分析的任务就是把客户的需求转变为对软件功能的需求，主要内容包括：软件要实现那些功能模块，每个功能模块下包含哪些业务操作，这些业务操作需要哪些页面（或者窗口）支持，这些页面大概都是什么样子的，上面都有什么？有了这些信息，我们就可以开始我们的系统设计了。</span></p>
<p><span style="font-family: 宋体">我的方案中各个项目的引用关系如下：</span></p>
<p>&nbsp;&nbsp;<img height="322" alt="" src="http://images.cnblogs.com/cnblogs_com/xiaozhuang/BlogsImages/Images20080815/1.JPG" width="463" border="0" />&nbsp;</p>
<p><span style="font-family: 宋体">说明：</span></p>
<p>Web<span style="font-family: 宋体">：</span>UI<span style="font-family: 宋体">层，</span>Asp.net Web<span style="font-family: 宋体">应用程序项目，提供用户界面。</span></p>
<p>UnityConfig<span style="font-family: 宋体">：依赖注入配置层，类库项目，对</span>Service<span style="font-family: 宋体">层和</span>Business<span style="font-family: 宋体">层进行实现配置以提供给</span>Web<span style="font-family: 宋体">调用</span>Service<span style="font-family: 宋体">层。</span></p>
<p>Service<span style="font-family: 宋体">：为</span>Web<span style="font-family: 宋体">层提供服务，类库项目，里面全是接口。</span></p>
<p>Business<span style="font-family: 宋体">：商业逻辑层，通过调用</span>DA<span style="font-family: 宋体">数据访问层和</span>Entities<span style="font-family: 宋体">层来实现</span>Service<span style="font-family: 宋体">层的服务接口。类库项目。</span></p>
<p>Entities<span style="font-family: 宋体">：实体层，类库项目，存放业务实体，贫血型实体。</span></p>
<p><span style="font-family: 宋体">请注意：在上面的引用关系中，</span>Web<span style="font-family: 宋体">层并没有直接引用</span>Business<span style="font-family: 宋体">层。</span></p>
<p><span style="font-family: 宋体">现在假设我们有这样一个需求文档：它只需要实现一个功能模块，就是查找并显示雇员列表。页面形式如图：</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><img style="width: 596px; height: 137px" height="137" alt="" src="http://images.cnblogs.com/cnblogs_com/xiaozhuang/BlogsImages/Images20080815/2.JPG" width="596" border="0" /></span></p>
<p><span style="font-family: 宋体">首先我们根据需求，先设计服务，因为只有一个功能模块，所以我们只需要一个接口类，再因为只有一个操作功能（查找），所以我们只需要一个服务方法，那么我们在</span>Service<span style="font-family: 宋体">层建立一个接口类：</span>IQueryEmployeeService<span style="font-family: 宋体">，并添加一个接口方法：</span>QueryEmployee.</p>
<p><span style="font-family: 宋体">根据页面所示，我们这个服务方法需要两个对象参数，一个是查找的条件，一个是查找的结果；这样我们就得到了两个实体类。在</span>Entities<span style="font-family: 宋体">建立分别命名为</span>QueryEntry<span style="font-family: 宋体">和</span>ListEntry<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">代码如下：</span></p>
<p align="left"><span style="font-size: 9pt; color: blue; font-family: 新宋体">namespace</span><span style="font-size: 9pt; font-family: 新宋体"> Xiaozhuang.Service</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">{</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">interface</span> <span style="color: #2b91af">IQueryEmployeeService</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span> <span style="color: gray">&lt;summary&gt;</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span> </span><span style="font-size: 9pt; color: green; font-family: 新宋体">查询雇员信息</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span> <span style="color: gray">&lt;/summary&gt;</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span> <span style="color: gray">&lt;param name="queryentity"&gt;&lt;/param&gt;</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span> <span style="color: gray">&lt;returns&gt;&lt;/returns&gt;</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">ListEntry</span>&gt; QueryEmployee(<span style="color: #2b91af">QueryEntry</span> queryentry);</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">}</span></p>
<p align="left"><span style="font-size: 9pt; color: blue; font-family: 新宋体">namespace</span><span style="font-size: 9pt; font-family: 新宋体"> Xiaozhuang.Entities</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">{</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">QueryEntry</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> DepartmentID { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> EmployeeName { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> EmployeeAge { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> ToString()</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #a31515">"DeaprtmentID:"</span> + DepartmentID + <span style="color: #a31515">"EmployeeName:"</span> + EmployeeName + <span style="color: #a31515">"EmployeeAge:"</span> + EmployeeAge;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">}</span></p>
<p align="left"><span style="font-size: 9pt; color: blue; font-family: 新宋体">namespace</span><span style="font-size: 9pt; font-family: 新宋体"> Xiaozhuang.Entities</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">{</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">ListEntry</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> EmployeeID { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> EmployeeName { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> EmployeeSex { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">int</span> EmployeeAge { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> DepartmentName { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> MobilePhone { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> ToString()</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #a31515">"EmployeeID:"</span> + EmployeeID + <span style="color: #a31515">"EmployeeName:"</span> + EmployeeName + <span style="color: #a31515">"EmployeeSex:"</span> + EmployeeSex;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">}</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">请注意，业务实体的设计完全是参照页面而来，对实体字段类型的设计也是参照页面而来，多数都是String类型，因为这个时候并不知道打算在数据库中怎么存储这些数据。</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">当然在实际的项目中，因为那个部门列表还需要建立部门的业务实体，这里简单其间略去，有了这些业务实体和服务接口，我们就可以设计数据库了，数据库设计完成后，系统设计的工作就完成了。</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">接下来就是在Business层具体的实现这个查找的方法了：</span></p>
<p align="left"><span style="font-size: 9pt; color: blue; font-family: 新宋体">namespace</span><span style="font-size: 9pt; font-family: 新宋体"> Xiaozhuang.Business</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">{</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">QueryEmployeeBusiness</span> :<span style="color: #2b91af">IQueryEmployeeService</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; color: blue; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #region</span><span style="font-size: 9pt; font-family: 新宋体"> IQueryEmployeeService </span><span style="font-size: 9pt; font-family: 新宋体">成员</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">ListEntry</span>&gt; QueryEmployee(<span style="color: #2b91af">QueryEntry</span> queryentry)</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">ListEntry</span>&gt; listEntry = <span style="color: blue">new</span> <span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">ListEntry</span>&gt;();</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">ListEntry</span> entry1 = <span style="color: blue">new</span> <span style="color: #2b91af">ListEntry</span>() { EmployeeID = <span style="color: #a31515">"1"</span>, EmployeeName = <span style="color: #a31515">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: 新宋体">雇员1"</span><span style="font-size: 9pt; font-family: 新宋体">, EmployeeSex = <span style="color: #a31515">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: 新宋体">男"</span><span style="font-size: 9pt; font-family: 新宋体">, DepartmentName = <span style="color: #a31515">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: 新宋体">部门1"</span><span style="font-size: 9pt; font-family: 新宋体">, EmployeeAge = 30, MobilePhone = <span style="color: #a31515">"123546789"</span> };</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">ListEntry</span> entry2 = <span style="color: blue">new</span> <span style="color: #2b91af">ListEntry</span>() { EmployeeID = <span style="color: #a31515">"2"</span>, EmployeeName = <span style="color: #a31515">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: 新宋体">雇员2"</span><span style="font-size: 9pt; font-family: 新宋体">, EmployeeSex = <span style="color: #a31515">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: 新宋体">女"</span><span style="font-size: 9pt; font-family: 新宋体">, DepartmentName = <span style="color: #a31515">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: 新宋体">部门2"</span><span style="font-size: 9pt; font-family: 新宋体">, EmployeeAge = 29, MobilePhone = <span style="color: #a31515">"123546789"</span> };</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listEntry.Add(entry1);</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listEntry.Add(entry2);</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> listEntry;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; color: blue; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endregion</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">}</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">此处略去从数据库查询的方法，可以用Linq to sql 实现或者其他Orm工具。</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">接下来配置一下我们的UnityConfig层，就可以在Web层访问这个查找雇员的服务了。</span></p>
<p align="left"><span style="font-size: 9pt; color: blue; font-family: 新宋体">namespace</span><span style="font-size: 9pt; font-family: 新宋体"> Xiaozhuang.UnityConfig</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">{</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">interface</span> <span style="color: #2b91af">IContainerAccessor</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">IUnityContainer</span> Container { <span style="color: blue">get</span>; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">UnityContainerConfig</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: #2b91af">IUnityContainer</span> GetIUnityContainer()</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">IUnityContainer</span> container = <span style="color: blue">new</span> <span style="color: #2b91af">UnityContainer</span>();</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; container.RegisterType&lt;<span style="color: #2b91af">IQueryEmployeeService</span>, <span style="color: #2b91af">QueryEmployeeBusiness</span>&gt;();</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> container;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体">}</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">当然你也可以把这个配置写到Web。Config中。</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">接下来的问题就是怎样在Web层调用这个服务的问题了，这个问题其实还是比较复杂的，文章太长了大家都看烦了，我将在下次再详细说说这个问题。</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><br clear="all" />
</span>&nbsp;</p>
<p align="left">&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/xiaozhuang/aggbug/1268907.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41936/" target="_blank">[新闻]微软正在构思将Wi-Fi带入汽车</a>]]></description></item><item><title>两种AOP实现方式的性能比较</title><link>http://www.cnblogs.com/xiaozhuang/archive/2008/07/02/1234150.html</link><dc:creator>小庄</dc:creator><author>小庄</author><pubDate>Wed, 02 Jul 2008 09:06:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaozhuang/archive/2008/07/02/1234150.html</guid><wfw:comment>http://www.cnblogs.com/xiaozhuang/comments/1234150.html</wfw:comment><comments>http://www.cnblogs.com/xiaozhuang/archive/2008/07/02/1234150.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaozhuang/comments/commentRss/1234150.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaozhuang/services/trackbacks/1234150.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; AOP（Aspect-Oriented Programming，面向方面编程），它是OOP（Object-Oriented Programing，面向对象编程）的补充和完善。我们把软件系统分为两个部分：核心关注点和横切关注点。业务处理的主要流程是核心关注点，与之关系不大的部分是横切关注点。横切关注点的一个特点是，他们经常发生在核心关注点的多处，而各处都基本相似。比如权限认证、日志、异常捕获、事务处理、缓存等。</p>
<p>&nbsp;&nbsp; 目前在.Net下实现AOP的方式分为两大类：一是采用动态代理技术，利用截取消息的方式，对该消息进行装饰，以取代或修饰原有对象行为的执行；二是采用静态织入的方式，引入特定的语法创建&#8220;方面&#8221;，从而使得编译器可以在编译期间织入有关&#8220;方面&#8221;的代码。动态代理实现方式利用.Net的Attribute和.Net Remoting的代理技术，对对象执行期间的上下文消息进行截取，并以消息传递的方式执行，从而可以在执行期间加入相关处理逻辑实现面向方面的功能（请参考：<a title="http://www.cnblogs.com/wayfarer/articles/256909.html" href="http://www.cnblogs.com/wayfarer/articles/256909.html">http://www.cnblogs.com/wayfarer/articles/256909.html</a>）；而静态织入的方式实现一般是要依靠一些第三方框架提供特定的语法，例如PostSharp，它的实现方式是采用 MSIL Injection和MSBuild Task在编译时置入方面的代码，从而实现AOP。</p>
<p>PostSharp和基于 Dynamic Proxy 方式做个比较。 </p>
<p>1、由于采用 MSIL Injection，因此静态代码注入的执行效率要高于使用 Reflection Emit。 <br />
2、使用 MSBuild Task，使得开发人员可以像使用编译器内置 Attribute 那样使用 AOP。 <br />
3、可以拦截任意方法，而 Dynamic Proxy 方式的 AOP 往往采取继承方式来拦截 Virtual 方法。 <br />
4、拥有更多的控制权。包括中断执行流程，修改参数和返回值等等。 <br />
5、还可以拦截 Field Access、Exception 等操作。 <br />
6、无需将对象创建代码改成 "new proxy()"，更加透明。 <br />
7、可以使用通配符进行多重拦截匹配。 <br />
8、静态注入带来的问题更多的是注入代码的质量和调试复杂度。
<p>看了以上比较，让我对PostSharp佩服的五体投地，决定研究一下，既然执行效率要要比动态代理的方式高，我就想知道到底高多少？好让我忏悔以前使用动态代理方式的错误，并一心转到PostSharp上来。
<p>为此我写了一个Console程序，用StopWatch来查看两种AOP实现方式的耗时是多少，相差多少？这个Console程序在<a href="http://www.cnblogs.com/Files/xiaozhuang/AOPConsoleApplication.rar">此下载（vs2008）</a>，本来我以为肯定是PostSharp耗时少，但测试的结果大大出乎我的意料，如图：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/xiaozhuang/WindowsLiveWriter/AOP_DC64/aopconsole.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="208" alt="aopconsole" src="http://www.cnblogs.com/images/cnblogs_com/xiaozhuang/WindowsLiveWriter/AOP_DC64/aopconsole_thumb.jpg" width="604" border="0" /></a>
<p>其中用dotNet原生的动态代理方式耗时为14毫秒，而Postsharp实现方式的的耗时为79毫秒，最下面那个0毫秒的是无AOP时该方法的执行时间。如果把PostSharp实现放在动态代理实现的前面执行，PostSharp的耗时更多，而DotNet动态代理的方式耗时更少，我想这可能是因为dotnet运行环境对方法的运行参数进行了缓存所致，第二次运行比第一次运行更快一点。
<p>用Reflector查看Postsharp实现方式方法的源代码：
<pre>public <a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a> <strong><a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/AOPConsoleApplication.PostSharp.PostSharpTestClass/MyTestMethod(Int32,Int32,Int32&amp;):Int32">MyTestMethod</a></strong>(<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a> p1, <a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a> p2, out <a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a> p3)
{
// This item is obfuscated and can not be translated.
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a> <strong>~returnValue~4</strong>;
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Object">object</a>[] <strong>~arguments~6</strong>;
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs">MethodExecutionEventArgs</a> <strong>~laosEventArgs~7</strong>;
try
{
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Object">object</a>[] <strong>objArray1</strong> = new <a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Object">object</a>[3];
<a>objArray1</a>[0] = <a>p1</a>;
<a>objArray1</a>[1] = <a>p2</a>;
<a>~arguments~6</a> = <a>objArray1</a>;
<a>~laosEventArgs~7</a> = new <a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/.ctor(System.Reflection.MethodBase,Object,Object%5b%5d)">MethodExecutionEventArgs</a>(methodof(<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/AOPConsoleApplication.PostSharp.PostSharpTestClass">PostSharpTestClass</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/AOPConsoleApplication.PostSharp.PostSharpTestClass/MyTestMethod(Int32,Int32,Int32&amp;):Int32">MyTestMethod</a>, <a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/AOPConsoleApplication.PostSharp.PostSharpTestClass">PostSharpTestClass</a>), this, <a>~arguments~6</a>);
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/~PostSharp~Laos~Implementation">~PostSharp~Laos~Implementation</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/~PostSharp~Laos~Implementation/PostSharpPerformanceTestAttribute~1:AOPConsoleApplication.PostSharp.CutomAttribute.PostSharpPerformanceTestAttribute">PostSharpPerformanceTestAttribute~1</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.IOnMethodBoundaryAspect/OnEntry(PostSharp.Laos.MethodExecutionEventArgs)">OnEntry</a>(<a>~laosEventArgs~7</a>);
if (<a>~laosEventArgs~7</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/get_FlowBehavior():PostSharp.Laos.FlowBehavior">get_FlowBehavior</a>() == 3)
{
<a>~returnValue~4</a> = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>~laosEventArgs~7</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/get_ReturnValue():Object">get_ReturnValue</a>();
<a>~arguments~6</a>[2] = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>p3</a>;
return <a>~returnValue~4</a>;
}
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a> <strong>tempint</strong> = 0;
for (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a> <strong>i</strong> = 1; <a>i</a> &lt;= 100; <a>i</a>++)
{
<a>tempint</a> += <a>i</a>;
}
<a>p3</a> = <a>tempint</a>;
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a> <strong>CS$1$0000</strong> = <a>p1</a> + <a>p2</a>;
<a>~returnValue~4</a> = <a>CS$1$0000</a>;
<a>~arguments~6</a>[2] = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>p3</a>;
<a>~laosEventArgs~7</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/set_ReturnValue(Object)">set_ReturnValue</a>(<a>~returnValue~4</a>);
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/~PostSharp~Laos~Implementation">~PostSharp~Laos~Implementation</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/~PostSharp~Laos~Implementation/PostSharpPerformanceTestAttribute~1:AOPConsoleApplication.PostSharp.CutomAttribute.PostSharpPerformanceTestAttribute">PostSharpPerformanceTestAttribute~1</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.IOnMethodBoundaryAspect/OnSuccess(PostSharp.Laos.MethodExecutionEventArgs)">OnSuccess</a>(<a>~laosEventArgs~7</a>);
<a>p3</a> = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>~arguments~6</a>[2];
<a>~returnValue~4</a> = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>~laosEventArgs~7</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/get_ReturnValue():Object">get_ReturnValue</a>();
}
catch (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Exception">Exception</a> <strong>~exception~5</strong>)
{
<a>~laosEventArgs~7</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/set_Exception(System.Exception)">set_Exception</a>(<a>~exception~5</a>);
<a>~arguments~6</a>[2] = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>p3</a>;
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/~PostSharp~Laos~Implementation">~PostSharp~Laos~Implementation</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/~PostSharp~Laos~Implementation/PostSharpPerformanceTestAttribute~1:AOPConsoleApplication.PostSharp.CutomAttribute.PostSharpPerformanceTestAttribute">PostSharpPerformanceTestAttribute~1</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.IExceptionHandlerAspect/OnException(PostSharp.Laos.MethodExecutionEventArgs)">OnException</a>(<a>~laosEventArgs~7</a>);
<a>p3</a> = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>~arguments~6</a>[2];
switch (<a>~laosEventArgs~7</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/get_FlowBehavior():PostSharp.Laos.FlowBehavior">get_FlowBehavior</a>())
{
case 1:
return <a>~returnValue~4</a>;
case 3:
return (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>~laosEventArgs~7</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/get_ReturnValue():Object">get_ReturnValue</a>();
}
throw;
}
finally
{
<a>~arguments~6</a>[2] = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>p3</a>;
<a>~laosEventArgs~7</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/set_ReturnValue(Object)">set_ReturnValue</a>(<a>~returnValue~4</a>);
<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/~PostSharp~Laos~Implementation">~PostSharp~Laos~Implementation</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://AOPConsoleApplication:1.0.0.0/~PostSharp~Laos~Implementation/PostSharpPerformanceTestAttribute~1:AOPConsoleApplication.PostSharp.CutomAttribute.PostSharpPerformanceTestAttribute">PostSharpPerformanceTestAttribute~1</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.IOnMethodBoundaryAspect/OnExit(PostSharp.Laos.MethodExecutionEventArgs)">OnExit</a>(<a>~laosEventArgs~7</a>);
<a>p3</a> = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>~arguments~6</a>[2];
<a>~returnValue~4</a> = (<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32">int</a>) <a>~laosEventArgs~7</a>.<a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://PostSharp.Laos:1.0.9.372:b13fd38b8f9c99d7/PostSharp.Laos.MethodExecutionEventArgs/get_ReturnValue():Object">get_ReturnValue</a>();
}
return <a>~returnValue~4</a>;
}</pre>
<pre>给我的感觉是：好长，好繁。我认为之所以PostSharp的耗时更长的原因就在这里，它把这个方法搞复杂了，</pre>
<pre>所以耗时就长了，但DotNet原生的动态代理方式并不会这样，但对性能也有不小的影响。</pre>
<pre>综上所述：我认为我们在使用AOP技术进行开发时，除非很有必要用到PostSharp提供的那么多功能，</pre>
<pre>要是只是实现权限验证，日志、异常捕获等，用DotNet原生的动态代理实现就可以了。
</pre>
<pre style="color: #008000">
<pre><font face="Verdana">补充：我让两种实现方式各运行1000次来计算各自的总共耗时，测试的结果是：dotnet：250-350 ；<br />
PostSharp：1250-1300；而且在各自的1000次执行中，大多数次数执行耗时为0毫秒，<br />
而各自的第一次执行耗时与前面测试耗时基本相同，分别为14和79左右，<br />
随后继续以下次数执行，基本都为0毫秒，随后的某次执行会耗时大于0毫秒，<br />
但dotnet实现方式的大于0毫秒的次数比PostSharp出现的次数晚，<br />
DotNet在第80次左右出现一次大于0毫秒的情况,而PostSharp在第25次左右的地方出现一次大于0毫秒的情况。</font></pre>
</pre>
<img src ="http://www.cnblogs.com/xiaozhuang/aggbug/1234150.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41935/" target="_blank">[新闻]对比测试：IE8 Beta 2 VS Firefox 3.0.1</a>]]></description></item><item><title>WCF的用户名密码认证</title><link>http://www.cnblogs.com/xiaozhuang/archive/2008/04/30/1177399.html</link><dc:creator>小庄</dc:creator><author>小庄</author><pubDate>Wed, 30 Apr 2008 03:23:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaozhuang/archive/2008/04/30/1177399.html</guid><wfw:comment>http://www.cnblogs.com/xiaozhuang/comments/1177399.html</wfw:comment><comments>http://www.cnblogs.com/xiaozhuang/archive/2008/04/30/1177399.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaozhuang/comments/commentRss/1177399.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaozhuang/services/trackbacks/1177399.html</trackback:ping><description><![CDATA[<p>以前我们用WebService做分布式系统的时候，认证是个麻烦的问题，通常的做法是继承一个SoapHeader，把用户名和密码放到里面，每调用一个方法都要把用户名和密码传递给服务器端来验证 ，效率相当低，代码编写相当的麻烦，而且还不安全！ </p>
<p>WCF支持多种认证技术，例如Windowns认证、X509证书、Issued Tokens、用户名密码认证等，在跨Windows域分布的系统中，用户名密码认证还是比较常用的，要实现用户名密码认证，就必须需要X509证书，为什么呢？因为我们需要X509证书这种非对称密钥技术来实现WCF在Message传递过程中的加密和解密，要不然用户名和密码就得在网络上明文传递！详细说明就是客户端把用户名和密码用公钥加密后传递给服务器端，服务器端再用自己的私钥来解密，然后传递给相应的验证程序来实现身份验证。 </p>
<p>当然，做个测试程序就没有必要去申请一个X509数字签名证书了，微软提供了一个makecert.exe的命令专门用来生成测试使用的X509证书的，那我们就来建立一个测试用的证书，在cmd下输入以下命令： </p>
<p>makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=MyServerCert -sky exchange &#8211;pe </p>
<p>这个命令的意思就是创建一个测试的X509证书，这个证书放在存储位置为'Localmachine'的'My'这个文件夹下，证书主题名字叫'MyServerCert'，需要更多关于makecert命令的信息请参考MSDN。 </p>
<p>证书建立好了，我们就可以编写代码了，在VS2008下建立一个解决方案并在上面建立两个Web项目，一个是'Asp.net Web 应用程序'（客户端），一个是'WCF服务应用程序'（服务器端），我们先来编写服务器端代码，首先我们要编写自己的用户名密码认证逻辑，先要在WCF项目上添加引用'System.IdentityModel'然后我们建立一个新的类文件并继承自'System.IdentityModel.Selectors.UserNamePasswordValidator'，然后我们重写里面的'Validate'方法来实现用户名密码认证逻辑。代码如下； </p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System.Linq; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System.Text; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System.IdentityModel.Selectors; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System.IdentityModel.Tokens; </span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">namespace</span> ServerWcfService.CustomValidators </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">{ </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">MyCustomValidator</span> : <span style="color: #2b91af">UserNamePasswordValidator </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">{ </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: gray">///</span><span style="color: green"> </span><span style="color: gray">&lt;summary&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: gray">///</span><span style="color: green"> Validates the user name and password combination. </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: gray">///</span><span style="color: green"> </span><span style="color: gray">&lt;/summary&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: gray">///</span><span style="color: green"> </span><span style="color: gray">&lt;param name="userName"&gt;</span><span style="color: green">The user name.</span><span style="color: gray">&lt;/param&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: gray">///</span><span style="color: green"> </span><span style="color: gray">&lt;param name="password"&gt;</span><span style="color: green">The password.</span><span style="color: gray">&lt;/param&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">void</span> Validate(<span style="color: blue">string</span> userName, <span style="color: blue">string</span> password) </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">{ </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: green">// validate arguments </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">if</span> (<span style="color: blue">string</span>.IsNullOrEmpty(userName)) </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">throw</span> <span style="color: blue">new</span> <span style="color: #2b91af">ArgumentNullException</span>(<span style="color: #a31515">"userName"</span>); </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">if</span> (<span style="color: blue">string</span>.IsNullOrEmpty(password)) </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">throw</span> <span style="color: blue">new</span> <span style="color: #2b91af">ArgumentNullException</span>(<span style="color: #a31515">"password"</span>); </span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: green">// check if the user is not xiaozhuang </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">if</span> (userName != <span style="color: #a31515">"xiaozhuang"</span> || password != <span style="color: #a31515">"123456"</span>) </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">throw</span> <span style="color: blue">new</span> <span style="color: #2b91af">SecurityTokenException</span>(<span style="color: #a31515">"用户名或者密码错误！"</span>); </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">} </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">} </span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体">} </span></p>
<p>上面只是一个简单的验证，实际应用中用户名和密码一般都保存在数据库中，如果验证不通过就抛出一个'SecurityTokenException'类型的异常；下一步我们需要配置一下服务端的webConfig文件，我的WebConfig文件Servicemodel配置节如下： </p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&lt;</span><span style="color: #a31515">system.serviceModel</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt;</strong></span><strong><span style="color: #a31515">bindings</span><span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">wsHttpBinding</span><span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">binding</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">mySecureBinding</span>"<span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">security</span><span style="color: blue"> </span><span style="color: red">mode</span><span style="color: blue">=</span>"<span style="color: blue">Message</span>"<span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">message</span><span style="color: blue"> </span><span style="color: red">clientCredentialType</span><span style="color: blue">=</span>"<span style="color: blue">UserName</span>"<span style="color: blue">/&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">security</span><span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">binding</span><span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">wsHttpBinding</span><span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">bindings</span><span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">services</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">service</span><span style="color: blue"> </span><span style="color: red">behaviorConfiguration</span><span style="color: blue">=</span>"<span style="color: blue">ServerWcfService.Services.MySimpleServiceBehavior</span>"<span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">ServerWcfService.Services.MySimpleService</span>"<span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">endpoint</span><span style="color: blue"> </span><span style="color: red">address</span><span style="color: blue">=</span>""<span style="color: blue"> </span><span style="color: red">binding</span><span style="color: blue">=</span>"<span style="color: blue">wsHttpBinding</span>"<span style="color: blue"> </span><span style="color: red">contract</span><span style="color: blue">=</span>"<span style="color: blue">ServerWcfService.ServiceContracts.IMySimpleService</span>"<span style="color: blue"> </span><strong><span style="color: red">bindingConfiguration</span><span style="color: blue">=</span>"<span style="color: blue">mySecureBinding</span>"</strong><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">identity</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt;</strong></span><strong><span style="color: #a31515">dns</span><span style="color: blue"> </span><span style="color: red">value</span><span style="color: blue">=</span>"<span style="color: blue">MyServerCert</span>"<span style="color: blue">/&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">identity</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">endpoint</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">endpoint</span><span style="color: blue"> </span><span style="color: red">address</span><span style="color: blue">=</span>"<span style="color: blue">mex</span>"<span style="color: blue"> </span><span style="color: red">binding</span><span style="color: blue">=</span>"<span style="color: blue">mexHttpBinding</span>"<span style="color: blue"> </span><span style="color: red">contract</span><span style="color: blue">=</span>"<span style="color: blue">IMetadataExchange</span>"<span style="color: blue">/&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">service</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">services</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">behaviors</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">serviceBehaviors</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">behavior</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">ServerWcfService.Services.MySimpleServiceBehavior</span>"<span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">serviceMetadata</span><span style="color: blue"> </span><span style="color: red">httpGetEnabled</span><span style="color: blue">=</span>"<span style="color: blue">true</span>"<span style="color: blue">/&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">serviceDebug</span><span style="color: blue"> </span><span style="color: red">includeExceptionDetailInFaults</span><span style="color: blue">=</span>"<span style="color: blue">false</span>"<span style="color: blue">/&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt;</strong></span><strong><span style="color: #a31515">serviceCredentials</span><span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">serviceCertificate</span><span style="color: blue"> </span><span style="color: red">findValue</span><span style="color: blue">=</span>"<span style="color: blue">MyServerCert</span>"<span style="color: blue"> </span><span style="color: red">x509FindType</span><span style="color: blue">=</span>"<span style="color: blue">FindBySubjectName</span>"<span style="color: blue"> </span><span style="color: red">storeLocation</span><span style="color: blue">=</span>"<span style="color: blue">LocalMachine</span>"<span style="color: blue"> </span><span style="color: red">storeName</span><span style="color: blue">=</span>"<span style="color: blue">My</span>"<span style="color: blue">/&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">userNameAuthentication</span><span style="color: blue"> </span><span style="color: red">userNamePasswordValidationMode</span><span style="color: blue">=</span>"<span style="color: blue">Custom</span>"<span style="color: blue"> </span><span style="color: red">customUserNamePasswordValidatorType</span><span style="color: blue">=</span>"<span style="color: blue">ServerWcfService.CustomValidators.MyCustomValidator,ServerWcfService</span>"<span style="color: blue">/&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><strong><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">serviceCredentials</span><span style="color: blue">&gt; </span></strong></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">behavior</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">serviceBehaviors</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">behaviors</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">system.serviceModel</span><span style="color: blue">&gt;</span></span> </p>
<p>加粗的那些是我加上去的或者在默认上修改了的。Bindings节指定了客户端提供的认证类型为'username'并在endpoint节中指定bianding配置。在dns节中修改原来的localmachine为MyServerCert，当然你也可以修改为别的，这取决于你的证书主题名称是什么。也就是上面命令中的CN=MyServerCert，接下来我们加入在serviceCredentials配置节，并在里面配置两个小节，ServiceCertificate节中指定了我们的X509证书的位置，以用来加解密message，usernameAuthentication节中指定了我们自己的用户名密码验证逻辑。 </p>
<p>Sorry，忘了一件事情，就是写一个测试的服务契约并实现，写法上和无认证的写法一样，如下<span style="font-size: 9pt; color: blue; font-family: 新宋体">ServerWcfService.ServiceContracts.IMySimpleService</span>： </p>
<p><span style="font-size: 9pt; font-family: 新宋体">[<span style="color: #2b91af">OperationContract</span>] </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">string</span> PrintMessage(<span style="color: blue">string</span> message); </span></p>
<p>这样，服务端的代码编写和配置就完成了，生成项目测试一下，页面显示服务已生成成功。 </p>
<p>接下来我们开始编写客户端代码，先在客户端引用刚才生成的WCF服务，然后编写客户端代码如下： </p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">protected</span> <span style="color: blue">void</span> btnPrint_Click(<span style="color: blue">object</span> sender, <span style="color: #2b91af">EventArgs</span> e) </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">{ </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">TestWCFService.<span style="color: #2b91af">MySimpleServiceClient</span> client = <span style="color: blue">new</span> ClientWeb.TestWCFService.<span style="color: #2b91af">MySimpleServiceClient</span>(); </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">client.ClientCredentials.UserName.UserName = <span style="color: #a31515">"xiaozhuang"</span>; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">client.ClientCredentials.UserName.Password = <span style="color: #a31515">"123456"</span>; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">lbMessage.Text = client.PrintMessage(txtMessage.Text); </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">} </span></p>
<p>&nbsp;</p>
<p>如果你有一个真正的X509证书，那么现在的代码就可以正常运行了。但是很不幸，我们的证书是测试用的，我们运行的时候出错：'<em>X.509 certificate CN=MyServerCert 链生成失败。所使用的证书具有无法验证的信任链。请替换该证书或更改 certificateValidationMode。已处理证书链，但是在不受信任提供程序信任的根证书中终止</em>'，WCF无法验证测试证书的信任链，那我们要做的就是绕过这个信任验证，具体做法如下： </p>
<p>先要在Asp.net Web应用程序项目上添加引用'System.IdentityModel'然后我们建立一个新的类文件并继承自'System.IdentityModel.Selectors.X509CertificateValidator'，然后我们重写里面的'Validate'方法来实现我们自己的X509认证逻辑，代码如下： </p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System.Configuration; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System.IdentityModel.Selectors; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System.IdentityModel.Tokens; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">using</span> System.Security.Cryptography.X509Certificates; </span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">namespace</span> ClientWeb.CustomX509Validator </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">{ </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: gray">///</span><span style="color: green"> </span><span style="color: gray">&lt;summary&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: gray">///</span><span style="color: green"> Implements the validator for X509 certificates. </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: gray">///</span><span style="color: green"> </span><span style="color: gray">&lt;/summary&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">MyX509Validator</span>: <span style="color: #2b91af">X509CertificateValidator </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;{ </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: gray">///</span><span style="color: green"> </span><span style="color: gray">&lt;summary&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: gray">///</span><span style="color: green"> Validates a certificate. </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: gray">///</span><span style="color: green"> </span><span style="color: gray">&lt;/summary&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: gray">///</span><span style="color: green"> </span><span style="color: gray">&lt;param name="certificate"&gt;</span><span style="color: green">The certificate the validate.</span><span style="color: gray">&lt;/param&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">void</span> Validate(<span style="color: #2b91af">X509Certificate2</span> certificate) </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">// validate argument </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">if</span> (certificate == <span style="color: blue">null</span>) </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">throw</span> <span style="color: blue">new</span> <span style="color: #2b91af">ArgumentNullException</span>(<span style="color: #a31515">"X509认证证书为空！"</span>); </span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">// check if the name of the certifcate matches </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">if</span> (certificate.SubjectName.Name != <span style="color: #2b91af">ConfigurationManager</span>.AppSettings[<span style="color: #a31515">"CertName"</span>]) </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">throw</span> <span style="color: blue">new</span> <span style="color: #2b91af">SecurityTokenValidationException</span>(<span style="color: #a31515">"Certificated was not issued by thrusted issuer"</span>); </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;} </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体">}</span> </p>
<p>你可以把Validate方法里面留空让所有的认证都通过，也可以自己定义认证逻辑，如果认证失败，就抛出'<span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">SecurityTokenValidationException</span>'的异常，然后我们配置一下客户端的webconfig让它使用我们自己的X509认证，增加以下的配置节，并在'<span style="font-size: 9pt; color: #a31515; font-family: 新宋体">endpoint</span>'节中指定<span style="font-size: 9pt; font-family: 新宋体"><span style="color: red">behaviorConfiguration</span><span style="color: blue">=</span>"<span style="color: blue">myClientBehavior</span>"。</span> </p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&lt;</span><span style="color: #a31515">behaviors</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">endpointBehaviors</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">behavior</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">myClientBehavior</span>"<span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">clientCredentials</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">serviceCertificate</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #a31515">authentication</span><span style="color: blue"> </span><span style="color: red">certificateValidationMode</span><span style="color: blue">=</span>"<span style="color: blue">Custom</span>"<span style="color: blue"> </span><span style="color: red">customCertificateValidatorType</span><span style="color: blue">=</span>"<span style="color: blue">ClientWeb.CustomX509Validator.MyX509Validator,ClientWeb</span>"<span style="color: blue"> /&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">serviceCertificate</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">clientCredentials</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">behavior</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">endpointBehaviors</span><span style="color: blue">&gt; </span></span></p>
<p><span style="font-size: 9pt; font-family: 新宋体"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #a31515">behaviors</span><span style="color: blue">&gt;</span></span> </p>
<p>&nbsp;</p>
<p>OK，客户端代码和配置完成，现在你可以运行自己的程序了，运行界面如下：<span style="color: red"><a href="/Files/xiaozhuang/WCFUserNameAuthentication.rar"><span style="color: red">如果需要源代码在这里下载</span></a></span>. </p>
<p><img height="61" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xiaozhuang/BlogsImages/wcf.JPG" width="481" border="0" /></p>
<img src ="http://www.cnblogs.com/xiaozhuang/aggbug/1177399.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41934/" target="_blank">[新闻]iPhone存在严重密码安全漏洞</a>]]></description></item><item><title>使用WCF上传文件</title><link>http://www.cnblogs.com/xiaozhuang/archive/2008/04/01/1133138.html</link><dc:creator>小庄</dc:creator><author>小庄</author><pubDate>Tue, 01 Apr 2008 08:39:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaozhuang/archive/2008/04/01/1133138.html</guid><wfw:comment>http://www.cnblogs.com/xiaozhuang/comments/1133138.html</wfw:comment><comments>http://www.cnblogs.com/xiaozhuang/archive/2008/04/01/1133138.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaozhuang/comments/commentRss/1133138.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaozhuang/services/trackbacks/1133138.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="Verdana">&nbsp;</font><span style="font-size: 14pt"> <span style="font-size: 14pt"><span style="font-size: 12pt">在WCF没出现之前，我一直使用用WebService来上传文件，我不知道别人为什么要这么做，因为我们的文件服务器和网站后台和网站前台都不在同一个机器，操作人员觉得用FTP传文件太麻烦，我就做一个专门用来上传文件的WebService,把这个WebService部署在文件服务器上，然后在网站后台调用这个WebService，把网站后台页面上传上来的文件转化为字节流传给WebService，然后WebService把这个字节流保存文件到一个只允许静态页面的网站（静态网站可以防止一些脚本木马）。</span> <br />
<span style="font-size: 12pt">WebService来上传文件存在的问题是效率不高，而且不能传输大数据量的文件，当然你可以用Wse中的MTOM来传输大文件，有了WCF就好多了，通过使用WCF传递Stream对象来传递大数据文件，但有一些限制： </span></span></span>
<p><span style="font-size: 14pt"><span style="font-size: 12pt">1、<span style="font-size: 12pt">只有 BasicHttpBinding、NetTcpBinding 和 NetNamedPipeBinding 支持传送流数据。</span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 12pt">2、 流数据类型必须是可序列化的 Stream 或 MemoryStream。</span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 12pt">3、 传递时消息体(Message Body)中不能包含其他数据。</span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 12pt">4、TransferMode的限制和MaxReceivedMessageSize的限制等。</span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 12pt">下面具体实现：新建一个WCFService，接口文件的代码如下：</span></span></span></p>
<p><span style="font-size: 15pt; font-family: 宋体"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">[ServiceContract]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IUpLoadService<br />
<img id="Codehighlighter1_58_185_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_58_185_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_58_185_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_58_185_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_58_185_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_58_185_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_58_185_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_58_185_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_58_185_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_58_185_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract(Action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">UploadFile</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;IsOneWay&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">)]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;UploadFile(FileUploadMessage&nbsp;request);<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;[MessageContract]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FileUploadMessage<br />
<img id="Codehighlighter1_249_488_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_249_488_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_249_488_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_249_488_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_249_488_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_249_488_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_249_488_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_249_488_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_249_488_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_249_488_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[MessageHeader(MustUnderstand&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">)]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;SavePath;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[MessageHeader(MustUnderstand&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">)]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;FileName;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[MessageBodyMember(Order&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Stream&nbsp;FileData;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p></span><span style="font-size: 12pt">定义FileUploadMessage类的目的是因为第三个限制，要不然文件名和存放路径就没办法传递给WCF了，根据第二个限制，文件数据是用System.IO.Stream来传递的</span></p>
<p><span style="font-size: 12pt">接口方法只有一个，就是上传文件，注意方法参数是FileUploadMessage</span></p>
<p><span style="font-size: 12pt">接口实现类文件的代码如下：</span></p>
<p><span style="font-size: 15pt; font-family: 宋体"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;UpLoadService&nbsp;:&nbsp;IUpLoadService<br />
<img id="Codehighlighter1_49_1583_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_49_1583_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_49_1583_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_49_1583_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_49_1583_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_49_1583_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_49_1583_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_49_1583_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_49_1583_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_49_1583_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;UploadFile(FileUploadMessage&nbsp;request)<br />
<img id="Codehighlighter1_117_1576_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_117_1576_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_117_1576_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_117_1576_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_117_1576_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_117_1576_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_117_1576_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_117_1576_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_117_1576_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_117_1576_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;uploadFolder&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">@"</span><span style="color: #800000">C:\kkk\</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;savaPath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.SavePath;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;dateString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DateTime.Now.ToShortDateString()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">@"</span><span style="color: #800000">\</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;fileName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.FileName;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;sourceStream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.FileData;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileStream&nbsp;targetStream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">sourceStream.CanRead)<br />
<img id="Codehighlighter1_496_559_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_496_559_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_496_559_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_496_559_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_496_559_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_496_559_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_496_559_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_496_559_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_496_559_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_496_559_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Exception(</span><span style="color: #800000">"</span><span style="color: #800000">数据流不可读!</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(savaPath&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;savaPath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">@"</span><span style="color: #800000">Photo\</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">savaPath.EndsWith(</span><span style="color: #800000">"</span><span style="color: #800000">\\</span><span style="color: #800000">"</span><span style="color: #000000">))&nbsp;savaPath&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">\\</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uploadFolder&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;uploadFolder&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;savaPath&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;dateString;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">Directory.Exists(uploadFolder))<br />
<img id="Codehighlighter1_808_880_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_808_880_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_808_880_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_808_880_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_808_880_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_808_880_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_808_880_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_808_880_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_808_880_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_808_880_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Directory.CreateDirectory(uploadFolder);<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;filePath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Path.Combine(uploadFolder,&nbsp;fileName);<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;(targetStream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileStream(filePath,&nbsp;FileMode.Create,&nbsp;FileAccess.Write,&nbsp;FileShare.None))<br />
<img id="Codehighlighter1_1073_1566_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1073_1566_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1073_1566_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1073_1566_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1073_1566_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1073_1566_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1073_1566_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1073_1566_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1073_1566_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1073_1566_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">read&nbsp;from&nbsp;the&nbsp;input&nbsp;stream&nbsp;in&nbsp;4K&nbsp;chunks<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">and&nbsp;save&nbsp;to&nbsp;output&nbsp;stream</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;bufferLen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">4096</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[bufferLen];<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sourceStream.Read(buffer,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;bufferLen))&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_1399_1476_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1399_1476_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1399_1476_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1399_1476_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1399_1476_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1399_1476_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1399_1476_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1399_1476_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1399_1476_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1399_1476_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetStream.Write(buffer,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;count);<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetStream.Close();<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sourceStream.Close();<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p></span><span style="font-size: 15pt; font-family: 宋体"></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 12pt">实现的功能是到指定目录下按照日期进行目录划分，然后以传过来的文件名保存文件。</span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt; color: red">这篇文章最主要的地方就是下面的Web.Config配置：</span><br />
</span></p>
<p><br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">system.serviceModel</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bindings</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">basicHttpBinding</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">binding&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="FileTransferServicesBinding"</span><span style="color: #ff0000">&nbsp;maxReceivedMessageSize</span><span style="color: #0000ff">="9223372036854775807"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageEncoding</span><span style="color: #0000ff">="Mtom"</span><span style="color: #ff0000">&nbsp;transferMode</span><span style="color: #0000ff">="Streamed"</span><span style="color: #ff0000">&nbsp;sendTimeout</span><span style="color: #0000ff">="00:10:00"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">basicHttpBinding</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bindings</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">services</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">service&nbsp;</span><span style="color: #ff0000">behaviorConfiguration</span><span style="color: #0000ff">="UploadWcfService.UpLoadServiceBehavior"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="UploadWcfService.UpLoadService"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">endpoint&nbsp;</span><span style="color: #ff0000">address</span><span style="color: #0000ff">=""</span><span style="color: #ff0000">&nbsp;binding</span><span style="color: #0000ff">="basicHttpBinding"</span><span style="color: #ff0000">&nbsp;bindingConfiguration</span><span style="color: #0000ff">="FileTransferServicesBinding"</span><span style="color: #ff0000">&nbsp;contract</span><span style="color: #0000ff">="UploadWcfService.IUpLoadService"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">endpoint</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">endpoint&nbsp;</span><span style="color: #ff0000">address</span><span style="color: #0000ff">="mex"</span><span style="color: #ff0000">&nbsp;binding</span><span style="color: #0000ff">="mexHttpBinding"</span><span style="color: #ff0000">&nbsp;contract</span><span style="color: #0000ff">="IMetadataExchange"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">service</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">services</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">behaviors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">serviceBehaviors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">behavior&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="UploadWcfService.UpLoadServiceBehavior"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">serviceMetadata&nbsp;</span><span style="color: #ff0000">httpGetEnabled</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">serviceDebug&nbsp;</span><span style="color: #ff0000">includeExceptionDetailInFaults</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">behavior</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">serviceBehaviors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">behaviors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">system.serviceModel</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
</span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 15pt; font-family: 宋体"><span style="font-size: 12pt"><span style="font-family: 宋体">配置要遵循上面的第一条和第四条限制，因为默认.net<span style="font-family: 宋体">只能传4M<span style="font-family: 宋体">的文件，所以要在<br />
</span></span></span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 15pt"><span style="font-size: 12pt">&lt;System.Web&gt;<span style="font-family: 宋体">配置节下面加上</span><span style="color: blue; font-family: 新宋体">&lt;</span><span style="color: #a31515; font-family: 新宋体">httpRuntime</span><span style="color: red; font-family: 新宋体">maxRequestLength</span><span style="color: blue; font-family: 新宋体">=</span><span style="font-family: 新宋体">"<span style="color: blue">2097151</span>"<span style="color: blue"> /&gt;</span></span></span></span></span></span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 15pt; font-family: 宋体"><span style="font-size: 12pt"><span style="font-family: 宋体">这样WCFService<span style="font-family: 宋体">就完成了，新建一个Console<span style="font-family: 宋体">项目或者Web</span><span style="font-family: 宋体">项目测试一下。要注意的</span></span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 15pt; font-family: 宋体"><br />
<span style="font-size: 12pt"><span style="font-family: 宋体">是</span>Client<span style="font-family: 宋体">端的配置必须要和服务端一样，<a href="/Files/xiaozhuang/HCUpLoad.rar">实例程序在这里下载</a>。</span></span></span></span></span></span></p>
<img src ="http://www.cnblogs.com/xiaozhuang/aggbug/1133138.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41931/" target="_blank">[新闻]GC2008：星际争霸2进程报告 微调进程延续</a>]]></description></item><item><title>第三节：ExtJS调用WCF系列-----添加，修改，删除</title><link>http://www.cnblogs.com/xiaozhuang/archive/2007/12/18/1004382.html</link><dc:creator>小庄</dc:creator><author>小庄</author><pubDate>Tue, 18 Dec 2007 04:59:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaozhuang/archive/2007/12/18/1004382.html</guid><wfw:comment>http://www.cnblogs.com/xiaozhuang/comments/1004382.html</wfw:comment><comments>http://www.cnblogs.com/xiaozhuang/archive/2007/12/18/1004382.html#Feedback</comments><slash:comments>35</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaozhuang/comments/commentRss/1004382.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaozhuang/services/trackbacks/1004382.html</trackback:ping><description><![CDATA[摘要: 我们继续上一节中的那个项目，给那个员工列表增加 添加修改删除功能。和上一节一样，我们先从服务器端说起，服务器端需要提供WCF接口给客户端调用，我们先来写几个BLL的数据处理方法/**////&lt;summary&gt;///获取部门列表///&lt;/summary&gt;///&lt;returns&gt;&lt;/returns&gt;publicstringGetDeptList(){va&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaozhuang/archive/2007/12/18/1004382.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaozhuang/aggbug/1004382.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41930/" target="_blank">[新闻]科学家在世界最大对撞机中观察到首批粒子</a>]]></description></item><item><title>第二节：ExtJS调用WCF系列-----分页排序列表实现</title><link>http://www.cnblogs.com/xiaozhuang/archive/2007/12/11/990329.html</link><dc:creator>小庄</dc:creator><author>小庄</author><pubDate>Tue, 11 Dec 2007 02:17:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaozhuang/archive/2007/12/11/990329.html</guid><wfw:comment>http://www.cnblogs.com/xiaozhuang/comments/990329.html</wfw:comment><comments>http://www.cnblogs.com/xiaozhuang/archive/2007/12/11/990329.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaozhuang/comments/commentRss/990329.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaozhuang/services/trackbacks/990329.html</trackback:ping><description><![CDATA[摘要: 打开第一节中的那个项目，新建一个Paging.aspx的页面来实现分页列表。这次我们使用一个测试的数据库CompanyInfoDB,里面有两张表，部门和员工，并外键关联，数据库调用采用Linq的Sqlmetal 命令方式，在Visual Studio 2008的命令提示符中输入以下命令：D:\Program Files\Microsoft Visual Studio 9.0\VC&gt;sqlme&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaozhuang/archive/2007/12/11/990329.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaozhuang/aggbug/990329.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41929/" target="_blank">[新闻]阿里巴巴利润增1.36倍</a>]]></description></item><item><title>第一节：ExtJS调用WCF系列-----实现JSON传递</title><link>http://www.cnblogs.com/xiaozhuang/archive/2007/12/07/987092.html</link><dc:creator>小庄</dc:creator><author>小庄</author><pubDate>Fri, 07 Dec 2007 10:14:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaozhuang/archive/2007/12/07/987092.html</guid><wfw:comment>http://www.cnblogs.com/xiaozhuang/comments/987092.html</wfw:comment><comments>http://www.cnblogs.com/xiaozhuang/archive/2007/12/07/987092.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaozhuang/comments/commentRss/987092.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaozhuang/services/trackbacks/987092.html</trackback:ping><description><![CDATA[摘要: 首先我们打开我们的VS 新建一个Asp.Net WebApplication Project，(不要给我说新建网站，我讨厌那个东东) 命名为ExtJSAndWCFChapter1 如图：接下来我们在该项目中新建一个实体类文件和一个AJAX—Enabled WCF SERVICE，分别命名为Employee.cs 和EmployeeService.svc下面去ExtJS.Com网站下载一个ExtJS&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaozhuang/archive/2007/12/07/987092.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaozhuang/aggbug/987092.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41928/" target="_blank">[新闻]Google Gears覆盖四大浏览器 Safari版推出</a>]]></description></item><item><title>ExtJS调用WCF系列</title><link>http://www.cnblogs.com/xiaozhuang/archive/2007/12/07/987087.html</link><dc:creator>小庄</dc:creator><author>小庄</author><pubDate>Fri, 07 Dec 2007 10:00:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaozhuang/archive/2007/12/07/987087.html</guid><wfw:comment>http://www.cnblogs.com/xiaozhuang/comments/987087.html</wfw:comment><comments>http://www.cnblogs.com/xiaozhuang/archive/2007/12/07/987087.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaozhuang/comments/commentRss/987087.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaozhuang/services/trackbacks/987087.html</trackback:ping><description><![CDATA[<p><font face="Courier New">ExtJS调用的服务器端目前有三种实现方式:<br />
一种是网页的方式，他的Content-Type:是application/x-www-form-urlencoded，这种方式适用范围比较广泛，只要是能输出网页的服务器端环境都可以。ExtJS官方网站上的例子基本上都是这种形式，服务器端的环境是PHP，http://cmsoft.cnblogs.com/ 是实现这种方式的.net版本，不过让我这样来写dotNet代码我可不愿意。<br />
<br />
一种是WebService的方式，也就是通过XML在服务器和客户端传递数据的方式，在DotNet下这种实现方式比较复杂，也比较搞笑，原因是在服务器序列化的xml要在客户端用Asp.Net Ajax才可以反序列化，然后才能被ExtJS调用，我既然用了ExtJS框架，还得再用ASP.Net AJAX框架，实在不爽！<br />
<br />
还有一种是WCF的形式，他的Content-Type是 application/json，其原理是基于JSON来在服务器端和客户端传递数据，我们必须得定义服务器端方法的输入，输出参数为JSON形式才可以，其次还得进行URL重写等（其实就是加个attribute），我觉得还是这种方式实现起来比较顺眼。<br />
<br />
</font><font face="Courier New">在google找到了这两篇文章<a href="http://www.hausertechnologies.com/wordpress/?p=33">http://www.hausertechnologies.com/wordpress/?p=33</a> 和http://www.hausertechnologies.com/wordpress/?p=35&nbsp; 并经过我的琢磨，就琢磨出一些心得体会来，不敢独享，所以贴出来让园子里喜欢EXTJS和dotNet的朋友也一起体会体会。<br />
<br />
</font><font face="Courier New">我分为三节来讲述EXTJS调用WCF的系列，每节都有详细的步骤说明和截图，而且还提供源码，要是还有人不明白，就回家看看自己的耳朵和鼻子是不是都很大？开发环境是Visual Studio 2008 英文RTM版 和 EXTJS 2.0 后面没有RC的那个版本，也就是目前最新版</font></p>
<p><font face="Courier New"><a href="http://www.cnblogs.com/xiaozhuang/archive/2007/12/07/987092.html"><font face="Courier New">第一节：ExtJS调用WCF系列-----实现JSON传递</font></a></font></p>
<p><font face="Courier New"><a href="http://www.cnblogs.com/xiaozhuang/archive/2007/12/11/990329.html"><font face="Courier New">第二节：ExtJS调用WCF系列-----分页排序列表实现 </font></a></font></p>
<p><font face="Courier New"><a href="http://www.cnblogs.com/xiaozhuang/archive/2007/12/18/1004382.html"><font face="Courier New">第三节：ExtJS调用WCF系列-----添加，修改，删除</font></a><br />
</font></p>
<img src ="http://www.cnblogs.com/xiaozhuang/aggbug/987087.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41928/" target="_blank">[新闻]Google Gears覆盖四大浏览