枚举导致的WCF Web Service接口返回异常
枚举在DotNet中是一个比较特别的类型,因为你可以将任意整数赋值给一个枚举类,而不会导致编译或者运行时异常。不知道为什么要这样设计,感觉在这样的设计下,枚举类就变成弱类型了,丧失了类型安全检测了。曾经就有一次在Silverlight项目中遇到了和枚举类这个设计相关的奇怪问题,调试了半天才解决。
当时的症状是这样的,客户端Silverlight程序(当时是Silverlight 2.0 RTM)在调用Web Service返回的时候抛出了一个CommunicationException,这个错误没能提供任何信息,Silverlight把所有的Web Service的异常都替换成这个没有调试意义的异常。我尝试在Web Service端跟了一下,发现程序正常的走到最后一个大括号,没有抛出任何异常。但是返回的时候却还是抛出了这个CommunicationException异常。
Google了一下,实在找不到相关的文章。只能自己分析了。在对涉及到的类做了详尽的检查之后,还是没有检查出什么设计问题来。该标注的属性都标注了。绞尽脑汁,后来终于想起了一丝线索,就是某个类里面定义了一个枚举成员,这个枚举类我之前修改过。我回想起当时的修改,我是把一个成员给删掉了,但是这会有什么关系呢??我重新跟了一下,重点跟踪和该枚举成员相关的代码,终于发现了在一个数据库查询的时候,返回的枚举成员就是之前删掉的那个成员。由于枚举的设计是允许未定义成员的存在,因此这里不会报错,代码会继续执行直到返回。但是Silverlight客户端Web Service代理在反射此类型的时候则会出错(因为没有对应的枚举成员存在)。遗憾的是,Silverlight对Web Service返回的结果异常的报错机制不能帮我们很好的发现这个问题。我后来测试发现,如果在调用Web Service的时候传入一个非法的成员值,Silverlight是会抛出一个反射类型出错的异常,而且会帮你定位到出错的那个枚举成员上。
后来项目开发中还遇到和这个类似的问题,就是在实例化一个类实例的时候,由于类中使用C#3.0的自动属性特性去定义的枚举成员,成员的初始值是0,而枚举类中并没有0的成员,所以会遇到和上面一样的问题。
实际上,微软给的最佳开发实践中指出了,枚举类的一个设计原则就是,一定要定义一个0值的成员,这样可以避免枚举初始化值无效的问题。
你可能对下面的文章感兴趣
本博客遵循CC协议2.5,即署名-非商业性使用-相同方式共享
写作很辛苦,转载请注明作者以及原文链接~
如果你喜欢我的文章,你可以订阅我的博客:-D点击订阅我的文章










最新评论
方便提供你自己的博客地址吗?你的博客是刚刚创建的吗?还是已经 创建一段时间了?
你好,按照上面的步骤完成后,搜索时空白,google.sea rch.CustomSearchControl里的id换成你 的博客的id,可以搜到,但我自己咋igoogle申请的...
你好,按照上面的步骤完成后,搜索时空白,google.sea rch.CustomSearchControl里的id...
虽然不是很懂,但还是得说声楼主辛苦了!
谢楼主分享~