繁体   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