Какие исключения WCF я должен повторить в случае неудачи?(например, фиктивный хост «xxx» не получил ответ в течение 00:01:00 ») - PullRequest
1 голос
/ 20 января 2011

У меня есть клиент WCF, который выдал эту распространенную ошибку, чтобы ее можно было решить, повторив HTTP-вызов на сервер. Для чего это стоит, это исключение не было сгенерировано в течение 1 минуты. Сгенерировано за 3 секунды.

Операция запроса отправлена ​​на хххххх не получил ответ в течение настроенное время ожидания (00:01:00). Время, отведенное на эту операцию, может был частью дольше тайм-аут. Это может быть потому, что сервис все еще обрабатывает операция или потому что служба была невозможно отправить ответное сообщение. пожалуйста рассмотреть возможность увеличения операции тайм-аут (путем приведения канала / прокси в IContextChannel и установка Свойство OperationTimeout) и обеспечивает что сервис может подключиться к клиент

Как профессионалы обрабатывают эти распространенные ошибки WCF? Какие еще фиктивные ошибки я должен обработать.

Например, я рассматриваю синхронизацию вызова WCF, и если вышеупомянутая (фиктивная) ошибка появляется менее чем за 55 секунд, я повторяю всю операцию (используя цикл while ()). Я полагаю, что мне нужно перезагрузить весь канал, но я надеюсь, что вы, ребята, скажете мне, что делать правильно.

Что еще

1 Ответ

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

Я делаю все свои вызовы WCF из пользовательского оператора «using», который обрабатывает исключения и потенциальные отключения. Мой код дополнительно позволяет мне передать объект политики в оператор, чтобы я мог легко изменить поведение, например, если я не хочу повторять попытку при ошибке.

Суть кода заключается в следующем:

[MethodImpl(MethodImplOptions.NoInlining)]
public static void ProxyUsing<T>(ClientBase<T> proxy, Action action)
    where T : class
{
    try
    {
        proxy.Open();
        using(OperationContextScope context = new OperationContextScope(proxy.InnerChannel))
        {
          //Add some headers here, or whatever you want
            action();
        }
    }
    catch(FaultException fe)
    {
      //Handle stuff here
    }
    finally
    {
        try
        {
            if(proxy != null
                && proxy.State != CommunicationState.Faulted)
            {
                proxy.Close();
            }
            else
            {
                proxy.Abort();
            }
        }
        catch
        {
            if(proxy != null)
            {
                proxy.Abort();
            }
        }
    }
}

Затем вы можете использовать вызов следующим образом:

ProxyUsing<IMyService>(myService = GetServiceInstance(), () =>
{
    myService.SomeMethod(...);
});

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

...