2013-09-26 91 views
1

嗨如果操作是裝飾的,我需要在消息中注入自定義標頭。WCF:通過裝飾爲操作注入自定義標頭

到目前爲止我做了什麼? 1)創建屬性通過繼承屬性和IOperationBehavior 2)添加與操作

屬性定製OperationInvoker:

public class RankAttribute : Attribute, IOperationBehavior 
{ 
    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) 
    { 
     dispatchOperation.Invoker = new PublishMessageInvoker(dispatchOperation.Invoker); 
    } 
    //rest of the methods 
} 

接口:

public interface INullableService 
{ 
    [OperationContract] 
    [FaultContract(typeof(BusinessServiceException))] 
    [Rank] 
    NullableResponse NullChecking(NullableRequest request); 

    [OperationContract] 
    [FaultContract(typeof(BusinessServiceException))] 
    NullableResponse NullChecking2(NullableRequest request); 
} 

現在的問題是,我不知道在哪裏修改消息頭,我可以通過operationDiscription.Messages []獲得消息,但文檔說任何修改都會產生意想不到的結果。

感謝, 阿維納什

回答

1

沒關係:)這是微不足道的:) ..你得到的OperationContext在IOperationInvoker

public class PublishMessageInvoker : IOperationInvoker 
{ 
    private IOperationInvoker invoker; 


    public PublishMessageInvoker(IOperationInvoker invoker) 
    { 
     logger.Info("PublishMessageInvoker"); 
     this.invoker = invoker; 

    } 

    public object[] AllocateInputs() 
    { 

     if (invoker == null) 
      return null; 
     return this.invoker.AllocateInputs(); 
    } 

    public object Invoke(object instance, object[] inputs, out object[] outputs) 
    { 
     OperationContext.Current.OutgoingMessageHeaders.Add(
      MessageHeader.CreateHeader(
       "customheader", 
       "asnjnjdhbhb.com", 
       "MyAction") 
       ); 
     return this.invoker.Invoke(instance, inputs, out outputs); 
    } 

    public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state) 
    { 

     if (invoker == null) 
      return null; 
     return this.invoker.InvokeBegin(instance, inputs, callback, state); 
    } 

    public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result) 
    { 

     if (invoker == null) 
     { 
      outputs = null; 
      return null; 
     } 
     return this.invoker.InvokeEnd(instance, out outputs, result); 
    } 

    public bool IsSynchronous 
    { 
     get { 

      if (invoker == null) return true; 
      return this.invoker.IsSynchronous; 
     } 
    } 
} 
訪問