Как предотвратить прекращение работы службы WCF из-за исключения канала?

StackOverflow https://stackoverflow.com/questions/1959867

Вопрос

Я создал одноэлементную службу WCF с netNamedPipeBinding.Когда возникает исключение канала, оно оставляет канал в неисправном состоянии, и все последующие операции вызывают исключения.Как я могу предотвратить это?Я хочу, чтобы исключение TimeoutException или любое другое распространенное исключение приводило к сбою только одной операции, а не к тому, чтобы служба не отвечала.

Это было полезно?

Решение 2

Есть другой способ. Вы можете создать создание клиентского прокси для каждого запроса вместо использования одного экземпляра для более чем одного запроса. Таким образом, если канал входит в неисправное состояние, он в любом случае отбрасывается.

Это немного сложно, потому что вы не должны распоряжаться каналом, кроме того, что он может быть идентифицируемым.

Это не сработает:

using(var channel = channelFactory.CreateChannel())
{
    return channel.ServiceMethod(parameter);
}

Вместо этого вы должны:

public static class Service<T>
{
    public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>("");

    public static TResult Use<TResult>(Func<T, TResult> func)
    {
        TResult output;
        var channel = (IClientChannel)_channelFactory.CreateChannel();
        bool success = false;
        try
        {
            output = func((T)proxy);
            channel.Close();
            success = true;
        }
        finally
        {
            if (!success)
            {
                proxy.Abort();
            }
        }
        return output;
    }
}

return Service<IService>.Use(channel =>
{
    return channel.ServiceMethod(parameter);
});

Другие советы

Вам необходимо обернуть ваши исключения на стороне сервера в FaultException.Если вы контролируете оба конца провода и оба конца являются .NET, вы можете просто обернуть исключение .NET в FaultException<T> и отправьте это обратно клиенту.Таким образом, канал остается работоспособным.

Видеть Определение и устранение ошибок в контрактах и ​​услугах на MSDN для получения дополнительной информации, а также ознакомьтесь с этим статья о CodeProject и этот пост в блоге Зачем использовать WCF FaultException по той же теме.

Также, чтобы облегчить себе жизнь, ознакомьтесь с Интерфейс IErrorHandler который вы можете реализовать на стороне сервера, чтобы глобально перехватывать исключения и преобразовывать их в ошибки.Также посмотрите множество сообщений в блогах по этой теме, т.е. Иеррорхандлер:универсальный преобразователь неисправностей или многие другие (подробнее Bing или Google).

Чтобы сделать свою жизнь еще проще, вы можете реализовать IErrorHandler как поведение, которое вы можете включить или отключить в своей службе — либо в конфигурации службы, либо путем установки атрибута в вашем классе службы.В Интернете можно найти довольно много реализаций, одна мне нравится здесь: Полезное поведение WCF:Иеррорхандлер.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top