(学)无论是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 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();
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);
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说起。”
当然,后面说起的自然是解决办法,如有朋友遇到同样问题自行去看原贴。