1

当从我的 WCF 服务返回 FaultException 时,我需要中止通道而不是关闭它。我的客户端和服务都可以使用这种方法正常工作,但是在服务上实现 IErrorHandler 并记录任何异常之后,我可以看到在客户端上调用 Abort 会导致服务记录:

System.ServiceModel.CommunicationException:套接字连接被中止...

我不想用这些信息污染我的服务日志,只想记录与服务相关的错误。我知道我显然可以停止记录任何 CommunicationExceptions,但我的服务也是其他服务的 WCF 客户端,并且应该记录这些服务引发的 CommunicationExceptions。

我怎样才能阻止它这样做?

4

2 回答 2

1

由于没有其他人回答过这个问题(托马斯的回答不相关),我询问了该领域的一些专家。不幸的是,没有很好的方法来阻止这种情况,他们能想出的最好方法是在 IErrorHandler 中添加逻辑,以不记录以“套接字连接已中止”开头的消息的 CommunicationExcepions。不是很优雅,但它确实有效。

于 2011-01-20T13:50:43.997 回答
0

问题是,如果您在调用 dispose 时遇到异常,您将获得一个涵盖您的基础异常的异常。我写了一个包装器来处理这样的场景,你可以在我的博客上阅读它:http: //blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/

这个想法是,如果 dispose 方法抛出异常,您的通道周围会有一个包装器来处理该场景。

你应该如何使用我的包装器的一个小例子:

public class ClientWrapperUsage : IYourInternalInterface
{
    public IList<SomeEntity> GetEntitiesForUser(int userId)
    {
        using(var clientWrapper = new ServiceClientWrapper<ServiceType>())
        {
            var response = clientWrapper.Channel.GetEntitiesForUser();
            var entities = response.YourListOfEntities.TranslateToInternal();
            return entities;
        }
    }
}

在这里,我假设它存在用于包含服务返回的实体的列表的扩展方法,然后您使用该方法将其转换为内部实体。这是 100% 可测试的,至少我认为 :)。只需IYourInternalInterface在您不想伪造服务的任何地方修改界面即可。

于 2011-01-10T15:58:18.647 回答