关于OperationContext类

今天在学习WCF的时候,看到了这个没有接触过的类,于是就在MSDN上面学习了一下。下面是相关的总结。

MSDN参考:

OperationContext

GetCallbackChannel(Of T)

Current

作用:提供对服务方法的执行上下文的访问权限。使用服务操作中的 OperationContext 访问当前操作执行环境。 特别是,操作上下文用于访问双工服务中的回调通道、存储整个操作部分的额外状态数据、访问传入消息头和属性以及添加传出消息头和属性。

重要属性:

OperationContext.Current

作用:获取或设置当前线程的执行上下文。使用 Current 属性获取当前方法的执行和消息上下文。

笔记:关于线程上下文的讨论。 Current属性的主要作用在于获取或设置当前线程的上下文,根据之前的一个“讨论”链接,我个人觉得,应该是获取之前一次此线程执行过程中的内容,设置当前线程以及之后再次执行的当前线程。应该类似于保证当前所操作的内容,就是我所需要的内容,而不是“前一个其他线程”所执行的内容。毕竟不同线程的执行,可能产生的结果很多。

重要方法:

OperationContext.GetCallbackChannel(Of T)

作用:获取调用当前操作的客户端实例的通道。调用 GetCallbackChannel(Of T) 属性以获取通道,使用该通道可以调用调用服务的客户端实例的操作。

笔记:调用此方法的目的,在于得到调用“当前操作”的“客户端实例”的通道。使用这个通道调用“调用服务的客户端实例”的操作,也就是调用一个客户端实例的某一个操作。配合Current属性,可以理解为获取上一次当前进程执行过程中,所用到的那条通道。

案例:

下面的代码示例使用 Current 属性和 GetCallbackChannel(Of T) 方法获取从方法中返回调用方的通道。 此示例中的所有方法都是单向方法,使服务和客户端能够独立地进行双向通信。 在此情况下,示例客户端应用程序在退出前仅需要一次返回调用,但其他客户端(例如 Windows 窗体客户端)可以接收来自服务的任意数量的调用。

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    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 }
原文地址:https://www.cnblogs.com/skyler/p/2217463.html