簡體   English   中英

OperationContext.Current中的WCF MessageHeaders

[英]WCF MessageHeaders in OperationContext.Current

如果我使用這樣的代碼[正好在下面]將Message Headers添加到我的OperationContext中,那么所有未來的外出消息都將包含從我的應用程序的相同“運行”定義的任何新ClientProxy上的數據嗎?

目標是將一個參數或兩個參數傳遞給每個OpeartionContract,而不是弄亂OperationContract的簽名,因為傳遞的參數對於我的客戶端應用程序的給定運行的所有請求都是一致的。

public void DoSomeStuff()
{
    var proxy = new MyServiceClient();
    Guid myToken = Guid.NewGuid();
    MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken);
    MessageHeader untyped = mhg.GetUntypedHeader("token", "ns");
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
    proxy.DoOperation(...);
}

public void DoSomeOTHERStuff()
{
    var proxy = new MyServiceClient();
    Guid myToken = Guid.NewGuid();
    MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken);
    MessageHeader untyped = mhg.GetUntypedHeader("token", "ns");
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
    proxy.DoOtherOperation(...);
}

換句話說,像這樣重構上面的代碼是否安全?

bool isSetup = false;
public void SetupMessageHeader()
{
    if(isSetup) { return; }
    Guid myToken = Guid.NewGuid();
    MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken);
    MessageHeader untyped = mhg.GetUntypedHeader("token", "ns");
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
    isSetup = true;
}

public void DoSomeStuff()
{
    var proxy = new MyServiceClient();
    SetupMessageHeader();
    proxy.DoOperation(...);
}

public void DoSomeOTHERStuff()
{
    var proxy = new MyServiceClient();
    SetupMessageHeader();
    proxy.DoOtherOperation(...);
}

因為我真的不明白那里發生了什么,所以我不想把它變成貨物而只是改變它,如果它有效就讓它飛起來,我想聽聽你的想法是否合適。

我認為你的重構代碼沒有任何附加價值。 您是否考慮過OperationContext可以為null?

我認為這將是一種更安全的方法:

 using(OperationContextScope contextScope =
        new OperationContextScope(proxy.InnerChannel))
  {

      .....
      OperationContext.Current.OutgoingMessageHeaders.Add(untyped); 
      proxy.DoOperation(...); 
  }

OperationContextScope的構造函數將始終導致替換當前線程的Operation上下文; 調用OperationContextScope的Dispose方法,該方法恢復舊上下文,防止同一線程上的其他對象出現問題。

我相信每次新建代理時,您的OperationContext都會被擦除。

您應該計划在每次調用之前添加自定義消息標頭。 在任何情況下,這都是很好的做法,因為您應該更喜歡每個呼叫服務並在每次呼叫后關閉頻道。

有幾種模式可用於管理自定義標頭。

  1. 您可以將頭創建為代理的構造函數的一部分。

  2. 或者,您可以使用在進行每次調用之前自動添加自定義標頭的行為來擴展綁定。 這是一個很好的例子: http://weblogs.asp.net/avnerk ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM