最近在园子里转看到有人对如题的实现有疑问,今天有时间就写了项目把实现简单的讲解一下,如果你是牛逼人物那就绕道吧,哥不想浪费你的时间,现在开始:
默认WCF是不允许将服务器的异常信息返回到客户端的(主要是客户端不一定能够识别clr的异常信息),如果你有这方面的需求可以通过SOAP的Fault包的形式返回异常信息,首先要做的就是设置配置文件,将默认不允许返回错误信息的设置改成如下:
然后定义承载信息的DataContract
[DataContract] public class Erro { [DataMember] public string Message { get; set; } }
上边的代码 就不用介绍了 就是一个数据合同
//服務契約定義了可以遠程調用的對象和方法 //定義服務契約 [XmlSerializerFormat]//定義序列化的方式 [ServiceContract(SessionMode = SessionMode.Allowed)]//SessionMode = SessionMode.Allowed:設置此屬性意味著可以使用會話Binding public interface IActionMain { //定義操作契約 [DataContractFormat]//定義序列化的方式 [OperationContract] string GetName(string pInc); [FaultContract(typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據 [FaultContract(typeof(DivideByZeroException))] [OperationContract] DataCollection Return(); }
在方法中定义属性,这里有两种实现
1.使用自定义的错误类型
[FaultContract(typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據2.使用系统的异常类型 [FaultContract(typeof(DivideByZeroException))]
在契约实现类中将异常抛出throw new FaultException(new DivideByZeroException("這個是自定義的異常!"));
下边看客户端的实现
配置文件不需要特殊设置,调用函数,抓取异常,代码如下:
try { return this.Channel.Return(); } catch (FaultExceptionexception) { throw new Exception(exception.Detail.Message); } catch(FaultException exception) { throw new Exception(exception.Detail.Message); }
FaultException<ErroInfo.Erro> exception:这个抓取的是定义的异常类型。
FaultException<DivideByZeroException> exception:这个抓取的是系统异常类型
注意这里获取异常的信息的方法是exception.Detail.Message,而不是Message。
运行效果如下:
示例代码: