WCF中Client捕获Service异常
WCF中客户端捕获服务端的异常共有三种方式
1.服务端不做任何处理,客户端直接捕获
try { service.HelloWCF(mess); } catch (FaultException<FaultMessage> ex) { Console.WriteLine(ex.Detail.Message); }
此时客户端捕获的异常显示为WCF的默认ServiceError,没有任何指示信息
2.服务端使用includeExceptionDetailInFaults标识
<serviceBehaviors>
<behavior name="calculatorServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
此时客户端可以捕获到服务器端异常的完整信息
客户端使用与上完全一致的catch可以捕获到Service Throw的完整信息,(利于调试,不适用于发布的系统)
3.服务端封装异常Message
服务端将异常Message封装为数据契约(DataContract),客户端Catch到该DataContract只能获取到该数据契约中的信息
服务端:
S-1:承载ExceptionMessage的数据契约
/* *
* 用于存储异常信息的类,和普通数据契约没有区别
* */
[DataContract]
public class FaultMessage
{
[DataMember]
public string Message { get; set; }
}
S-2:可能会抛出异常的服务契约
[ServiceContract]
public interface ITestException
{
[OperationContract]
[FaultContract(typeof(FaultMessage))]//该行声明了承载异常的数据契约
int add(int x,int y);
}
客户端:
C-1:发生异常的代码
ITestException server = factory.CreateChannel();
try
{
server.add(1, 2);//该句发生异常
}
catch (FaultException<FaultMessage> ex)//捕获到封装后的异常信息
{
Console.WriteLine(ex.Detail.Message);//使用Detail获取封装的异常信息并获取其属性信息
}