Журнал ошибок 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)
);