捕获 WCF 超时异常

Catching a WCF Timeout Exception

我有一个 WCF 服务调用一个可能很长的 运行 DB 过程。如果这导致 WCF 超时,我想在客户端中优雅地处理它。

这是我正在使用调用 WCF 服务的代码:

async Task<int> RunWCFServiceCall()
{
    try
    {
        int returnVal = await Task.Run<int>(() => CallService());

        return returnVal;
    }
    catch (FaultException ex)
    {
        if (ex.InnerException.GetType().Equals(typeof(TimeoutException)))
        {
            return 0;
        }

上面的代码将异常捕获为 FaultException,但未通过内部异常检查。原因是 InnerException 为空;但是,异常消息是:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

我的问题是:我如何才能捕捉到这个错误,具体而言,又不求助于检查异常消息字符串的混乱结构?

默认情况下,WCF 将隐藏实际的异常详细信息,这与生产网络服务器不会显示错误消息的方式大致相同。您需要控制引发错误的方式。

您可以在您的服务中捕获异常并自己将其作为具有特定 FaultReason 或 FaultCode 的 FaultException 引发,或者您可以将异常包含在您的 WCF 合同中。