<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_shenba</title><subtitle type="text">闻道有先后，术业有专攻，如是而已。</subtitle><id>http://feed.cnblogs.com/blog/u/26671/rss</id><updated>2012-02-04T03:11:22Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/26671/rss"/><entry><id>http://www.cnblogs.com/shenba/archive/2012/02/04/2337806.html</id><title type="text">WCF中容易忽视的ConfigurationName属性</title><summary type="text">在使用WCF服务时，通常都是用svcutil生成代理类和配置，用生成的默认配置就可以调用服务。先来看看生成的默认的配置内容：View Code &amp;lt;client&amp;gt;&amp;lt;endpointaddress=&amp;quot;http://localhost:8732/ConfigNameService/Service1/&amp;quot;binding=&amp;quot;wsHttpBinding&amp;quot;bindingConfiguration=&amp;quot;WSHttpBinding_IService1&amp;quot;contract=&amp;quot;IService1&amp;quot;name=&amp;quot;WSH</summary><published>2012-02-04T03:11:00Z</published><updated>2012-02-04T03:11:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2012/02/04/2337806.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2012/02/04/2337806.html"/><content type="html">&lt;p&gt;&lt;font style="background-color: #cce8cf"&gt;在使用WCF服务时，通常都是用svcutil生成代理类和配置，用生成的默认配置就可以调用服务。先来看看生成的默认的配置内容：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('b1c0aeb7-6bd1-4a02-a39f-1dfebf63a8ef')"&gt;&lt;img style="display: none" id="code_img_opened_b1c0aeb7-6bd1-4a02-a39f-1dfebf63a8ef"  onclick="cnblogs_code_hide('b1c0aeb7-6bd1-4a02-a39f-1dfebf63a8ef',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_b1c0aeb7-6bd1-4a02-a39f-1dfebf63a8ef" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;client&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;endpoint&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;address&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://localhost:8732/ConfigNameService/Service1/"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="wsHttpBinding"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;bindingConfiguration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="WSHttpBinding_IService1"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contract&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="IService1"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="WSHttpBinding_IService1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;identity&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;dns&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="localhost"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;identity&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;endpoint&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;client&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;其中contract就是代理类中指向接口或契约类，假如contract的定义如下，那么默认情况下是contract接口的名字&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('6a544bf4-ce44-42ad-93b6-2cafdfb0a1a2')"&gt;&lt;img style="display: none" id="code_img_opened_6a544bf4-ce44-42ad-93b6-2cafdfb0a1a2"  onclick="cnblogs_code_hide('6a544bf4-ce44-42ad-93b6-2cafdfb0a1a2',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_6a544bf4-ce44-42ad-93b6-2cafdfb0a1a2" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;[System.ServiceModel.ServiceContract]&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;interface&lt;/span&gt;&amp;nbsp;IService1&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;但实际上存在多个服务或者需要用命名空间去标记contract时，需要修改客户端配置中endpoint的中contract的名字，需要其包含命名空间，比如改成如下：&lt;/p&gt;&#xD;
&lt;p&gt;contract="ConfigNameService.IService1"。&lt;/p&gt;&#xD;
&lt;p&gt;按通常的理解，以为系统会按照类型名称去找代理类中的接口，但实际上并非这样，仅仅在执行以下代码时就会提示找不到默认终结点的错误。 &#xD;
&lt;p&gt;&lt;/p&gt;&lt;img style="display: none" id="code_img_opened_47c79a9d-3b2f-4f65-9bbb-44e8f745bab8"  onclick="cnblogs_code_hide('47c79a9d-3b2f-4f65-9bbb-44e8f745bab8',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('47c79a9d-3b2f-4f65-9bbb-44e8f745bab8')"&gt;&#xD;
&lt;div id="cnblogs_code_open_47c79a9d-3b2f-4f65-9bbb-44e8f745bab8" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;Service1Client())&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(client.GetData(&lt;span style="color: #800080"&gt;1&lt;/span&gt;));&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;而将contract的值改回"IService1"即可正常调用。&lt;/p&gt;&#xD;
&lt;p&gt;原因是代理类中的contract定义时设置的ConfigurationName决定了配置时需要配置的值，这个属性很容易被忽视，尤其是通过svcutil生成的代理类，比如以下代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('66c02e17-a39a-4887-9b0d-13d0003168ae')"&gt;&lt;img style="display: none" id="code_img_opened_66c02e17-a39a-4887-9b0d-13d0003168ae"  onclick="cnblogs_code_hide('66c02e17-a39a-4887-9b0d-13d0003168ae',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_66c02e17-a39a-4887-9b0d-13d0003168ae" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;[System.ServiceModel.ServiceContractAttribute(ConfigurationName=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;IService1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;interface&lt;/span&gt;&amp;nbsp;IService1&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[System.ServiceModel.OperationContractAttribute(Action=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;http://tempuri.org/IService1/GetData&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;ReplyAction=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;http://tempuri.org/IService1/GetDataResponse&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;GetData(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;value);&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[System.ServiceModel.OperationContractAttribute(Action=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;http://tempuri.org/IService1/GetDataUsingDataContract&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;ReplyAction=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;http://tempuri.org/IService1/GetDataUsingDataContractResponse&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConfigNameService.CompositeType&amp;nbsp;GetDataUsingDataContract(ConfigNameService.CompositeType&amp;nbsp;composite);&lt;br /&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;ConfigurationName就是原服务接口的名字，因此需要手动修改ConfigurationName为需要的值，这里只能改客户代理类中的接口定义的ConfigurationName。然后在配置endpoint时的contract的值跟ConfigurationName的值保持一致即可。&lt;/p&gt;&lt;font style="background-color: #ffffff"&gt;&lt;/font&gt;&lt;font style="background-color: #ffffff"&gt;&lt;/font&gt;&lt;img src="http://www.cnblogs.com/shenba/aggbug/2337806.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2012/02/04/2337806.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shenba/archive/2012/02/03/2337050.html</id><title type="text">解决MVC中JSON字符长度超出限制的异常</title><summary type="text">今日碰到了这么一个异常，异常信息如下：Type:System.InvalidOperationException,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089Message:使用JSONJavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过了为maxJsonLength属性设置的值。Source:System.Web.ExtensionsHelplink:Data:System.Collections.ListDictionaryInternalTargetSite</summary><published>2012-02-03T06:38:00Z</published><updated>2012-02-03T06:38:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2012/02/03/2337050.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2012/02/03/2337050.html"/><content type="html">&lt;p&gt;&lt;font style="background-color: #cce8cf"&gt;今日碰到了这么一个异常，异常信息如下：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;div&gt;Type&amp;nbsp;:&amp;nbsp;System.InvalidOperationException,&amp;nbsp;mscorlib,&amp;nbsp;Version=2.0.0.0,&lt;/div&gt;&#xD;
&lt;div&gt;Culture=neutral,&amp;nbsp;PublicKeyToken=b77a5c561934e089&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;Message&amp;nbsp;:&amp;nbsp;使用&amp;nbsp;JSON&amp;nbsp;JavaScriptSerializer&amp;nbsp;进行序列化或反序列化时出错。字符串&lt;/div&gt;&#xD;
&lt;div&gt;的长度超过了为&amp;nbsp;maxJsonLength&amp;nbsp;属性设置的值。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;Source&amp;nbsp;:&amp;nbsp;System.Web.Extensions&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;Help&amp;nbsp;link&amp;nbsp;:&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;Data&amp;nbsp;:&amp;nbsp;System.Collections.ListDictionaryInternal&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;TargetSite&amp;nbsp;:&amp;nbsp;Void&amp;nbsp;Serialize(System.Object,&amp;nbsp;System.Text.StringBuilder,&lt;/div&gt;&#xD;
&lt;div&gt;SerializationFormat)&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;Stack&amp;nbsp;Trace&amp;nbsp;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在&lt;/div&gt;&#xD;
&lt;div&gt;System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object&amp;nbsp;obj,&lt;/div&gt;&#xD;
&lt;div&gt;StringBuilder&amp;nbsp;output,&amp;nbsp;SerializationFormat&amp;nbsp;serializationFormat)&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;在&amp;nbsp;System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object&lt;/div&gt;&#xD;
&lt;div&gt;obj,&amp;nbsp;SerializationFormat&amp;nbsp;serializationFormat)&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;在&amp;nbsp;System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #cce8cf"&gt;这个异常是在执行MVC中的JsonResult的时抛出的，根据异常的Message得知是序列化的字符串超出了maxJsonLength的限制。并得知这个属性是由JavaScriptSerializer提供的，因为MVC内置的JsonResult是用JavaScriptSerializer进行序列化的。在网上快速搜索了一下，碰到这个问题的童鞋不少，大部分推荐的解决的方法都是在web.config中加入以下配置，设置maxJsonLength的长度即可。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('77fc8ba1-2643-4986-bc6b-4a92ad5db97e')"&gt;&lt;img style="display: none" id="code_img_opened_77fc8ba1-2643-4986-bc6b-4a92ad5db97e"  onclick="cnblogs_code_hide('77fc8ba1-2643-4986-bc6b-4a92ad5db97e',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_77fc8ba1-2643-4986-bc6b-4a92ad5db97e" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.web.extensions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;scripting&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;webServices&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;jsonSerialization&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;maxJsonLength&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="20971520"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;webServices&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;scripting&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.web.extensions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;在自动提示下，很顺畅的加上了几行代码，以为这是个简洁的解决方案，但是运行网站之后报以下错误：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;分析器错误消息: &lt;/strong&gt;&lt;font face="Arial"&gt;无法识别的配置节 system.web.extensions。&lt;/font&gt;&lt;br /&gt;这似乎又是碰到了一家人不认识的情况，既然无法识别为什么能带智能感知的方式输出，而且是已system.web开头的，按道理不会识别不出的。以为是拼写错误，经过进一步搜索之后，原来是缺乏了声明，加上对节点的声明即可（很大一串的内容）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('554cf9c9-07b9-4975-9a07-5de4ebd70324')"&gt;&lt;img style="display: none" id="code_img_opened_554cf9c9-07b9-4975-9a07-5de4ebd70324"  onclick="cnblogs_code_hide('554cf9c9-07b9-4975-9a07-5de4ebd70324',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_554cf9c9-07b9-4975-9a07-5de4ebd70324" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="system.web.extensions"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="System.Web.Configuration.SystemWebExtensionsSectionGroup,&amp;nbsp;System.Web.Extensions,&amp;nbsp;Version=3.5.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=31BF3856AD364E35"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="scripting"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="System.Web.Configuration.ScriptingSectionGroup,&amp;nbsp;System.Web.Extensions,&amp;nbsp;Version=3.5.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=31BF3856AD364E35"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="scriptResourceHandler"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="System.Web.Configuration.ScriptingScriptResourceHandlerSection,&amp;nbsp;System.Web.Extensions,&amp;nbsp;Version=3.5.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=31BF3856AD364E35"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;requirePermission&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;allowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="MachineToApplication"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="webServices"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="System.Web.Configuration.ScriptingWebServicesSectionGroup,&amp;nbsp;System.Web.Extensions,&amp;nbsp;Version=3.5.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=31BF3856AD364E35"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="jsonSerialization"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="System.Web.Configuration.ScriptingJsonSerializationSection,&amp;nbsp;System.Web.Extensions,&amp;nbsp;Version=3.5.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=31BF3856AD364E35"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;requirePermission&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;allowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Everywhere"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="profileService"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="System.Web.Configuration.ScriptingProfileServiceSection,&amp;nbsp;System.Web.Extensions,&amp;nbsp;Version=3.5.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=31BF3856AD364E35"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;requirePermission&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;allowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="MachineToApplication"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="authenticationService"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="System.Web.Configuration.ScriptingAuthenticationServiceSection,&amp;nbsp;System.Web.Extensions,&amp;nbsp;Version=3.5.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=31BF3856AD364E35"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;requirePermission&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;allowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="MachineToApplication"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="roleService"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="System.Web.Configuration.ScriptingRoleServiceSection,&amp;nbsp;System.Web.Extensions,&amp;nbsp;Version=3.5.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=31BF3856AD364E35"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;requirePermission&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;allowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="MachineToApplication"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;加入了声明之后，运行正常，但是问题依旧还在，而且不管&lt;font style="background-color: #cce8cf"&gt;maxJsonLength设置成多大都无效，就算改成1个字符，居然还能跑起来。碰到这个问题只能进一步的搜索。在这篇文章中找到了原委&lt;a href="http://weblogs.asp.net/rashid/archive/2009/03/23/submitting-my-first-bug-after-asp-net-mvc-1-0-rtm-release.aspx"&gt;http://weblogs.asp.net/rashid/archive/2009/03/23/submitting-my-first-bug-after-asp-net-mvc-1-0-rtm-release.aspx&lt;/a&gt;。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #cce8cf"&gt;原来MVC框架内置的JsonResult代码中，在使用&lt;font style="background-color: #cce8cf"&gt;JavaScriptSerializer时，都是采用的默认值，没有从&lt;font style="background-color: #cce8cf"&gt;maxJsonLength&lt;/font&gt;读取值，即忽略了这个配置。要想使用配置中的值，只能自定义一个JsonResult，重写原JsonResult的ExecuteResult方法，于是定义一个ConfigurableJsonResult，代码如下：&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('159d9fff-937a-4729-b12b-03a672a023be')"&gt;&lt;img style="display: none" id="code_img_opened_159d9fff-937a-4729-b12b-03a672a023be"  onclick="cnblogs_code_hide('159d9fff-937a-4729-b12b-03a672a023be',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_159d9fff-937a-4729-b12b-03a672a023be" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;public&amp;nbsp;class&amp;nbsp;ConfigurableJsonResult&amp;nbsp;:&amp;nbsp;JsonResult&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;override&amp;nbsp;void&amp;nbsp;ExecuteResult(ControllerContext&amp;nbsp;context)&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(context&amp;nbsp;==&amp;nbsp;null)&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;ArgumentNullException("context");&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(JsonRequestBehavior&amp;nbsp;==&amp;nbsp;JsonRequestBehavior.DenyGet&amp;nbsp;&amp;amp;&amp;amp;&lt;br /&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String.Equals(context.HttpContext.Request.HttpMethod,&amp;nbsp;"GET",&amp;nbsp;StringComparison.OrdinalIgnoreCase))&lt;br /&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;InvalidOperationException("This&amp;nbsp;request&amp;nbsp;has&amp;nbsp;been&amp;nbsp;blocked&amp;nbsp;because&amp;nbsp;sensitive&amp;nbsp;information&amp;nbsp;could&amp;nbsp;be&amp;nbsp;disclosed&amp;nbsp;to&amp;nbsp;third&amp;nbsp;party&amp;nbsp;web&amp;nbsp;sites&amp;nbsp;when&amp;nbsp;this&amp;nbsp;is&amp;nbsp;used&amp;nbsp;in&amp;nbsp;a&amp;nbsp;GET&amp;nbsp;request.&amp;nbsp;To&amp;nbsp;allow&amp;nbsp;GET&amp;nbsp;requests,&amp;nbsp;set&amp;nbsp;JsonRequestBehavior&amp;nbsp;to&amp;nbsp;AllowGet.");&lt;br /&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpResponseBase&amp;nbsp;response&amp;nbsp;=&amp;nbsp;context.HttpContext.Response;&lt;br /&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!String.IsNullOrEmpty(ContentType))&lt;br /&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.ContentType&amp;nbsp;=&amp;nbsp;ContentType;&lt;br /&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.ContentType&amp;nbsp;=&amp;nbsp;"application/json";&lt;br /&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(ContentEncoding&amp;nbsp;!=&amp;nbsp;null)&lt;br /&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.ContentEncoding&amp;nbsp;=&amp;nbsp;ContentEncoding;&lt;br /&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(Data&amp;nbsp;!=&amp;nbsp;null)&lt;br /&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JavaScriptSerializer&amp;nbsp;serializer&amp;nbsp;=&amp;nbsp;new&amp;nbsp;JavaScriptSerializer();&lt;br /&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red"&gt;ScriptingJsonSerializationSection&amp;nbsp;section&amp;nbsp;=&amp;nbsp;ConfigurationManager.GetSection("system.web.extensions/scripting/webServices/jsonSerialization")&amp;nbsp;as&amp;nbsp;ScriptingJsonSerializationSection;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: red"&gt;35&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(section&amp;nbsp;!=&amp;nbsp;null)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;36&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;37&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serializer.MaxJsonLength&amp;nbsp;=&amp;nbsp;section.MaxJsonLength;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;38&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serializer.RecursionLimit&amp;nbsp;=&amp;nbsp;section.RecursionLimit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;39&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;40&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.Write(serializer.Serialize(Data));&lt;br /&gt;&lt;span style="color: #008080"&gt;42&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;43&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;44&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;关键在红色标记的代码，读取配置的值。JavaScriptSerializer还有其他属性可配置，没有列出与实现，暂时够用。&lt;/p&gt;&#xD;
&lt;p&gt;这样在返回长字符内容的json结果时，直接替换原JsonResult即可，同时也兼顾了可配置的灵活性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #cce8cf"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;font style="background-color: #cce8cf"&gt;&lt;/font&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/shenba/aggbug/2337050.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2012/02/03/2337050.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shenba/archive/2012/01/06/2313932.html</id><title type="text">“无法从http://XXX/XXX.svc?wsdl获取元数据”错误的解决方法</title><summary type="text">昨天在用IIS部署一个WCF服务时，碰到了如下错误：理解了文档内容，但无法进行处理。 - WSDL 文档包含无法解析的链接。 - 下载“http://admin-pc/IISHostService/Service1.svc?xsd=xsd0”时出错。 - 基础连接已经关闭: 接收时发生错误。 - 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。 - 远程主机强迫关闭了一个现有的连接。元数据包含无法解析的引用:“http://admin-pc/IISHostService/Service1.svc?wsdl”。元数据包含无法解析的引用:“http://admin-pc/IISHo</summary><published>2012-01-06T01:32:00Z</published><updated>2012-01-06T01:32:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2012/01/06/2313932.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2012/01/06/2313932.html"/><content type="html">&lt;p&gt;昨天在用IIS部署一个WCF服务时，碰到了如下错误：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;理解了文档内容，但无法进行处理。&lt;br /&gt;&amp;nbsp; - WSDL 文档包含无法解析的链接。&lt;br /&gt;&amp;nbsp; - 下载&amp;#8220;http://admin-pc/IISHostService/Service1.svc?xsd=xsd0&amp;#8221;时出错。&lt;br /&gt;&amp;nbsp; - 基础连接已经关闭: 接收时发生错误。&lt;br /&gt;&amp;nbsp; - 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。&lt;br /&gt;&amp;nbsp; - 远程主机强迫关闭了一个现有的连接。&lt;br /&gt;元数据包含无法解析的引用:&amp;#8220;http://admin-pc/IISHostService/Service1.svc?wsdl&amp;#8221;。&lt;br /&gt;元数据包含无法解析的引用:&amp;#8220;http://admin-pc/IISHostService/Service1.svc?wsdl&amp;#8221;。&lt;br /&gt;如果该服务已在当前解决方案中定义，请尝试生成该解决方案，然后再次添加服务引用。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;该错误是在使用svcutil生成client代码时报的错误，服务是部署在IIS7上，部署的过程都是完全教科书式的进行。服务也正常启动了，显示如下内容&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;已创建服务。 &lt;/strong&gt;&#xD;
&lt;p &gt;&lt;strong&gt;若要测试此服务，需要创建一个客户端，并将其用于调用该服务。可以使用下列语法，从命令行中使用 svcutil.exe 工具来进行此操作:&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;strong&gt;svcutil.exe &lt;/strong&gt;&lt;a href="http://leo-pc/IISHostService/Service1.svc?wsdl"&gt;&lt;strong&gt;http://leo-pc/IISHostService/Service1.svc?wsdl&lt;/strong&gt;&lt;/a&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;按照提示直接用&lt;strong&gt;svcutil.exe &lt;/strong&gt;&lt;a href="http://admin-pc/IISHostService/Service1.svc?wsdl"&gt;&lt;strong&gt;http://admin-pc/IISHostService/Service1.svc?wsdl&lt;/strong&gt;&lt;/a&gt;命令去生成代码，就出现了开头说的那个错误。而如果用visual studio的webdevserver启动，则一切正常。&lt;/p&gt;&#xD;
&lt;p&gt;经过一轮谷百之后，发现网上有很多类似的情况，有的说是因为用了wsHttpBinding协议引起的，或者是元数据没有正确公开，但都不是他们说的情况。后来找到了一篇文章，说的是添加WCF引用的一个陷阱。里面提到的情形跟我遇到的一致，原来问题出在权限，难怪用webdevserver可以很正常的运行。原来在下载&lt;strong&gt;&lt;a href="http://admin-pc/IISHostService/Service1.svc?xsd=xsd0"&gt;http://admin-pc/IISHostService/Service1.svc?xsd=xsd0&lt;/a&gt;&lt;/strong&gt;时的权限不足，在浏览器直接访问这个url会提示找不到页面。原因就是IIS进程的用户没有访问Windows\Temp目录的权限。找到Temp目录，然后找到IIS_USER用户，授权即可。&lt;/p&gt;&#xD;
&lt;p&gt;具体可参考：&lt;a href="http://merill.net/2008/04/wcf-add-service-reference-gotcha-with-windows-server/"&gt;http://merill.net/2008/04/wcf-add-service-reference-gotcha-with-windows-server/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/shenba/aggbug/2313932.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2012/01/06/2313932.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shenba/archive/2011/12/31/2309106.html</id><title type="text">处理WCF异常的方式</title><summary type="text">任何程序都离不开对异常的处理，良好的异常处理方式可加快寻找出异常的根源，同时也需要避免暴露敏感信息到异常中。WCF这种典型的服务端和客户端交互的程序，服务端的异常更需要适当的处理。下面以一个简单的服务为例，说明WCF中处理异常的方式。WCF服务定义如下，很明显方法Divide在divisor为0的时候将会抛出异常View Code publicclassCalculateService:ICalculateService{publicintDivide(intdividend,intdivisor){returndividend/divisor;}publicintAdd(inta,intb.</summary><published>2011-12-31T13:41:00Z</published><updated>2011-12-31T13:41:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2011/12/31/2309106.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2011/12/31/2309106.html"/><content type="html">&lt;p&gt;任何程序都离不开对异常的处理，良好的异常处理方式可加快寻找出异常的根源，同时也需要避免暴露敏感信息到异常中。WCF这种典型的服务端和客户端交互的程序，服务端的异常更需要适当的处理。下面以一个简单的服务为例，说明WCF中处理异常的方式。&lt;/p&gt;&#xD;
&lt;p&gt;WCF服务定义如下，很明显方法Divide在divisor为0的时候将会抛出异常&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('12b8cd8e-6588-45ae-aec7-cebde03ecd13')"&gt;&lt;img style="display: none" id="code_img_opened_12b8cd8e-6588-45ae-aec7-cebde03ecd13"  onclick="cnblogs_code_hide('12b8cd8e-6588-45ae-aec7-cebde03ecd13',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_12b8cd8e-6588-45ae-aec7-cebde03ecd13" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;CalculateService&amp;nbsp;:&amp;nbsp;ICalculateService&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;Divide(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;dividend,&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;divisor)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;dividend&amp;nbsp;/&amp;nbsp;divisor;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;Add(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;a,&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;b)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;a&amp;nbsp;+&amp;nbsp;b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;客户端调用如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('b587e1db-4837-4bbd-af2f-dfd4600c6f78')"&gt;&lt;img style="display: none" id="code_img_opened_b587e1db-4837-4bbd-af2f-dfd4600c6f78"  onclick="cnblogs_code_hide('b587e1db-4837-4bbd-af2f-dfd4600c6f78',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_b587e1db-4837-4bbd-af2f-dfd4600c6f78" &gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;CalculateServiceClient())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(client.Divide(&lt;span style="color: #800080"&gt;20&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(FaultException&amp;nbsp;ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Reason);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;首先需要知道的是，WCF的异常信息默认是以FaultException的形式返回到客户端，FaultException的关键属性Reason是对客户端反馈的最重要信息之一。以上客户端代码调用之后，默认的FaultException返回的Message信息如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: yellow"&gt;由于内部错误，服务器无法处理该请求。有关该错误的详细信息，请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 &amp;lt;serviceDebug&amp;gt; 配置行为)以便将异常信息发送回客户端，或在打开每个 Microsoft .NET Framework 3.0 SDK 文档的跟踪的同时检查服务器跟踪日志。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;根据异常的提示，意思说如果要在客户端看到详细的Exception信息，那么请将ServiceBehavior对应的&lt;font style="background-color: #ffff00"&gt;IncludeExceptionDetailInFaults&lt;/font&gt;属性设置为True，通常在配置中表现为如下设置：&lt;/span&gt;&lt;span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('ed7a0170-5c3e-44ee-86b1-ea926ae2e419')"&gt;&lt;img style="display: none" id="code_img_opened_ed7a0170-5c3e-44ee-86b1-ea926ae2e419"  onclick="cnblogs_code_hide('ed7a0170-5c3e-44ee-86b1-ea926ae2e419',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_ed7a0170-5c3e-44ee-86b1-ea926ae2e419" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;lt;serviceBehaviors&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;behavior&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;serviceMetadata&amp;nbsp;httpGetEnabled=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;True&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;httpGetUrl=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;http://localhost:8733/CalculateService/&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;/&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red"&gt;&amp;lt;serviceDebug&amp;nbsp;includeExceptionDetailInFaults=&lt;/span&gt;&lt;span style="color: red"&gt;"True&lt;/span&gt;&lt;span style="color: red"&gt;"&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/behavior&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/serviceBehaviors&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;通过以上设置之后，客户端输出的内容为&amp;#8220;尝试除以零&amp;#8221;，这个提示信息跟原始的异常信息是一致，即返回的FaultException中的Reason包含原始异常的Message的值，但是这样处理之后服务端所报出的异常信息直接传到了客户端，比如一些保密信息也可能输出到了客户端，因此对于异常信息必须进行一个封装。最直接的形式莫过于在服务端就把异常给捕获了，并重新throw一个FaultException&lt;/p&gt;&#xD;
&lt;p&gt;服务端的代码改进如下，经过以下改进，那么客户端得到的信息仅仅是"操作失败"，同时服务端也记录了异常信息(这时&lt;font style="background-color: #ffff00"&gt;IncludeExceptionDetailInFaults&lt;/font&gt;是设置为False的)。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('629681b3-e8a3-4ca3-86cf-86b9b483d6bb')"&gt;&lt;img style="display: none" id="code_img_opened_629681b3-e8a3-4ca3-86cf-86b9b483d6bb"  onclick="cnblogs_code_hide('629681b3-e8a3-4ca3-86cf-86b9b483d6bb',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_629681b3-e8a3-4ca3-86cf-86b9b483d6bb" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;dividend&amp;nbsp;/&amp;nbsp;divisor;&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&lt;br /&gt;&lt;span style="color: #008080"&gt;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Message);&lt;br /&gt;&lt;span style="color: #008080"&gt;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;FaultException(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;操作失败&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080"&gt;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;当然这是FaultException的默认用法，FaultException还支持强类型的异常错误信息，返回更加丰富和精确的错误提示。假设定义如下通用的一个FaultContract类型，将出错时的用户名和线程名字记录到异常信息中，因为异常信息也是通过SOAP格式传输的，因此跟定义其他DataContract的方式一样。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('508f7b81-c726-4860-955c-acbde4df96fd')"&gt;&lt;img style="display: none" id="code_img_opened_508f7b81-c726-4860-955c-acbde4df96fd"  onclick="cnblogs_code_hide('508f7b81-c726-4860-955c-acbde4df96fd',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_508f7b81-c726-4860-955c-acbde4df96fd" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DataContract]&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;CommonFaultContract&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DataMember]&lt;br /&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;UserName&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DataMember]&lt;br /&gt;&lt;span style="color: #008080"&gt;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;&amp;nbsp;ThreadName&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;那么服务方法的接口需要增加如下标记，如果不这样标记，那么客户端得到的异常类型依然是FaultException，而不是强类型的异常信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: red"&gt;&amp;nbsp;[FaultContract(typeof(CommonFaultContract))]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;int Divide(int dividend, int divisor)&lt;/p&gt;&#xD;
&lt;p&gt;实现方法中抛出异常的部分代码改成如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('e8c9ed67-562b-49bf-88a0-02199a583bf9')"&gt;&lt;img style="display: none" id="code_img_opened_e8c9ed67-562b-49bf-88a0-02199a583bf9"  onclick="cnblogs_code_hide('e8c9ed67-562b-49bf-88a0-02199a583bf9',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_e8c9ed67-562b-49bf-88a0-02199a583bf9" &gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Message);&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;FaultException&amp;lt;CommonFaultContract&amp;gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;CommonFaultContract&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UserName&amp;nbsp;=&amp;nbsp;Environment.UserName,&lt;br /&gt;&lt;span style="color: #008080"&gt;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ThreadName&amp;nbsp;=&amp;nbsp;System.Threading.Thread.CurrentThread.Name&lt;br /&gt;&lt;span style="color: #008080"&gt;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;操作失败&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080"&gt;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;这时候重新生成客户端的代理类，然后更新客户端的代码如下，红色部分即获取强类型的异常错误信息。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('b3fb9056-606a-49bb-8c08-6dfd0e55cc82')"&gt;&lt;img style="display: none" id="code_img_opened_b3fb9056-606a-49bb-8c08-6dfd0e55cc82"  onclick="cnblogs_code_hide('b3fb9056-606a-49bb-8c08-6dfd0e55cc82',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_b3fb9056-606a-49bb-8c08-6dfd0e55cc82" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(client.Divide(&lt;span style="color: #800080"&gt;20&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;));&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(FaultException&amp;lt;CommonFaultContract&amp;gt;&amp;nbsp;ex)&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red"&gt;Console.WriteLine(ex.Detail.ThreadName);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;&amp;nbsp;8&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Detail.UserName);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Reason);&lt;br /&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;当然在具体应用中还需要根据需求，返回不同的信息，构建不同的FaultContract。&lt;/p&gt;&#xD;
&lt;p&gt;以上服务端捕获的异常方法，适用于方法比较少的情况，如果有十多个方法，一个个去写try catch然后做标记等，那么工作量会很大，而且代码也不利于重用。尝试寻找像MVC Controller那样的统一处理Exception的方式，将异常处理都放在基类中，那么只要继承与这个基类的方法都不需要去写try catch去捕获异常。但WCF中似乎没有这样的机制，放弃了这种做法。&lt;/p&gt;&#xD;
&lt;p&gt;最近在研究Enterprise Lib中对WCF的支持时，发现Exception Block中还特地有针对WCF程序异常处理的解决方案，而且满足以上说道的需求，即可记录异常，又可对异常信息进行封装。更重要的时，自动处理运行时的异常信息，不需要挨个方法的去写Try catch。秉承企业库的优秀传统，大部分工作还是通过配置就可以完成了，非常好的解决方案。下面介绍具体的使用步骤。&lt;/p&gt;&#xD;
&lt;p&gt;步骤一：&lt;/p&gt;&#xD;
&lt;p&gt;引用以下dll&lt;/p&gt;&#xD;
&lt;p&gt;Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll &lt;/p&gt;&#xD;
&lt;p&gt;Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.dll &lt;/p&gt;&#xD;
&lt;p&gt;Microsoft.Practices.EnterpriseLibrary.Common.dll &lt;/p&gt;&#xD;
&lt;p&gt;Microsoft.Practices.ObjectBuilder2.dll &lt;/p&gt;&#xD;
&lt;p&gt;步骤2：&lt;/p&gt;&#xD;
&lt;p&gt;在具体的实现类中，增加如下属性标记，其中&lt;font color="#ff0000"&gt;WcfException&lt;span style="color: #000000"&gt;为企业&lt;/span&gt;&lt;span style="color: #000000"&gt;库中Exception Block中的一个异常处理策略，具体如何配置异常处理策略，请参考企业库的帮助文档。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: red"&gt;[ExceptionShielding("WcfException")]&lt;/span&gt;&lt;br /&gt;public class CalculateService : ICalculateService&lt;/p&gt;&#xD;
&lt;p&gt;那么只要增加了&lt;span style="color: red"&gt;[ExceptionShielding("WcfException")]&lt;/span&gt;这个属性标记之后，所有运行时的异常都将交给策略名为WcfException的异常处理block来处理，在这里就可以执行一些异常记录以及异常封装的操作。&lt;/p&gt;&#xD;
&lt;p&gt;步骤3：&lt;/p&gt;&#xD;
&lt;p&gt;将异常信息封装为FaultException，这个动作也是通过配置来完成。在Exception节点中添加一个&lt;strong&gt;Fault Contract Exception Handler。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Fault Contract Exception Handler需要设置以下两个属性值&lt;/p&gt;&#xD;
&lt;p&gt;exceptionMessage：所有异常封装后的错误信息&lt;/p&gt;&#xD;
&lt;p&gt;faultContractType：即返回异常的faltContract类型，这个类型必须指定一个，哪怕方法中没有用到也要，如果方法中有用到，那么客户端那边就能得到强类型FaultException,否则就是普通的FaultException。这里指定为之前定义的&lt;font color="#ff0000"&gt;CommonFaultContract&lt;/font&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;对于faultContract类型的值，还可以通过&lt;span&gt;&lt;strong&gt;PropertyMappings&lt;/strong&gt;&lt;/span&gt;来自定义需要从原始异常信息中映射到faultContract的属性中，这个属性可选。&lt;/p&gt;&#xD;
&lt;p&gt;经过以上步骤配置之后，服务端的程序就具备了自动处理异常的功能。客户端还是跟往常那样调用，不过具体是用FaultException捕获异常还是FaultException&amp;lt;T&amp;gt;去捕获异常，还得根据定义方法中是否标记了FaultContract。之后若定义了其他服务接口，同样也仅仅需要在实现类上加上&lt;span style="color: red"&gt;[ExceptionShielding("WcfException")]&lt;/span&gt;&lt;span style="color: #000000"&gt;标记即可。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(图片后续补上)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/shenba/aggbug/2309106.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2011/12/31/2309106.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shenba/archive/2011/12/29/2306739.html</id><title type="text">WCF中校验参数的实现方式（二）</title><summary type="text">上接方法一实现的第二种方法是利用企业库提供的针对WCF程序的validation block，如果之前有用过企业库的validation模块，那么在WCF中用起来就非常简单，在WCF中要做的大部分都是配置工作。步骤一，引用相关的dllMicrosoft.Practices.EnterpriseLibrary.Common.dllMicrosoft.Practices.EnterpriseLibrary.Validation.dllMicrosoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll步骤二，在指定的接口中设置一个</summary><published>2011-12-29T14:30:00Z</published><updated>2011-12-29T14:30:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2011/12/29/2306739.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2011/12/29/2306739.html"/><content type="html">&lt;p&gt;上接&lt;a title="方法一" href="http://www.cnblogs.com/shenba/archive/2011/12/28/2305413.html"&gt;方法一&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;实现的第二种方法是利用企业库提供的针对WCF程序的validation block，如果之前有用过企业库的validation模块，那么在WCF中用起来就非常简单，在WCF中要做的大部分都是配置工作。&lt;/p&gt;&#xD;
&lt;p&gt;步骤一，引用相关的dll&lt;/p&gt;&#xD;
&lt;p&gt;Microsoft.Practices.EnterpriseLibrary.Common.dll&lt;/p&gt;&#xD;
&lt;p&gt;Microsoft.Practices.EnterpriseLibrary.Validation.dll&lt;/p&gt;&#xD;
&lt;p&gt;Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll&lt;/p&gt;&#xD;
&lt;p&gt;步骤二，在指定的接口中设置一个ValidationBehavior属性标记，该标记的目的是表明方法参数中包含需要验证逻辑。当然ValitionBehavior也可以通过配置文件形式注入，具体可参考上一篇&lt;a href="http://www.cnblogs.com/shenba/archive/2011/12/29/2306541.html"&gt;博客内容&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: none" id="code_img_opened_c98acf61-cc56-4b9a-b0fb-245a276eef9a"  onclick="cnblogs_code_hide('c98acf61-cc56-4b9a-b0fb-245a276eef9a',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('c98acf61-cc56-4b9a-b0fb-245a276eef9a')"&gt;&#xD;
&lt;div id="cnblogs_code_open_c98acf61-cc56-4b9a-b0fb-245a276eef9a" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ServiceContract]&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: red"&gt;ValidationBehavior]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;interface&lt;/span&gt;&amp;nbsp;ITradeService&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;步骤三，在需要验证的参数上标记验证属性，以及给方法标记FaultContract。如果有多个参数，以此给指定参数加标记即可。对于FaultContract中必须指定，这样才能将验证信息返回。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('cd26ba84-1434-477a-a80e-63f9e5c570bb')"&gt;&lt;img style="display: none" id="code_img_opened_cd26ba84-1434-477a-a80e-63f9e5c570bb"  onclick="cnblogs_code_hide('cd26ba84-1434-477a-a80e-63f9e5c570bb',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_cd26ba84-1434-477a-a80e-63f9e5c570bb" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;[&lt;span style="color: red"&gt;FaultContract(&lt;/span&gt;&lt;span style="color: red"&gt;typeof&lt;/span&gt;&lt;span style="color: red"&gt;(ValidationFault))]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;TradeSomething(&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red"&gt;[StringLengthValidator(&lt;/span&gt;&lt;span style="color: red"&gt;10&lt;/span&gt;&lt;span style="color: red"&gt;,&amp;nbsp;MessageTemplate&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: red"&gt;"&lt;/span&gt;&lt;span style="color: red"&gt;ths&amp;nbsp;length&amp;nbsp;of&amp;nbsp;qutoeName&amp;nbsp;must&amp;nbsp;less&amp;nbsp;than&amp;nbsp;{0}&lt;/span&gt;&lt;span style="color: red"&gt;"&lt;/span&gt;&lt;span style="color: red"&gt;)]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;quoteName);&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;到此，服务单的配置就完成了。&lt;/p&gt;&#xD;
&lt;p&gt;接下来说一下客户端的如何获取错误信息。&lt;/p&gt;&#xD;
&lt;p&gt;类似其他服务，通过svcutil生成得到一个客户端类，然后如果按往常那样处理FaultException，将得不到正确的错误提示。如下代码得到的信息是&amp;#8220;此错误的创建者没有指定原因&amp;#8221;。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('5474d4ae-8cb5-42dc-b14e-70570a0bbe10')"&gt;&lt;img style="display: none" id="code_img_opened_5474d4ae-8cb5-42dc-b14e-70570a0bbe10"  onclick="cnblogs_code_hide('5474d4ae-8cb5-42dc-b14e-70570a0bbe10',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_5474d4ae-8cb5-42dc-b14e-70570a0bbe10" &gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;TradeServiceClient())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(client.TradeSomething(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ztejlkfjdslakfjdlskag&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;对于企业库返回的FaultException的错误信息，需要特殊处理，对catch部分的代码做如下修改即可&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('08c06af5-a826-4d06-bf83-ff4983384456')"&gt;&lt;img style="display: none" id="code_img_opened_08c06af5-a826-4d06-bf83-ff4983384456"  onclick="cnblogs_code_hide('08c06af5-a826-4d06-bf83-ff4983384456',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_08c06af5-a826-4d06-bf83-ff4983384456" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;TradeServiceClient())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(client.TradeSomething(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ztejlkfjdslakfjdlskag&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red"&gt;catch&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;(System.ServiceModel.FaultException&amp;lt;ValidationFault&amp;gt;&amp;nbsp;ex)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red"&gt;foreach&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: red"&gt;var&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;item&amp;nbsp;&lt;/span&gt;&lt;span style="color: red"&gt;in&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;ex.Detail.Details)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(item.Message);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;这里需要强调的是，&lt;font color="#ff0000"&gt;ValidationFault&lt;/font&gt;的类型必须跟服务用的一致，要么使用svcutil中自动生成的类型，或者直接引用企业库的dll。当引用企业库的dll之后，就不能使用svcutil生成的&lt;font color="#ff0000"&gt;ValidationFault&lt;/font&gt;类型，否则无法正确接收错误提示。&lt;/p&gt;&lt;font style="background-color: #ffffff"&gt;&lt;/font&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/shenba/aggbug/2306739.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2011/12/29/2306739.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shenba/archive/2011/12/29/2306541.html</id><title type="text">WCF中使用自定义behavior提示错误的解决方法</title><summary type="text">WCF中支持自定义behavior，可通过配置的方式给endpoint或者service设置behavior。配置方法就是在system.serviceModel/extensions/behaviorExtensions节点下注册自定义的behavior，之后就可以在behaviors节点中使用。注册的配置如下注册自定义Behavior 1&amp;lt;extensions&amp;gt;2&amp;lt;behaviorExtensions&amp;gt;3&amp;lt;addname=&amp;quot;validation&amp;quot;4type=&amp;quot;Microsoft.Practices.EnterpriseLibrar</summary><published>2011-12-29T10:38:00Z</published><updated>2011-12-29T10:38:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2011/12/29/2306541.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2011/12/29/2306541.html"/><content type="html">&lt;p&gt;WCF中支持自定义behavior，可通过配置的方式给endpoint或者service设置behavior。配置方法就是在system.serviceModel/extensions/behaviorExtensions节点下注册自定义的behavior，之后就可以在behaviors节点中使用。注册的配置如下&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('1579db03-a3a9-4d82-bf19-688c6ed0ca2a')"&gt;&lt;img style="display: none" id="code_img_opened_1579db03-a3a9-4d82-bf19-688c6ed0ca2a"  onclick="cnblogs_code_hide('1579db03-a3a9-4d82-bf19-688c6ed0ca2a',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_1579db03-a3a9-4d82-bf19-688c6ed0ca2a" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;lt;extensions&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;behaviorExtensions&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add&amp;nbsp;name=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;validation&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.ValidationElement,&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF,&lt;br /&gt;&lt;span style="color: #008080"&gt;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Version=&lt;span style="color: #800080"&gt;4.1&lt;/span&gt;.&lt;span style="color: #800080"&gt;0.0&lt;/span&gt;,&amp;nbsp;Culture=neutral,&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PublicKeyToken=31bf3856ad364e35&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/behaviorExtensions&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/extensions&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;这里用的是企业库中用于支持WCF验证的behavior扩展。&lt;/p&gt;&#xD;
&lt;p&gt;按照enterpise library 4.1版本中的帮助文档描述是这样配置的，但是运行时却出现以下错误：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: red"&gt;参数名: element (E:\aspnet\WcfService\TestParameterValidate\bin\Debug\TestParameterValidate.dll.config line 34) ---&amp;gt; System.ArgumentException: 无法将扩展元素&amp;#8220;validation&amp;#8221;添加到此元素中。请验证该扩展是否已在 system.serviceModel/extensions/behaviorExtensions 中的扩展集合中注册。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;出现这种错误的只可能是拼写错误了，但那段配置可是从企业库的帮助文档中拷贝的，难道WCF不认企业库的dll，那可都是一家的产品。回想起之前写过一个自定义的behavior，也有这个问题，那么确定不是企业库的问题，问题还是在于WCF的配置。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;经过搜索，在园子里的一篇文章提到了这个问题(&lt;a href="http://www.cnblogs.com/hxw/archive/2009/09/17/1331641.html"&gt;http://www.cnblogs.com/hxw/archive/2009/09/17/1331641.html&lt;/a&gt;),说这是WCF的bug，配置中对于type的字符串必须严格按照规范来写，而且不能有换行等。照着这个思路，把type工工整整地写了一遍，还是报同样的错误，真让人崩溃。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;这时想到了用WCF的配置工具，这个工具是.NET提供的，专门用于配置config中的WCF配置内容。调出的方法是对着配置文件，点击右键，然后选择"编辑WCF配置"。打开之后，所有内容都在掌控之中了。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;配置extensions如下步骤：&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;第一步选择行为元素扩展：&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/shenba/sep1.jpg" /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;第二步点击右下方的"新建"按钮，在弹出的界面中选择自定义的类型&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/shenba/sep2.jpg" width="551" height="211" /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;点击确定之后，保存即可。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;经过配置之后，工具生成的配置代码如下，咋一看没什么区别，但重要的是，能运行起来而且不会报错。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #000000"&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('c9ee49e6-cc0a-4a02-b2ee-117968286f12')"&gt;&lt;img style="display: none" id="code_img_opened_c9ee49e6-cc0a-4a02-b2ee-117968286f12"  onclick="cnblogs_code_hide('c9ee49e6-cc0a-4a02-b2ee-117968286f12',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_c9ee49e6-cc0a-4a02-b2ee-117968286f12" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;lt;behaviorExtensions&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add&amp;nbsp;name=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;validation&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;type=&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.ValidationElement,&amp;nbsp;Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF,&amp;nbsp;Version=4.1.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=31bf3856ad364e35&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;/&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/behaviorExtensions&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/shenba/aggbug/2306541.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2011/12/29/2306541.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shenba/archive/2011/12/28/2305413.html</id><title type="text">WCF中校验参数的实现方式（一）</title><summary type="text">WCF中对方法参数的校验实现方式</summary><published>2011-12-28T13:55:00Z</published><updated>2011-12-28T13:55:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2011/12/28/2305413.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2011/12/28/2305413.html"/><content type="html">&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;&amp;nbsp;&amp;nbsp; 在用WCF写服务程序时，有时候需要做一些参数的校验，当然这些参数校验可放到调用端处理，但服务为了保险起见也需要有对参数的校验处理。如果服务不多，那么可直接在服务的方法中去校验，然后直接扔个异常或者返回错误结果。但这种针对单个方法写得校验不可重用，希望能有一种类似model校验的方式，加个标记或者属性配置一下就可以。毕竟校验这块不是WCF的重点内容，将校验代码放入到服务实现中也不太合理。WCF提供了一些扩展的地方，可以在运行时去校验参数是否合法，通过定义一些behavior，然后加在需要校验的方法上就可实现对方法参数的校验。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;下面说说WCF中两种校验输入参数的实现方法。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;方法一：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;自定义校验方法的behavior，然后将这个behavior作为属性标记在接口的方法上。具体涉及到的接口有IParameterInspector，IOperationBehavior。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;IParameterInspector&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;很明显就是用于对参数的检测，具体对参数的检测都是在这个接口的BeforeCall方法中实现。下面定义的是一个对参数长度的校验实现，当校验失败后通过返回异常的方式传递错误信息。其中ParameterIndex是参数的索引，MaxLength只参数的最大长度。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('2a872495-4407-4b71-b15b-e6c69c3c4e28')"&gt;&lt;img style="display: none" id="code_img_opened_2a872495-4407-4b71-b15b-e6c69c3c4e28"  onclick="cnblogs_code_hide('2a872495-4407-4b71-b15b-e6c69c3c4e28',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_2a872495-4407-4b71-b15b-e6c69c3c4e28" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;LengthParameterInspector&amp;nbsp;:&amp;nbsp;IParameterInspector&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;ParameterIndex&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;MaxLength&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;LengthParameterInspector(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;parameterIndex,&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;maxLength)&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ParameterIndex&amp;nbsp;=&amp;nbsp;parameterIndex;&lt;br /&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.MaxLength&amp;nbsp;=&amp;nbsp;maxLength;&lt;br /&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;AfterCall(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;operationName,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[]&amp;nbsp;outputs,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;returnValue,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;correlationState)&lt;br /&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;throw&amp;nbsp;new&amp;nbsp;NotImplementedException();&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;BeforeCall(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;operationName,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[]&amp;nbsp;inputs)&lt;br /&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(inputs.Length&amp;nbsp;&amp;lt;&amp;nbsp;ParameterIndex)&lt;br /&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;input&amp;nbsp;=&amp;nbsp;inputs[ParameterIndex]&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(input&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(input.Length&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.MaxLength)&lt;br /&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;FaultException(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;the&amp;nbsp;length&amp;nbsp;of&amp;nbsp;parameter&amp;nbsp;{0}&amp;nbsp;must&amp;nbsp;less&amp;nbsp;than&amp;nbsp;{1}&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;ParameterIndex.ToString(),&amp;nbsp;MaxLength.ToString()));&lt;br /&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080"&gt;36&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;37&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;font style="background-color: #ffffff"&gt;&lt;/font&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;IOperationBehavior&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;就是用于方法的行为接口，通过ApplyDispatchBehavior方法加入实现了&lt;font style="background-color: #c7edcc"&gt;IParameterInspector的实例（红色部分代码）。实际上是一个Attribute，那么就可以直接用在服务的方法中。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('706ae719-9177-4c4b-82eb-87c508698815')"&gt;&lt;img style="display: none" id="code_img_opened_706ae719-9177-4c4b-82eb-87c508698815"  onclick="cnblogs_code_hide('706ae719-9177-4c4b-82eb-87c508698815',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_706ae719-9177-4c4b-82eb-87c508698815" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;[AttributeUsage(AttributeTargets.Method,&amp;nbsp;AllowMultiple&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;LengthValidateBehavior:&amp;nbsp;Attribute,&amp;nbsp;IOperationBehavior&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;parameterIndex;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;maxLength;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;LengthValidateBehavior(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;parameterIndex,&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;maxLength)&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.parameterIndex&amp;nbsp;=&amp;nbsp;parameterIndex;&lt;br /&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.maxLength&amp;nbsp;=&amp;nbsp;maxLength;&lt;br /&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;AddBindingParameters(OperationDescription&amp;nbsp;operationDescription,&amp;nbsp;System.ServiceModel.Channels.BindingParameterCollection&amp;nbsp;bindingParameters)&lt;br /&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;throw&amp;nbsp;new&amp;nbsp;NotImplementedException();&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;ApplyClientBehavior(OperationDescription&amp;nbsp;operationDescription,&amp;nbsp;System.ServiceModel.Dispatcher.ClientOperation&amp;nbsp;clientOperation)&lt;br /&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;throw&amp;nbsp;new&amp;nbsp;NotImplementedException();&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;ApplyDispatchBehavior(OperationDescription&amp;nbsp;operationDescription,&amp;nbsp;System.ServiceModel.Dispatcher.DispatchOperation&amp;nbsp;dispatchOperation)&lt;br /&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red"&gt;dispatchOperation.ParameterInspectors.Add(&lt;/span&gt;&lt;span style="color: red"&gt;new&lt;/span&gt;&lt;span style="color: red"&gt;&amp;nbsp;LengthParameterInspector(parameterIndex,&amp;nbsp;maxLength));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;throw&amp;nbsp;new&amp;nbsp;NotImplementedException();&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;Validate(OperationDescription&amp;nbsp;operationDescription)&lt;br /&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;throw&amp;nbsp;new&amp;nbsp;NotImplementedException();&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;具体在方法中的使用如下，即校验第一个参数的长度，最大长度不能超过10个字。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('7741bc38-75a9-49f3-bd32-d8c0ace38428')"&gt;&lt;img style="display: none" id="code_img_opened_7741bc38-75a9-49f3-bd32-d8c0ace38428"  onclick="cnblogs_code_hide('7741bc38-75a9-49f3-bd32-d8c0ace38428',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_7741bc38-75a9-49f3-bd32-d8c0ace38428" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ServiceContract]&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;interface&lt;/span&gt;&amp;nbsp;ITradeService&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[OperationContract]&lt;br /&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red"&gt;[LengthValidateBehavior(&lt;/span&gt;&lt;span style="color: red"&gt;0&lt;/span&gt;&lt;span style="color: red"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: red"&gt;10&lt;/span&gt;&lt;span style="color: red"&gt;)]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;TradeSomething(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;quoteName);&lt;br /&gt;&lt;span style="color: #008080"&gt;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;完成以上步骤之后，就可实现简单的参数校验。但这种方式对于多参数时，不好使，因为WCF中不支持对同一个方法定义多个相同类型的Behavior,即使Attribute中指定了AllowMultiple=true也无效。&lt;/p&gt;&#xD;
&lt;p&gt;下面介绍第二种方法，借助企业库的校验模块实现对参数校验。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;方法二：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;后续更新&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shenba/aggbug/2305413.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2011/12/28/2305413.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shenba/archive/2011/12/20/2294177.html</id><title type="text">WCF使用时碰到个莫名其妙的异常</title><summary type="text">昨天在调试WCF服务时，碰到个异常，异常信息都让人看不懂。之前也没碰到过，折腾了一会才弄明白原因。 像往常一样创建一个WCF库，就是可直接调试的那种WCF服务。然后加入了一个服务，该服务还用到了复杂自定义类型作为DataContract，并像往常一样启动调试，居然蹦出了一个错误提示框，里面有一些错误信息，命名空间“TestNamespace.System”中不存在类型或命名空间名称“Runtime”(是缺少程序集引用吗?)，如下图：其中TestNamespace.System命名空间下是复杂类型所在的命名空间。出现这样的错误，一时让人毫无头绪。为什么回去自定义类型中去寻找Runtime和...</summary><published>2011-12-20T01:48:00Z</published><updated>2011-12-20T01:48:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2011/12/20/2294177.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2011/12/20/2294177.html"/><content type="html">&lt;p&gt;昨天在调试WCF服务时，碰到个异常，异常信息都让人看不懂。之前也没碰到过，折腾了一会才弄明白原因。&lt;/p&gt;&#xD;
&lt;p&gt;像往常一样创建一个WCF库，就是可直接调试的那种WCF服务。然后加入了一个服务，该服务还用到了复杂自定义类型作为DataContract，并像往常一样启动调试，居然蹦出了一个错误提示框，里面有一些错误信息，&amp;nbsp;命名空间&amp;#8220;TestNamespace.System&amp;#8221;中不存在类型或命名空间名称&amp;#8220;Runtime&amp;#8221;(是缺少程序集引用吗?)，如下图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/shenba/errwcf.jpg" width="504" height="288" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其中TestNamespace.System命名空间下是复杂类型所在的命名空间。出现这样的错误，一时让人毫无头绪。为什么回去自定义类型中去寻找Runtime和CodeDom这些东西呢？看起来像要实现什么动态处理的功能，或者动态代码生成。于是问题定位在自己定义的复杂类型中，去掉相关的引用后，改成系统的内置简单类型之后，就不出异常了。但总不能都用简单类型吧，之前也有这样的用法，都是OK的。&lt;br /&gt;　　最后求助万能的古戈，发现问题居然是出在命名空间上。原来是命名空间中包含了System关键字，然后系统在运行时会把用户自定义的System命名空间当做了系统内置的System命名空间，然后很自然的去寻找相关的系统类型，结果报出以上错误。更改命名空间的名字之后，问题解决。具体可参见&lt;a href="http://stackoverflow.com/questions/3037098/compile-error-the-type-or-namespace-name-runtime-does-not-exist-in-the-names"&gt;http://stackoverflow.com/questions/3037098/compile-error-the-type-or-namespace-name-runtime-does-not-exist-in-the-names&lt;/a&gt;中二楼的回复内容。&lt;/p&gt;&#xD;
&lt;p&gt;估计.NET中就是这么规定的，其他方面应该也会有这方面的限制，避免有这些关键字就OK了。不过提示信息确实不够明确，让人看不懂。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shenba/aggbug/2294177.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2011/12/20/2294177.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shenba/archive/2011/12/08/2281340.html</id><title type="text">Request.QueryString与一般NameValueCollection的区别</title><summary type="text">最近在做一个搜索程序的优化改进，将搜索结果按照查询的参数不同进行缓存。缓存的Key很自然的就想到了用查询字符串，而获取查询字符串的最简单方式是通过Request.QueryString.ToString()方法。查看了QueryString的定义类型是NameValueCollection，就误以为这是NameValueCollection的重写了ToString()的方法，于是放心地将代码转移到了业务逻辑层。因为还要重构查询参数，因此重新构建了一个NameValueCollection，并想当然地用ToString()的结果作为Key。但实际运行之后发现，每次的结果都一样的，都是第一次的..</summary><published>2011-12-08T15:04:00Z</published><updated>2011-12-08T15:04:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2011/12/08/2281340.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2011/12/08/2281340.html"/><content type="html">&lt;p&gt;最近在做一个搜索程序的优化改进，将搜索结果按照查询的参数不同进行缓存。缓存的Key很自然的就想到了用查询字符串，而获取查询字符串的最简单方式是通过Request.QueryString.ToString()方法。查看了QueryString的定义类型是NameValueCollection，就误以为这是NameValueCollection的重写了ToString()的方法，于是放心地将代码转移到了业务逻辑层。因为还要重构查询参数，因此重新构建了一个NameValueCollection，并想当然地用ToString()的结果作为Key。但实际运行之后发现，每次的结果都一样的，都是第一次的查询结果。经调试，发现NameValueCollection的ToString()方法并没有重新，还是返回的是&amp;#8220;System.Collections.Specialized.NameValueCollection&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;先看看调试时的情况，发现QueryString的实际类型是System.Web.HttpValueCollection,该类型继承自NameObjectCollectionBase,跟NameValueCollection的基类是一样的。那么最有可能的就是QueryString直接继承了NameValueCollection，并且重写了ToString()的方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/shenba/tiaoshi.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;普通NameValueCollection的表现如下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/shenba/nomarl.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根据以上判断基本为什么QueryString表面上看起来是NameValueCollection但又实际上表现出不同的ToString表现。&lt;/p&gt;&#xD;
&lt;p&gt;接下来继续了解一下System.Web.HttpValueCollection是何方神圣。该类用起来似乎很方便，也尝试在代码中使用，但提示找不到类。在MSDN中也没有明确该类的记录，可以基本判定为私有的类型或者受保护的。搜索之后发现，该类是的完整定义是System.Web.HttpValueCollection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a，只能通过反射的方式访问或修改该类型。因此想用这个类的话，基本上是比较麻烦，不太值得。但是在一般开发者眼中，都希望查询字符串的和NameValueCollection能很顺畅的进行呼唤，通过ToString()的简单方式就能获得。目前要实现两者的转换有以下方式&lt;/p&gt;&#xD;
&lt;p&gt;从查询字符串内容转换到NameValueCollection&lt;/p&gt;&#xD;
&lt;p&gt;HttpUtility.ParseQueryString(querystring);(参考&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms150046(v=VS.90).aspx"&gt;http://msdn.microsoft.com/zh-cn/library/ms150046(v=VS.90).aspx&lt;/a&gt;)，这种方式得到的就是正品QueryString,ToString()后为所实际的值。&lt;/p&gt;&#xD;
&lt;p&gt;从NameValueCollection转化的为查询字符串&lt;/p&gt;&#xD;
&lt;p&gt;只能遍历NameValueCollection，然后自个拼出一个查询字符串了&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('9b1ced27-489d-4571-90ee-b17d7d629fad')"&gt;&lt;img style="display: none" id="code_img_opened_9b1ced27-489d-4571-90ee-b17d7d629fad"  onclick="cnblogs_code_hide('9b1ced27-489d-4571-90ee-b17d7d629fad',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_9b1ced27-489d-4571-90ee-b17d7d629fad" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;key&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;c.Keys)&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;{0}={1}&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;key,&amp;nbsp;c[key]);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;但实际上我们希望有更自然的方式，因为往往我们跟乐于操作可读写的NameValueCollection，而不是只读的QueryString。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;老外对此也提出了意见，具体可参考&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/paulomorgado/archive/2008/07/15/make-the-httpvaluecollection-class-public-and-move-it-to-system-dll.aspx"&gt;http://msmvps.com/blogs/paulomorgado/archive/2008/07/15/make-the-httpvaluecollection-class-public-and-move-it-to-system-dll.aspx&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shenba/aggbug/2281340.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2011/12/08/2281340.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shenba/archive/2011/11/29/2268259.html</id><title type="text">const和readonly内部区别</title><summary type="text">const和readonly关键字也是面试中经常考到的问题，通常都是用来表示一个不可变的变量成员，那么具体区别是什么？从用法上说，const只能以inline代码的形式定义，而readonly既可以以inline代码形式定义也可以通过构造方法定义。CLR中定义，readonly的变量只能在构造方法中赋值，而C#中inline代码实际上是构造方法调用的一部分，因此readonly的变量可以以inline的方式赋值。以上是语法方面的应用，那在实际上的用法上，还是有些微妙的变化，通常不易发觉，请看下面的代码在程序集ConstLib.dll中有一个类MyClass，定义了一个公开的静态变量MaxCou</summary><published>2011-11-29T13:04:00Z</published><updated>2011-11-29T13:04:00Z</updated><author><name>神八</name><uri>http://www.cnblogs.com/shenba/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shenba/archive/2011/11/29/2268259.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shenba/archive/2011/11/29/2268259.html"/><content type="html">&lt;p&gt;const和readonly关键字也是面试中经常考到的问题，通常都是用来表示一个不可变的变量成员，那么具体区别是什么？从用法上说，const只能以inline代码的形式定义，而readonly既可以以inline代码形式定义也可以通过构造方法定义。CLR中定义，readonly的变量只能在构造方法中赋值，而C#中inline代码实际上是构造方法调用的一部分，因此readonly的变量可以以inline的方式赋值。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;以上是语法方面的应用，那在实际上的用法上，还是有些微妙的变化，通常不易发觉，请看下面的代码&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;在程序集ConstLib.dll中有一个类MyClass，定义了一个公开的静态变量MaxCount&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('adfb5e4b-1ddf-479e-9d49-2c19d3a103af')"&gt;&lt;img style="display: none" id="code_img_opened_adfb5e4b-1ddf-479e-9d49-2c19d3a103af"  onclick="cnblogs_code_hide('adfb5e4b-1ddf-479e-9d49-2c19d3a103af',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_adfb5e4b-1ddf-479e-9d49-2c19d3a103af" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;MyClass&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;MaxCount&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;20&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;然后另外一个应用程序ConstTest.exe 引用constLib.dll，并在代码中作如下调用&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('deca3b68-3e04-4051-bdb9-c2b2a1f6e15e')"&gt;&lt;img style="display: none" id="code_img_opened_deca3b68-3e04-4051-bdb9-c2b2a1f6e15e"  onclick="cnblogs_code_hide('deca3b68-3e04-4051-bdb9-c2b2a1f6e15e',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_deca3b68-3e04-4051-bdb9-c2b2a1f6e15e" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;Main(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[]&amp;nbsp;args)&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(MyClass.MaxCount);&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadLine();&lt;br /&gt;&lt;span style="color: #008080"&gt;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;毫无疑问，非常简单的代码，直接输出20。&lt;/p&gt;&#xD;
&lt;p&gt;接下来更新MyClass的MaxCount的值为30，然后重新编译ConstLib.dll，并更新到应用程序的所在目录中，注意不能编译应用程序。那么这时候的输出结果按预期那么想应该是30才对，但实际上还是20，为什么呢？&lt;/p&gt;&#xD;
&lt;p&gt;这就是const的特别之处，有多特别还是直接看生成的IL，查看ConstTestIL代码(假设这时候MaxCount的值为20)&lt;/p&gt;&#xD;
&lt;p&gt;IL_0000:&amp;nbsp; nop&lt;br /&gt;&lt;span style="color: red"&gt;IL_0001:&amp;nbsp; ldc.i4.s&amp;nbsp;&amp;nbsp; 20&lt;/span&gt;&lt;br /&gt;IL_0003:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void [mscorlib]System.Console::WriteLine(int32)&lt;/p&gt;&#xD;
&lt;p&gt;红色代码很明显的表明了，直接加载20，没有通过任何类型的加载然后得到对应变量的，也就是说在运行时没有去加载ConstLib.dll，那么是否意味着没有ConstLib.dll也可以运行呢？答案是肯定的，删除ConstLib.dll也可以运行，是否很诡异呢？也就解释了之前的实验，为什么更新const变量的值之后没有调用新的值，因为ConstText.exe在运行的时候根本不会去加载ConstLib.dll。那么20这个值是从哪来的呢？实际上CLR对于const变量做了特殊处理，是将const的值直接嵌入在生成的IL代码中，在执行的时候不会再去请求dll加载。这也带来了一个不容易发觉的bug，因此在引用其他程序集的const变量时，需考虑到版本更新问题，要解决这个问题就是把调用的应用程序再编译一次就ok了。但实际程序部署更新时可能只更新个别文件，这时候就必须用readonly关键字来解决这个问题。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;接下来看readonly的版本&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('c58ac864-53ea-4687-9f11-7130e3d5d4ed')"&gt;&lt;img style="display: none" id="code_img_opened_c58ac864-53ea-4687-9f11-7130e3d5d4ed"  onclick="cnblogs_code_hide('c58ac864-53ea-4687-9f11-7130e3d5d4ed',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_c58ac864-53ea-4687-9f11-7130e3d5d4ed" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;MyClass&lt;br /&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;MaxCount&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;20&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;调用方代码不变，接着看看ConstTest.exe生成的IL代码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: red"&gt;&amp;nbsp; IL_0001:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int32 [ConstLib]ConstLib.MyClass::MaxCount&lt;/span&gt;&lt;br /&gt;&amp;nbsp; IL_0006:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void [mscorlib]System.Console::WriteLine(int32)&lt;/p&gt;&#xD;
&lt;p&gt;很明显加载代码变了，一个很常见的ldsfld动作，请求了&lt;font color="#ff0000"&gt;ConstLib.MyClass&lt;/font&gt;的MaxCount变量，是通过强制要求加载ConstLib来实现的。因此这时候更新MaxCount的值重新编译之后，ConstText.exe还是不编译，然后再执行就会看到新的值。而这时候如果删除ConstLib.dll那么，会出现运行时报错找不到dll之类的异常。这也充分说明了对于readonly定义的变量是在运行时加载的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;总结const和readonly的最大区别(除语法外)&lt;/p&gt;&#xD;
&lt;p&gt;const的变量时嵌入在IL代码中，编译时就加载好，不依赖外部dll（这也是为什么不能在构造方法中赋值）。const在程序集更新时容易产生版本不一致的不管。&lt;/p&gt;&#xD;
&lt;p&gt;readonly的变量是在运行时加载，需请求加载dll，每次都获取最新的值。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;font style="background-color: #ffffff"&gt;&lt;/font&gt; &lt;img src="http://www.cnblogs.com/shenba/aggbug/2268259.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shenba/archive/2011/11/29/2268259.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
