有没有办法在客户端的一个位置处理WCF服务器故障?

时间:2010-12-20 20:36:58

标签: wpf wcf exception-handling

现在我将所有WCF服务调用包装在以下try / catch块中,我想知道是否有办法在一个地方设置它并将其应用于所有服务调用。

try
{
    Product test = client.GetProductById(1);
}
catch (TimeoutException ex)
{
    WPFMessageBox.Show("The service operation timed out." + ex.Message);
}
catch (FaultException<CustomFault> ex)
{
    WPFMessageBox.Show("CustomFault:" + ex.ToString());
}
catch (FaultException ex)
{
    WPFMessageBox.Show("Unknown Fault:" + ex.ToString());
}
catch (CommunicationException ex)
{
    WPFMessageBox.Show("There was a communication problem" + ex.Message +
                        ex.StackTrace);
}

2 个答案:

答案 0 :(得分:4)

您可以编写一个包装器方法来获取代码来执行委托传递的服务调用:

public T ServiceCallWrapper<T>(Func<T> serviceCallDelegate)
{
    try
    {
        return serviceCallDelegate();
    }
    catch (TimeoutException ex)
    {
        WPFMessageBox.Show("The service operation timed out." + ex.Message);
    }
    catch (FaultException<CustomFault> ex)
    {
        WPFMessageBox.Show("CustomFault:" + ex.ToString());
    }
    catch (FaultException ex)
    {
        WPFMessageBox.Show("Unknown Fault:" + ex.ToString());
    }
    catch (CommunicationException ex)
    {
        WPFMessageBox.Show("There was a communication problem" + ex.Message +
                            ex.StackTrace);
    }
}

然后你可以用这样的匿名方法调用包装器:

Product test = ServiceCallWrapper<Product>(() => client.GetProductById(1));

答案 1 :(得分:1)

你可以通过AoP和IoC来做到这一点。

我在这里写了: http://pablocastilla.wordpress.com/2010/11/09/aop-and-ioc-in-wcf-4-0-with-enterprise-library-5-and-appfabric-part-1/

有一个代码示例。