2

私のアプリケーションは、WCFを使用してWebサービスを呼び出します。呼び出しはさまざまな理由で失敗する可能性があります。

  • 障害
  • タイムアウト
  • 接続切断
  • ..。

そのようなエラーをすべてログに記録したいと思います。すべての呼び出しをtry-catchでラップするのではなく、アプリケーション全体のすべてのWebサービス呼び出しに対して1か所でこれを実行したいと思います。

残念ながら、IClientMessageInspectorは、タイムアウトや接続の失敗に対して呼び出されません。すべての例外を一元的に記録するために使用できるWCF拡張ポイントはありますか?

WCFトレースのように、エラーをログに記録するだけではないことに注意してください。ログに記録したい:

  • サービス名
  • MethodName
  • 間隔
  • Exception.ToString()

私は回避策を受け入れています。

4

1 に答える 1

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)
);
于 2012-07-10T16:02:18.183 に答える