Журнал ошибок WCF на клиенте

Мое приложение вызывает веб-сервис с использованием WCF. Вызов может быть неуспешным по разным причинам:

  • придираться
  • Тайм-аут
  • соединение потеряно
  • ...

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

К сожалению, IClientMessageInspector не вызывается для тайм-аутов и сбоев соединения. Есть ли точка расширения WCF, которую я могу использовать для централизованного учета всех исключений?

Обратите внимание, что я не просто хочу регистрировать ошибки, так как текст, как это делает WCF Tracing. Я хочу войти:

  • Наименование услуги
  • MethodName
  • продолжительность
  • Exception.ToString()

Я открыт для обходных путей.

1 ответ

Решение

Я не знаю о точке расширения, но я могу предоставить обходной путь, который мы использовали. По сути, мы создали "прокси", через который были сделаны все сервисные вызовы. Ниже представлен прокси и пример его использования.

/// <summary>
/// Proxy for executing generic service methods
/// </summary>
public class ServiceProxy
{
    /// <summary>
    /// Execute service method and get return value
    /// </summary>
    /// <typeparam name="C">Type of service</typeparam>
    /// <typeparam name="T">Type of return value</typeparam>
    /// <param name="action">Delegate for implementing the service method</param>
    /// <returns>Object of type T</returns>
    public static T Execute<C, T>(Func<C, T> action) where C : class, ICommunicationObject, new()
    {
        C svc = null;

        T result = default(T);

        try
        {
            svc = new C();

            result = action.Invoke(svc);

            svc.Close();
        }
        catch (FaultException ex)
        {
            // Logging goes here
            // Service Name: svc.GetType().Name
            // Method Name: action.Method.Name
            // Duration: You could note the time before/after the service call and calculate the difference
            // Exception: ex.Reason.ToString()

            if (svc != null)
            {
                svc.Abort();
            }

            throw;
        }
        catch (Exception ex)
        {
            // Logging goes here

            if (svc != null)
            {
                svc.Abort();
            }

            throw;
        }

        return result;
    }
}

И пример его использования:

var result = ServiceProxy.Execute<MyServiceClient, MyReturnType>
(
    svc => svc.GetSomething(someId)
);
Другие вопросы по тегам