Механизм повтора при вызове операции WCF, когда канал находится в аварийном состоянии. - PullRequest
2 голосов
/ 23 ноября 2010

Я пытаюсь найти элегантный способ повторить операцию, когда канал WCF находится в неисправном состоянии. Я пытался использовать Policy Injection AB для повторного подключения и повторения операции, когда исключение состояния ошибки возникает при первом вызове, но метод PolicyInjection.Wrap, похоже, не любит обтекание объектов TransparentProxy (прокси, возвращенный из ChannelFactory.CreateChannel).

Есть ли какой-нибудь другой механизм, который я мог бы попробовать или как я мог бы попытаться заставить решение PIAB работать правильно - любые ссылки, примеры и т. Д. Были бы очень благодарны.

Вот код, который я использовал, который не удался:
var channelFactory = new ChannelFactory(endpointConfigurationName);
var proxy = channelFactory.CreateChannel(...);
proxy = PolicyInjection.Wrap<IService>(proxy);

Спасибо.

Ответы [ 2 ]

3 голосов
/ 23 ноября 2010

Я бы лучше использовал функции обратного вызова, что-то вроде этого:

    private SomeServiceClient proxy;

    //This method invokes a service method and recreates the proxy if it's in a faulted state
    private void TryInvoke(Action<SomeServiceClient> action)
    {
        try
        {
            action(this.proxy);
        }
        catch (FaultException fe)
        {
            if (proxy.State == CommunicationState.Faulted)
            {
                this.proxy.Abort();
                this.proxy = new SomeServiceClient();
                //Probably, there is a better way than recursion
                TryInvoke(action);
            }
        }
    }

    //Any real method
    private void Connect(Action<UserModel> callback)
    {
        TryInvoke(sc => callback(sc.Connect()));
    }

И в своем коде вы должны позвонить

ServiceProxy.Instance.Connect(user => MessageBox.Show(user.Name));

вместо

var user = ServiceProxy.Instance.Connect();
MessageBox.Show(user.Name);

Хотя мой код использует подход прокси-класса, вы можете написать похожий код с помощью каналов.

0 голосов
/ 11 декабря 2010

Большое вам спасибо за ваш ответ.В итоге я создал класс типа декоратор, который реализовал интерфейс моего сервиса, который затем просто обернул прозрачный прокси, сгенерированный ChannelFactory.Затем я смог использовать блок приложения Policy Injection, чтобы создать поверх этого слой, который вставлял бы код в каждый вызов операции, который пытался бы выполнить операцию, а в случае возникновения CommunicationObjectFaptedException прерывал канал, заново создавал его и повторял операцию.,Теперь он отлично работает - хотя он прекрасно работает, но единственным недостатком является то, что класс-оболочка упомянул о необходимости реализации каждой сервисной операции, но это был единственный способ, которым я мог использовать PIAB, поскольку для меня это имело смысл в случае, если я нашелКстати, это было достаточно легко изменить, просто используя интерфейсы.

...