(学)无论是CallContext还是HttpContext,都不能自动实现数据的跨线程传递?

最近在弄WCF平台,做了如下工作:
1、采用泛型方式动态创建WCF客户端代码,以解决客户端与服务端分步开发,直接采用契约接口即可,避免客户端弱化开发阶段服务引用;

    示例垃圾代码
    {

代码
1 //服务端点初始化
2             EndpointAddress epo = new EndpointAddress(new Uri(svcServiceAddress),
3                                                       EndpointIdentity.CreateDnsIdentity("MyServer"));
4             WSHttpBinding WShb = new WSHttpBinding("BindingConfiguration");//使用的协议必须与wcf服务端所用的协议相同
5             //创建通道
6             ChannelFactory<I> customersFactory = new ChannelFactory<I>(WShb, epo);    

}
2、增加了传说中"X509"安全验证;

  示例垃圾代码

  {

代码
1  //服务应用受权验证信息
2             customersFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
3             customersFactory.Credentials.UserName.UserName = "user";
4             customersFactory.Credentials.UserName.Password = "pwd";
5             I i = customersFactory.CreateChannel();

  }
3、其实我还想把上下文的信息(当前操作人员、终端等信息)传到后台用于日志记录,通过实验采用自己定义消息头的方式

{

代码
1 //系统当前操作人员
2             OperationContextScope scope = new OperationContextScope(i as IContextChannel);
3             MessageHeader header = MessageHeader.CreateHeader("ContextObject""http://tempuri.org", ContextInfo);
4             OperationContext.Current.OutgoingMessageHeaders.Add(header);

},试验也算成功了。

4、可是、但是、可但是就在把历史项目进行迁移的时候出问题了,抛出了某些“参数未能绑定”的异常。

5、后经多方面查找、跟踪、调试,发现在某些调用时“上下文信息”,没了下文,?!!?

6、这些方法与测试期唯一不同的就是这些方法是采用了异步委托。

7、本着解决问题、治病求人、先百度后谷歌的方针、思路和序顺,终于查到了一些信息:

    http://www.pin5i.com/showtopic-27165.html
   其中有几名话:在同步调用的情况下,ApplicationContext可以正常工作。但是对于异步调用,当前的上下文信息并不能被传播到另一个线程中去。”

   以及“无论是CallContext还是HttpContext(HttpSessionState最终依附于当前的 HttpContext),都不能自动实现数据的跨线程传递。至于原因,需要从两种不同的CallContext说起。

   当然,后面说起的自然是解决办法,如有朋友遇到同样问题自行去看原贴。

原文地址:https://www.cnblogs.com/spymaster/p/1733214.html