当我的WCF服务返回FaultException时,我需要中止通道而不是关闭它。我的客户端和服务都可以正常使用这种方法,但在服务上实现IErrorHandler并记录任何异常之后,我可以看到在客户端上调用Abort导致服务记录:
System.ServiceModel.CommunicationException:套接字连接已中止......
我不想使用此信息污染我的服务日志,只想记录与服务相关的错误。我知道我显然可以停止记录任何CommunicationExceptions,但我的服务也是其他服务的WCF客户端,应记录这些服务引发的CommunicationExceptions。
我怎么能阻止它呢?
答案 0 :(得分:1)
由于没有其他人回答这个问题(托马斯的回答没有关系),我问了一些该领域的专家。不幸的是,没有很好的方法可以阻止它,并且最好的方法就是在IErrorHandler中添加逻辑,以便不使用以“套接字连接中止”开头的消息记录CommunicationExcepions。不是很优雅,但确实有效。
答案 1 :(得分: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
添加到你不想伪造服务的任何地方。