快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

葡京娱乐场真人秀_龟发之家论坛



大年夜家都知道WCF会话模式有几个要求:1、会话左券;2、绑定支持;3、实例模式为PerSession。这几个要素是WCF支持的需要前提。

会话左券:由办事端供给实现,客户端调用时只持有左券定义,以是必要经由过程左券定义见告客户端,办事端是支持会话的。

绑定:会话没有绑定的支持也就无从谈起了。

InstanceContextMode为PerSession。经由过程它可以包管在会话时代,办事实例不会被销毁。

3、SessionMode=SessionMode.Allowed下办事端与客户真个SessionId匹配程度

评论争论之前,先给出左券以及办事实现。如下:

[ServiceContract(SessionMode = SessionMode.Allowed)]

public interface IAdd{

[OperationContract]int Add(int x,int y);

}[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

public class AddService : IAdd,IDisposable{

#region IAdd Members

public int Add(int x, int y)

{if (null != OperationContext.Current.SessionId)

{Console.WriteLine("SessionId is {0}", OperationContext.Current.SessionId);

}else

{Console.WriteLine("SessionId is null");

}return x + y;

}

#end葡京娱乐场真人秀region

public void Dispose(){

Console.WriteLine("Dispose Thread Id is {0}",System.Threading.Thread.CurrentThread.ManagedThreadId);}

}

3.1、NetTcpBinding的会话

3.1.1、启用靠得住会话

在设置设置设备摆设摆设文件中进行设置设置设备摆设摆设即可。如下:

调用之后造访SessionId:

using (ChannelFactory channelFactory = new ChannelFactory("tcp"))

{IAdd proxy = channelFactory.CreateChannel();

Console.WriteLine("result is {0}", proxy.Add(1, 2));IContextChannel contextChannel = proxy as IContextChannel;

using (OperationContextScope contextScope = new OperationContextScope(contextChannel)){

Console.WriteLine("operationContextScope hashcode is {0}", contextScope.GetHashCode());if (null == OperationContext.Current.SessionId)

{Console.WriteLine("SessionId is null");

}else

{Console.WriteLine("Session is {0}", OperationContext.Current.SessionId);

}}

}

办事端输出:

客户端输出:

在客户端调用之前获取SessionId:

办事端输出如下:

客户端输出如下:

假如在调用办事之前,手动打开代理,环境如何呢?

将客户真个代码做如下改动:

IAdd proxy = channelFactory.CreateChannel();

(proxy as ICommunicationObject).Open();IContextChannel contextChannel = proxy as IContextChannel;

using (OperationContextScope contextScope = new OperationContextScope(contextChannel)){

Console.WriteLine("operationContextScope hashcode is {0}", contextScope.GetHashCode());if (null == OperationContext.Current.SessionId)

{Console.WriteLine("SessionId is null");

}else

{Console.WriteLine("Session is {0}", OperationContext.Current.SessionId);

}}

Console.WriteLine("result is {0}", proxy.Add(1, 2));

办事端输出:

客户端输出:

3.1.2 禁用靠得住会话(NetTcpBinding默认)

办事端输出:

客户端输出:

小结:在NetTcpBinding绑定下,假如启用靠得住会话传输,则办事端与客户真个SessionId是相同的。假如禁用靠得住会话,则两者SessionId是不一样的。别的,在进行第一次调用前,客户端获取不到SessionId。除非在调用之前手动打开代理。

3.2、ws*绑定

在ws-*绑定中,WCF经由过程在消息头中加入SessionId,经由过程SessionId来识别客户端(准确葡京娱乐场真人秀来说是代理)。以下应用WsHttpBinding进行阐明。

3.2.1、禁用靠得住会话(调用之前手动打开代理)

办事端输出:

客户端输出:

3.2.2、启用靠得住会话

办事端输出:

客户端输出:

3.2.3、禁用会话(不手工打开代理,调用之前获取SessionId)

办事端输出:

小结:靠得住会话对客户端SessionId有影响。在开启靠得住会话时,如客户端在调用之前手动打开代理,则客户端与办事真个SessionId相同;假如调用之前不手动打开代理,则客户端获取不到SessionId,只有在第一次调用后才能获取到SessionId;在禁用靠得住会话时,客户端在不手动打开代理的环境下调用办事会发生非常。

别的阐明:应用Tcp作为传输协议,经由过程三次握手,它经由过程超时、丢包重传的机制包管客户端到办事真个消息传输成功,但与WCF中消息的靠得住会话是有本色区其余。WCF中经由过程自身机制包管从RM源到目标源消息的发送以及确认机制、以及办事端中消息从目标源到终极交付工具之间消息的交付机制。应用NetTcpBinding时,我们可以经由过程它的默认构造函数看看构成的绑定元素有哪些。如下代码:

var binding = new NetTcpBinding();

BindingElementCollection collection = binding.CreateBindi葡京娱乐场真人秀ngElements();foreach (BindingElement bindingElement in collection)

{Console.WriteLine(bindingElement.GetType());

}Console.WriteLine("--------应用构造函数,设置NetTcpBinding容许靠得住会话--------");

var binding2 = new NetTcpBinding(SecurityMode.None,true);BindingElementCollection collection2 = binding2.CreateBindingElements();

foreach (BindingElement bindingElement in collection2){

Console.WriteLine(bindingElement.GetType());}

输出如下:

上图中ReliableSessionBindingElement便是创建可开会话信道的。

总结:不合类型的协议对付SessionId的获取是葡京娱乐场真人秀有影响的。无论对付TCP协议照样ws-* 协议,假如客户端调用之前葡京娱乐场真人秀不手动打开代理,则调用之前客户端是获取不到SessionId的;在进行第一次调用之后,客户端才能获取到与办事端相同的SessionId(由于进行调用时,会自动打开代理).

是否启用会话也会影响到SessionId。对付TCP协议来说,禁用靠得住会话,客户端获取到SessionId与办事端是不一样的;对付ws-* 协议而言:假如禁用靠得住会话,调用之前假如不手动代开代理,则调用会发生非常。

您可能还会对下面的文章感兴趣: