はい、 WCF に組み込まれている拡張ポイントを使用して、この種のログをカプセル化することができます。実際には複数の可能なアプローチがあります。ここで説明しているIServiceBehavior
ものは、カスタムを使用する を追加し、IOperationInvoker
web.config の変更を必要としません。
これには 3 つの部分があります。
- の実装を作成します
IOperationInvoker
。これは、必要なロギングとエラー処理でメソッド呼び出しをラップします。
IOperationBehavior
ステップ 1 の呼び出し元を適用する の実装を作成します。
IServiceBehavior
から継承する を作成し、Attribute
ステップ 2 の動作を適用します。
ステップ 1 - IOperationInvoker
IOperationInvokerの核心はInvoke
メソッドです。私のクラスは、基本呼び出し元を try-catch ブロックでラップします。
public class LoggingOperationInvoker : IOperationInvoker
{
IOperationInvoker _baseInvoker;
string _operationName;
public LoggingOperationInvoker(IOperationInvoker baseInvoker, DispatchOperation operation)
{
_baseInvoker = baseInvoker;
_operationName = operation.Name;
}
// (TODO stub implementations)
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
MyInfrastructure.LogStart(_operationName, inputs);
try
{
return _baseInvoker.Invoke(instance, inputs, out outputs);
}
catch (Exception ex)
{
MyInfrastructure.LogError(_operationName, inputs, ex);
return null;
}
MyInfrastructure.LogEnd("Add", parameters);
}
}
ステップ 2 - IOperationBehavior
IOperationBehaviorの実装は、カスタム ディスパッチャを操作に適用するだけです。
public class LoggingOperationBehavior : IOperationBehavior
{
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
dispatchOperation.Invoker = new LoggingOperationInvoker(dispatchOperation.Invoker, dispatchOperation);
}
// (TODO stub implementations)
}
ステップ 3 - IServiceBehavior
この実装でIServiceBehavior
は、操作の動作がサービスに適用されます。Attribute
WCF サービス クラスに属性として適用できるように、から継承する必要があります。この実装は標準です。
public class ServiceLoggingBehavior : Attribute, IServiceBehavior
{
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints)
{
foreach (OperationDescription operation in endpoint.Contract.Operations)
{
IOperationBehavior behavior = new LoggingOperationBehavior();
operation.Behaviors.Add(behavior);
}
}
}
}