Silverilght 客户端不支持 FaultException. 只会显示一个 404 错误。所以,服务端抛出的异常,在客户端是无法直接通过序列化/反序列化传递得到的。但是可以改用下列一些方法来帮助从客户端得到错误信息:
1. 在 Service 端,将返回值对象重新设计,在其中添加错误信息的字段,传递回来。
2. 在 Service 端发生异常时,捕获之,并使用 Session 存储(同时可以做日志),然后结果里 return false.
Silverlight 里判断返回 false 则去调用另一个 Service: GetLastError() 从 Session 中取出刚才保存的异常信息。
3. 修改 Service 接口,在参数里加一个 ref 参数用于返回错误信息,客户端同时判断 e.Error 和 e.Ref参数 的值。
因为项目还在开发中,目前我采用的是第三个方法,仅增加一个 ref string errorMessage 参数即可,比较简单。
另外最近在考虑的一个问题是,如何大幅度减少 WCF Service 的数量,改为设计尽量通用的服务接口。哪怕牺牲了强类型也值得,只要设计出自己的序列化/反序列化机制就行了。因为更新 WCF 引用实在是很麻烦,并且很容易出错。如果是一个业务系统,数据表很多时,按传统办法会要求做更多的 Service 来做 CRUD 操作。在这方面如果哪位朋友有好的 idea, 也希望能分享一下。
参考:
http://silverlight.net/forums/p/18852/64012.aspx#64012%20
http://silverlight.net/forums/p/19875/94861.aspx#94861
http://silverlight.net/forums/p/17944/60019.aspx#60019
http://silverlight.net/forums/p/18885/64222.aspx#64222
http://silverlight.net/forums/p/11859/38066.aspx#38066