OperationContext.Current中的WCF MessageHeaders

时间:2010-04-08 16:55:26

标签: c# .net wcf security

如果我使用这样的代码[就在下面]将Message Headers添加到我的OperationContext中,那么所有未来的外出消息都将包含从我的应用程序的同一“运行”定义的任何新ClientProxy上的数据吗?

目标是将一个或两个参数传递给每个OpeartionContract w / out乱七八糟的ActionContract签名,因为传递的参数对于我的客户端应用程序的给定运行的所有请求都是一致的。

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(...);
}

由于我真的不明白那里发生了什么,我不想把它变成货物而只是改变它,如果它有效就让它飞起来,我想听听你对它是否合适的想法

2 个答案:

答案 0 :(得分:4)

我认为您重构的代码没有添加任何附加值。您是否考虑过OperationContext可以为空?

我认为这将是一种更安全的方法:

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

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

OperationContextScope的构造函数将始终导致替换当前线程的Operation上下文;调用OperationContextScope的Dispose方法,该方法恢复旧的上下文,防止同一线程上的其他对象出现问题。

答案 1 :(得分:0)

我相信每次新建代理时,您的OperationContext都会被删除。

您应该计划在每次调用之前添加自定义邮件标头。这在任何情况下都是很好的做法,因为您应该更喜欢每次通话服务并在每次通话后关闭频道。

管理自定义标头有几种模式。

  1. 您可以将代码创建为代理构造函数的一部分。

  2. 或者,您可以使用在进行每次调用之前自动添加自定义标头的行为来扩展绑定。这是一个很好的例子:http://weblogs.asp.net/avnerk...