Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OperationContext.Current中的WCF MessageHeaders_C#_.net_Wcf_Security - Fatal编程技术网

C# OperationContext.Current中的WCF MessageHeaders

C# OperationContext.Current中的WCF MessageHeaders,c#,.net,wcf,security,C#,.net,Wcf,Security,如果我使用下面的代码将消息头添加到OperationContext中,那么将来所有传出的消息是否都会包含从应用程序的同一“运行”中定义的任何新ClientProxy上的数据 目标是向每个OpartionContract传递一个或两个参数,这会影响运营合同的签署,因为传递的参数对于给定运行的客户端应用程序的所有请求都是一致的 public void DoSomeStuff() { var proxy = new MyServiceClient(); Guid myToken = G

如果我使用下面的代码将消息头添加到OperationContext中,那么将来所有传出的消息是否都会包含从应用程序的同一“运行”中定义的任何新ClientProxy上的数据

目标是向每个OpartionContract传递一个或两个参数,这会影响运营合同的签署,因为传递的参数对于给定运行的客户端应用程序的所有请求都是一致的

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(...);
}
public void DoSomeStuff()
{
var proxy=new MyServiceClient();
Guid myToken=Guid.NewGuid();
MessageHeader mhg=新的MessageHeader(myToken);
MessageHeader untyped=mhg.GetUntypedHeader(“令牌”,“ns”);
OperationContext.Current.OutgoingMessageHeaders.Add(非类型化);
代理操作(…);
}
公共空间DoSomeOTHERStuff()
{
var proxy=new MyServiceClient();
Guid myToken=Guid.NewGuid();
MessageHeader mhg=新的MessageHeader(myToken);
MessageHeader untyped=mhg.GetUntypedHeader(“令牌”,“ns”);
OperationContext.Current.OutgoingMessageHeaders.Add(非类型化);
代理操作(…);
}
换句话说,像这样重构上述代码安全吗

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(...);
}
bool isSetup=false;
public void SetupMessageHeader()
{
if(isSetup){return;}
Guid myToken=Guid.NewGuid();
MessageHeader mhg=新的MessageHeader(myToken);
MessageHeader untyped=mhg.GetUntypedHeader(“令牌”,“ns”);
OperationContext.Current.OutgoingMessageHeaders.Add(非类型化);
isSetup=true;
}
公共空间DoSomeStuff()
{
var proxy=new MyServiceClient();
SetupMessageHeader();
代理操作(…);
}
公共空间DoSomeOTHERStuff()
{
var proxy=new MyServiceClient();
SetupMessageHeader();
代理操作(…);
}

因为我真的不明白那里发生了什么,我不想把它搞得一团糟,如果它能工作,我想听听你对它的看法。

我认为你的重构代码没有任何附加值。您是否考虑到OperationContext可以为null

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

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

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

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

我相信每次新建代理时都会删除OperationContext

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

有两种模式可用于管理自定义标题

  • 您可以创建头作为代理的构造函数的一部分

  • 或者,您可以通过在每次调用之前自动添加自定义头的行为来扩展绑定。这是一个很好的例子:


  • 所以,除了我最初的问题,你是说我应该创建一个新的代理,调用方法,每次关闭代理?而不是在整个程序中保持一个代理打开?打开一个新的代理不是有一些开销吗?当然,该规则总是有例外,但对于大多数情况,建议这样做。如果您知道您将连续快速拨打电话或正在使用会话,您将保持频道开放。否则,关闭它是有意义的。当您在每次调用后考虑错误处理和潜在地清除故障通道时,这是真的。您应该假设每次访问代理时,代理都不在那里。与实际呼叫相比,开销通常是微不足道的。非常有用。此技术也可用于服务中,以基本上共享从主线程到另一个线程的OperationContext+1谢谢。这有帮助!