首页 新闻 会员 周边

wcf netTcpBinding 为什么服务端输出的SessionID是一样的??

0
[已解决问题] 解决于 2013-09-04 13:04

用的是netTcpBinding

Client

static void Main(string[] args)
        {
            
            
            for (int i = 0; i < 40; i++)
            {
            
                ServiceClient client = new ServiceClient();
                ThreadPool.QueueUserWorkItem(_ =>
                {

                    Console.WriteLine("SessionID:{0}", client.Add(1, 2));
                   
                });
            }

            Console.Read();
           
     
        }

Server

[ServiceContract()]
    public interface IService
    {
        [OperationContract()]
        string Add(int i, int j);
    }


[ServiceBehavior(InstanceContextMode= InstanceContextMode.PerSession)]
    public class Service:IService.IService
    {
      
        public string Add(int i, int j)
        {
            Console.WriteLine(OperationContext.Current.SessionId);
          
            return OperationContext.Current.SessionId;
        }
    }

客户端调用的时候用的是不同的ServiceClient 实例, 服务端也是InstanceContextMode.PerSession

这不是应该会有不同的回话吗?

wcf
koi的主页 koi | 初学一级 | 园豆:4
提问于:2013-09-04 10:00
< >
分享
最佳答案
0

因为是同一个会话嘛。

奖励园豆:5
Launcher | 高人七级 |园豆:45045 | 2013-09-04 10:21

客户端调用的时候用的是不同的ServiceClient 实例, 服务端也是InstanceContextMode.PerSession

这不是应该会有不同的回话吗? 还有为什么输出总会带有id=2 id=3 这种东西。。

koi | 园豆:4 (初学一级) | 2013-09-04 10:33

@koi: 可你的代码:

ServiceClient client = new ServiceClient();
                ThreadPool.QueueUserWorkItem(_ =>
                {

                    Console.WriteLine("SessionID:{0}", client.Add(1, 2));
                  
                });

显示的是你使用了同一个 client.

你改成这样:


                ThreadPool.QueueUserWorkItem(_ =>
                {

ServiceClient client = new ServiceClient();
                    Console.WriteLine("SessionID:{0}", client.Add(1, 2));
                  
                });

Launcher | 园豆:45045 (高人七级) | 2013-09-04 10:43

@Launcher: 你这样写好像跟我的是一样的

我按下面的改了下  结果还是一样的 还是一样的sessionid

for (int i = 0; i < 40; i++)
            {
            
               var q = i;
                ThreadPool.QueueUserWorkItem(_ =>
                {
                    ServiceClient client = new ServiceClient();
                    Console.WriteLine("SessionID:{0}", client.Add());
                    Console.WriteLine("Q:{0}", q);
                });
            }

 

koi | 园豆:4 (初学一级) | 2013-09-04 10:48

@koi: OperationContract(IsInitiating = true, IsTerminating = true)]

Launcher | 园豆:45045 (高人七级) | 2013-09-04 11:07

@Launcher: 结果还是都一样的SessionID  

koi | 园豆:4 (初学一级) | 2013-09-04 11:12

@Launcher: 我是这样改的

[ServiceContract(SessionMode=SessionMode.Required)]
public interface IService
{
[OperationContract(IsInitiating = true, IsTerminating = true)]
string Add();
}
koi | 园豆:4 (初学一级) | 2013-09-04 11:13

@koi: 得,你等我写个程序给你演示下吧。

Launcher | 园豆:45045 (高人七级) | 2013-09-04 11:18

@koi: 你那个 id = 0,1,2,3 就是表示的不同的会话,别只看前面的 uuid 。

Launcher | 园豆:45045 (高人七级) | 2013-09-04 12:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册