IncludeExceptionDetailInFaults表现不佳

时间:2010-04-01 15:15:00

标签: c# .net wcf exception-handling

我有这个简单的测试项目只是为了测试IncludeExceptionDetailInFaults行为。

    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            throw new InvalidCastException("test");
            return string.Format("You entered: {0}", value);
        }
    }

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);
    }

在服务的app.config中,我将其设置为true

 <serviceDebug includeExceptionDetailInFaults="True" />

在客户端:

            try
            {
                using (var proxy = new ServiceReference1.Service1Client())
                    Console.WriteLine(proxy.GetData(5));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

这就是我认为的行为: 设置为includeExceptionDetailInFaults = true会将异常详细信息传播到客户端。但我总是得到CommunicationObjectFaultException。

我确实尝试在合同上使用FaultContract(typeof(InvalidCastException))但行为相同,只是获取了CommunicationObjectFaultException。

使其工作的唯一方法是抛出新的FaultException(new InvalidCastException(“test”));

但是我想IncludeExceptionDetailInFaults = true,上面是自动完成的。

我错过了什么吗?

1 个答案:

答案 0 :(得分:8)

这是因为您已将服务客户端放在using块中。

WCF客户端是.NET中shouldn't use using的一个位置,因为它会掩盖“真正的”异常。

技术说明:Dispose调用Close,如果频道已经出现故障(即由于之前的异常),它将始终抛出CommunicationObjectFaultedException,随后放入堆栈顶部的异常。在清理ICommunicationObject时,为了避免屏蔽异常,您必须先检查State以查看是否出现故障,如果是,请调用Abort而不是{{1} }}