2011-08-08 2 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 유형이 있습니다. 그러나 보호 수준으로 인해 OperationInvoker를 SyncMethodInvoker로 캐스팅 할 수 없습니다. 그러나 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 
}