2011-08-08 11 views
4

IOperationInvokerを実装して、WCF呼び出しをカスタマイズしました。 Invokeメソッドでは、OperationInvokerによって呼び出されるメソッドのカスタム属性にアクセスしたいとします。 私は次のコードを書いています。 しかし、それはそのメソッドで指定されたカスタム属性を与えていません。実行時にIOperationInvoker実装のMethodInfoにアクセス

public MyOperationInvoker(IOperationInvoker operationInvoker, DispatchOperation dispatchOperation) 
{ 
      this.operationInvoker = operationInvoker; 
} 

public object Invoke(object instance, object[] inputs, out object[] outputs) 
{ 
    MethodInfo mInfo=(MethodInfo)this.operationInvoker.GetType().GetProperty("Method"). 
        GetValue(this.operationInvoker, null); 
object[] objCustomAttributes = methodInfo.GetCustomAttributes(typeof(MyAttribute), true); 

} 

答えて

4

、OperationInvokerはMETHODINFOが含まれているSyncMethodInvokerを入力しています。しかし、その保護レベルのために、我々はSyncMethodInvokerにOperationInvokerをキャストできません。ただし、OperationDescriptionにはMethodInfoオブジェクトがあります。だから私は通常、IOperationBehavior.ApplyDispatchBehaviorメソッドのMethodInfoをCustomOperationInvokerのコンストラクタに渡します。

public class OperationBehaviourInterceptor : IOperationBehavior 
{ 
    public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation) 
    { 
    MethodInfo currMethodInfo = operationDescription.SyncMethod; 

    var oldInvoker = dispatchOperation.Invoker; 
    dispatchOperation.Invoker = new OperationInvokerBase(oldInvoker,currMethodInfo); 
    } 

    // other method 
} 

public class CustomOperationInvoker : IOperationInvoker 
{ 
    private IOperationInvoker oldInvoker; 
    private MethodInfo methodInfo; 
    public CustomOperationInvoker(IOperationInvoker oldOperationInvoker, MethodInfo info) 
    { 
    this.oldInvoker = oldOperationInvoker; 
    this.methodInfo = info; 
    } 

    // then you can access it 
} 
関連する問題