今天在学习WCF的时候,看到了这个没有接触过的类,于是就在MSDN上面学习了一下。下面是相关的总结。
MSDN参考:
作用:提供对服务方法的执行上下文的访问权限。使用服务操作中的 OperationContext 访问当前操作执行环境。 特别是,操作上下文用于访问双工服务中的回调通道、存储整个操作部分的额外状态数据、访问传入消息头和属性以及添加传出消息头和属性。
重要属性:
OperationContext.Current
作用:获取或设置当前线程的执行上下文。使用 Current 属性获取当前方法的执行和消息上下文。
笔记:关于线程上下文的讨论。 Current属性的主要作用在于获取或设置当前线程的上下文,根据之前的一个“讨论”链接,我个人觉得,应该是获取之前一次此线程执行过程中的内容,设置当前线程以及之后再次执行的当前线程。应该类似于保证当前所操作的内容,就是我所需要的内容,而不是“前一个其他线程”所执行的内容。毕竟不同线程的执行,可能产生的结果很多。
重要方法:
OperationContext.GetCallbackChannel(Of T)
作用:获取调用当前操作的客户端实例的通道。调用 GetCallbackChannel(Of T) 属性以获取通道,使用该通道可以调用调用服务的客户端实例的操作。
笔记:调用此方法的目的,在于得到调用“当前操作”的“客户端实例”的通道。使用这个通道调用“调用服务的客户端实例”的操作,也就是调用一个客户端实例的某一个操作。配合Current属性,可以理解为获取上一次当前进程执行过程中,所用到的那条通道。
案例:
下面的代码示例使用 Current 属性和 GetCallbackChannel(Of T) 方法获取从方法中返回调用方的通道。 此示例中的所有方法都是单向方法,使服务和客户端能够独立地进行双向通信。 在此情况下,示例客户端应用程序在退出前仅需要一次返回调用,但其他客户端(例如 Windows 窗体客户端)可以接收来自服务的任意数量的调用。
2 using System . Collections . Generic;
3 using System . ServiceModel;
4 using System . Threading;
5
6 namespace Microsoft . WCF . Documentation
7 {
8 [ ServiceContract (
9 Name = " SampleDuplexHello " ,
10 Namespace = " http://microsoft.wcf.documentation " ,
11 CallbackContract = typeof ( IHelloCallbackContract ) ,
12 SessionMode = SessionMode . Required
13 ) ]
14 public interface IDuplexHello
15 {
16 [ OperationContract ( IsOneWay = true ) ]
17 void Hello ( string greeting ) ;
18 }
19
20 public interface IHelloCallbackContract
21 {
22 [ OperationContract ( IsOneWay = true ) ]
23 void Reply ( string responseToGreeting ) ;
24 }
25
26 public class DuplexHello : IDuplexHello
27 {
28 public DuplexHello ( )
29 {
30 Console . WriteLine ( " Service object created: " + this . GetHashCode ( ) . ToString ( ) ) ;
31 }
32
33 ~DuplexHello ( )
34 {
35 Console . WriteLine ( " Service object destroyed: " + this . GetHashCode ( ) . ToString ( ) ) ;
36 }
37
38 public void Hello ( string greeting )
39 {
40 Console . WriteLine ( " Caller sent: " + greeting ) ;
41 Console . WriteLine ( " Session ID: " + OperationContext . Current . SessionId ) ;
42 Console . WriteLine ( " Waiting two seconds before returning call. " ) ;
43 // Put a slight delay to demonstrate asynchronous behavior on client.
44 Thread . Sleep ( 2000 ) ;
45 IHelloCallbackContract callerProxy
46 = OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
47 string response = " Service object " + this . GetHashCode ( ) . ToString ( ) + " received: " + greeting;
48 Console . WriteLine ( " Sending back: " + response ) ;
49 callerProxy . Reply ( response ) ;
50 }
51 }
52 }