首页 > Silverlight > 枚举导致的WCF Web Service接口返回异常

枚举导致的WCF Web Service接口返回异常

Silverlight ,

枚举在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值的成员,这样可以避免枚举初始化值无效的问题。

——Kevin Yang

本博客遵循CC协议2.5,即署名-非商业性使用-相同方式共享
写作很辛苦,转载请注明作者以及原文链接~
如果你喜欢我的文章,你可以订阅我的博客:-D点击订阅我的文章

  1. X﹏X 到现在还没有评论~
  1. 暂时没有trackbacks.