<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>简单生活 -- Kevin Yang的博客 &#187; WCF</title>
	<atom:link href="http://www.imkevinyang.com/tags/wcf/feed" rel="self" type="application/rss+xml" />
	<link>http://www.imkevinyang.com</link>
	<description>It&#039;s all about sharing</description>
	<lastBuildDate>Sun, 05 Feb 2012 15:37:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>枚举导致的WCF Web Service接口返回异常</title>
		<link>http://www.imkevinyang.com/2009/08/%e6%9e%9a%e4%b8%be%e5%af%bc%e8%87%b4%e7%9a%84wcf-web-service%e6%8e%a5%e5%8f%a3%e8%bf%94%e5%9b%9e%e5%bc%82%e5%b8%b8.html</link>
		<comments>http://www.imkevinyang.com/2009/08/%e6%9e%9a%e4%b8%be%e5%af%bc%e8%87%b4%e7%9a%84wcf-web-service%e6%8e%a5%e5%8f%a3%e8%bf%94%e5%9b%9e%e5%bc%82%e5%b8%b8.html#comments</comments>
		<pubDate>Sun, 23 Aug 2009 13:44:58 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[异常]]></category>
		<category><![CDATA[枚举]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2009/08/%e6%9e%9a%e4%b8%be%e5%af%bc%e8%87%b4%e7%9a%84wcf-web-service%e6%8e%a5%e5%8f%a3%e8%bf%94%e5%9b%9e%e5%bc%82%e5%b8%b8.html</guid>
		<description><![CDATA[<p>枚举在DotNet中是一个比较特别的类型，因为你可以将任意整数赋值给一个枚举类，而不会导致编译或者运行时异常。不知道为什么要这样设计，感觉在这样的设计下，枚举类就变成弱类型了，丧失了类型安全检测了。曾经就有一次在Silverlight项目中遇到了和枚举类这个设计相关的奇怪问题，调试了半天才解决。</p>
<p>当时&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>枚举在DotNet中是一个比较特别的类型，因为你可以将任意整数赋值给一个枚举类，而不会导致编译或者运行时异常。不知道为什么要这样设计，感觉在这样的设计下，枚举类就变成弱类型了，丧失了类型安全检测了。曾经就有一次在Silverlight项目中遇到了和枚举类这个设计相关的奇怪问题，调试了半天才解决。</p>
<p>当时的症状是这样的，客户端Silverlight程序（当时是Silverlight 2.0 RTM）在调用Web Service返回的时候抛出了一个CommunicationException，这个错误没能提供任何信息，Silverlight把所有的Web Service的异常都替换成这个没有调试意义的异常。我尝试在Web Service端跟了一下，发现程序正常的走到最后一个大括号，没有抛出任何异常。但是返回的时候却还是抛出了这个CommunicationException异常。</p>
<p>Google了一下，实在找不到相关的文章。只能自己分析了。在对涉及到的类做了详尽的检查之后，还是没有检查出什么设计问题来。该标注的属性都标注了。绞尽脑汁，后来终于想起了一丝线索，就是某个类里面定义了一个枚举成员，这个枚举类我之前修改过。我回想起当时的修改，我是把一个成员给删掉了，但是这会有什么关系呢？？我重新跟了一下，重点跟踪和该枚举成员相关的代码，终于发现了在一个数据库查询的时候，返回的枚举成员就是之前删掉的那个成员。由于枚举的设计是允许未定义成员的存在，因此这里不会报错，代码会继续执行直到返回。但是Silverlight客户端Web Service代理在反射此类型的时候则会出错（因为没有对应的枚举成员存在）。遗憾的是，Silverlight对Web Service返回的结果异常的报错机制不能帮我们很好的发现这个问题。我后来测试发现，如果在调用Web Service的时候传入一个非法的成员值，Silverlight是会抛出一个反射类型出错的异常，而且会帮你定位到出错的那个枚举成员上。</p>
<p>后来项目开发中还遇到和这个类似的问题，就是在实例化一个类实例的时候，由于类中使用C#3.0的自动属性特性去定义的枚举成员，成员的初始值是0，而枚举类中并没有0的成员，所以会遇到和上面一样的问题。</p>
<p>实际上，微软给的最佳开发实践中指出了，枚举类的一个设计原则就是，一定要定义一个0值的成员，这样可以避免枚举初始化值无效的问题。</p>
<p align="right">——<a href="http://www.imkevinyang.com/"><em><strong>Kevin Yang</strong></em></a></p>

	标签：<a href="http://www.imkevinyang.com/categories/techarticles/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/wcf" title="WCF" rel="tag">WCF</a>, <a href="http://www.imkevinyang.com/tags/web-service" title="Web Service" rel="tag">Web Service</a>, <a href="http://www.imkevinyang.com/tags/%e5%bc%82%e5%b8%b8" title="异常" rel="tag">异常</a>, <a href="http://www.imkevinyang.com/tags/%e6%9e%9a%e4%b8%be" title="枚举" rel="tag">枚举</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2009/09/blend%e5%b0%8f%e8%b4%b4%e5%a3%ab%e6%94%b9%e5%8f%98%e9%bc%a0%e6%a0%87%e6%bb%9a%e8%bd%ae%e7%9a%84%e9%bb%98%e8%ae%a4%e8%a1%8c%e4%b8%ba-2.html" title="Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为 (2009/09/18)">Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html" title="Javascript中获取出错代码所在文件及行数 (2009/05/18)">Javascript中获取出错代码所在文件及行数</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/02/silverlight-2-rtm-%e5%a4%9a%e5%9b%bd%e8%af%ad%e8%a8%80%e6%94%af%e6%8c%81%ef%bc%88%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%9c%ac%e5%9c%b0%e5%8c%96%ef%bc%89.html" title="Silverlight 2 RTM 多国语言支持（应用程序本地化） (2009/02/28)">Silverlight 2 RTM 多国语言支持（应用程序本地化）</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight-2%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bdxap%e5%8c%85%e4%b8%ad%e7%9a%84%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight 2动态加载Xap包中的程序集 (2009/03/02)">Silverlight 2动态加载Xap包中的程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/05/silverlight-4ria-services-%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96seo.html" title="Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO) (2010/05/04)">Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO)</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/04/silverlight-seo%ef%bc%88%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96%ef%bc%89%e7%99%bd%e7%9a%ae%e4%b9%a6.html" title="Silverlight SEO（搜索引擎优化）白皮书 (2009/04/06)">Silverlight SEO（搜索引擎优化）白皮书</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight2-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd%e7%a8%8b%e5%ba%8f%e9%9b%86-ondemand%e6%a8%a1%e5%bc%8fdynamic-load-assembly.html" title="Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly) (2009/03/02)">Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly)</a> </li>
	<li><a href="http://www.imkevinyang.com/2011/09/silverlight%e4%b8%ad%e6%97%a0%e6%b3%95%e8%ae%be%e7%bd%ae%e5%8d%ab%e6%98%9f%e7%a8%8b%e5%ba%8f%e9%9b%86%e4%b8%ba%e4%b8%ad%e7%ab%8b%e8%b5%84%e6%ba%90%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight中无法设置卫星程序集为中立资源程序集 (2011/09/05)">Silverlight中无法设置卫星程序集为中立资源程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/03/silverlight%e7%9a%84%e4%be%9d%e8%b5%96%e5%b1%9e%e6%80%a7%e4%b8%8e%e9%99%84%e5%8a%a0%e5%b1%9e%e6%80%a7.html" title="Silverlight的依赖属性与附加属性 (2010/03/28)">Silverlight的依赖属性与附加属性</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/08/%e6%9e%9a%e4%b8%be%e5%af%bc%e8%87%b4%e7%9a%84wcf-web-service%e6%8e%a5%e5%8f%a3%e8%bf%94%e5%9b%9e%e5%bc%82%e5%b8%b8.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: www.imkevinyang.com @ 2012-02-08 00:24:55 -->
