枚举导致的WCF Web Service接口返回异常
2016-02-17 22:00
190 查看
枚举在dotNet中是一个比较特别的类型,因为你可以将任意整数赋值给一个枚举类,而不会导致编译或者运行时异常。
不知道为什么要这样设计,感觉在这样的设计下,枚举类就变成弱类型了,丧失了类型安全检测了。
曾经有一次在项目中遇到了和枚举类这个设计相关的奇怪问题,调试了半天才解决。
当时的症状是这样的,客户端程序在调用Web Service返回的时候抛出了一个CommunicationException,这个错误没能提供任何信息,把所有的Web Service的异常都替换成这个没有调试意义的异常。我尝试在Web Service端跟了一下,发现程序正常的走到最后一个大括号,没有抛出任何异常。但是返回的时候却还是抛出了这个CommunicationException异常。
Google了一下,实在找不到相关的文章。只能自己分析了。在对涉及到的类做了详尽的检查之后,还是没有检查出什么设计问题来。该标注的属性都标注了。绞尽脑汁,后来终于想起了一丝线索,就是某个类里面定义了一个枚举成员,这个枚举类我之前修改过。我回想起当时的修改,我是把一个成员给删掉了,但是这会有什么关系呢??我重新跟了一下,重点跟踪和该枚举成员相关的代码,终于发现了在一个数据库查询的时候,返回的枚举成员就是之前删掉的那个成员。由于枚举的设计是允许未定义成员的存在,因此这里不会报错,代码会继续执行直到返回。但是Silverlight客户端Web
Service代理在反射此类型的时候则会出错(因为没有对应的枚举成员存在)。遗憾的是Web Service返回的结果异常的报错机制不能帮我们很好的发现这个问题。我后来测试发现,如果在调用Web Service的时候传入一个非法的成员值,是会抛出一个反射类型出错的异常,而且会帮你定位到出错的那个枚举成员上。
在实例化一个类实例的时候,由于类中使用C#3.0的自动属性特性去定义的枚举成员,成员的初始值是0,而枚举类中并没有0的成员,所以会遇到和上面一样的问题。
不知道为什么要这样设计,感觉在这样的设计下,枚举类就变成弱类型了,丧失了类型安全检测了。
曾经有一次在项目中遇到了和枚举类这个设计相关的奇怪问题,调试了半天才解决。
当时的症状是这样的,客户端程序在调用Web Service返回的时候抛出了一个CommunicationException,这个错误没能提供任何信息,把所有的Web Service的异常都替换成这个没有调试意义的异常。我尝试在Web Service端跟了一下,发现程序正常的走到最后一个大括号,没有抛出任何异常。但是返回的时候却还是抛出了这个CommunicationException异常。
Google了一下,实在找不到相关的文章。只能自己分析了。在对涉及到的类做了详尽的检查之后,还是没有检查出什么设计问题来。该标注的属性都标注了。绞尽脑汁,后来终于想起了一丝线索,就是某个类里面定义了一个枚举成员,这个枚举类我之前修改过。我回想起当时的修改,我是把一个成员给删掉了,但是这会有什么关系呢??我重新跟了一下,重点跟踪和该枚举成员相关的代码,终于发现了在一个数据库查询的时候,返回的枚举成员就是之前删掉的那个成员。由于枚举的设计是允许未定义成员的存在,因此这里不会报错,代码会继续执行直到返回。但是Silverlight客户端Web
Service代理在反射此类型的时候则会出错(因为没有对应的枚举成员存在)。遗憾的是Web Service返回的结果异常的报错机制不能帮我们很好的发现这个问题。我后来测试发现,如果在调用Web Service的时候传入一个非法的成员值,是会抛出一个反射类型出错的异常,而且会帮你定位到出错的那个枚举成员上。
在实例化一个类实例的时候,由于类中使用C#3.0的自动属性特性去定义的枚举成员,成员的初始值是0,而枚举类中并没有0的成员,所以会遇到和上面一样的问题。
实际上,微软给的最佳开发实践中指出了,枚举类的一个设计原则就是,一定要定义一个0值的成员,这样可以避免枚举初始化值无效的问题。
相关文章推荐
- 极客学院视频源码资料
- 工具类问题解决方案
- 第2章{ 2-14 [选学]读懂bee的gulpfile.js }
- (2) Python 内置类型 –- 列表
- HDU_1565_方格取数(1)
- 第2章{ 2-13 使用抓包工具线上调试 }
- Android的性能优化
- ASCII码表
- 问题“undefined reference to `android_log_print”的解决办法
- CocoaPods的安装使用和常见问题
- openGl学习之加入颜色
- 第2章{ 2-12 使用gulp构建kissy工程 }
- CSAPP 3e Attack lab
- ssdb学习
- 你以为在用SharePoint但事实上不是
- 实际工作中遇到关于Struts2线程安全的问题解决
- KeePass使用心得
- 第2章{ 2-10 使用依赖表控制combo }
- 如何有效地记忆与学习
- MmProbeAndLockPages routine