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获取封装的异常信息并获取其属性信息
}






posted @ 2011-09-26 10:09  wangking1029  阅读(410)  评论(1编辑  收藏  举报