Вызов Abort на неисправном канале WCF приводит к регистрации ошибки на стороне сервера - PullRequest
1 голос
/ 08 декабря 2010

Когда FaultException возвращается из моей службы WCF, мне нужно прервать канал, а не закрывать его.И мой клиент, и сервис работают нормально с этим подходом, но после реализации IErrorHandler в сервисе и регистрации любых исключений я вижу, что вызов Abort на клиенте приводит к регистрации сервиса:

System.ServiceModel.CommunicationException: соединение через сокет было прервано ...

Я не хочу загрязнять свои журналы обслуживания этой информацией и хочу только регистрировать ошибки, связанные со службой.Я знаю, что могу прекратить регистрировать любые исключения CommunicationExceptions, но моя служба также является клиентом WCF для других служб, и должны регистрироваться исключения CommunicationException, создаваемые этими службами.

Как я могу остановить это при этом?

Ответы [ 2 ]

1 голос
/ 20 января 2011

Поскольку никто не ответил на вопрос (ответ Томаса не был актуален), я спросил нескольких экспертов в этой области. К сожалению, нет хорошего способа остановить это, и лучшее, что они могли придумать, это добавить логику в IErrorHandler, чтобы не регистрировать CommunicationExcepions с сообщением, начинающимся с «Соединение с сокетом было прервано». Не очень элегантно, но работает.

0 голосов
/ 10 января 2011

Проблема в том, что вы получаете исключение, которое покрывает ваше основное исключение, если вы получаете исключение при вызове 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 везде, где вы не хотите подделывать сервис.

...