В WCF есть техника:
вы создаете InstrumentedOperationAttribute, который является производным от атрибута IOperationBehavior.
Внутри вы реализуете:
public void ApplyDispatchBehavior(
OperationDescription operationDescription,
DispatchOperation dispatchOperation
)
{
dispatchOperation.ParameterInspectors.Add(
new ServerPI()
);
}
и класс ServerPI () - это то, что делает магию:
вы делаете все, что вам нужно в методах до и после вызова:
class ServerPI : IParameterInspector
{
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
Guid result = (Guid)correlationState;
// ...
}
public object BeforeCall(string operationName, object[] inputs)
{
string parameter1 = inputs[0] as string;
return Guid.NewGuid();
}
}