none
WCF一个疑惑? RRS feed

  • 问题

  •  

    建立如下wcf服务 ,采用tcpbinding:

          契约:

       [ServiceContract ]
       public interface Iservice
        {
           [OperationContract ]
           string getstr(string str);

        }

       

        实现:

    [ServiceBehavior (InstanceContextMode =InstanceContextMode.PerCall  )]
        public class servicetest:Iservice
        {
            
            public string getstr(string str)
            {
                Thread.Sleep(3000);
                return   str;
            }
          
        }

       

    用两个客户端同时访问getstr, 结果是一个客户端3秒返回 ,一个客户端6秒 。测试过是产生的两个实例,但这两个实例好像运行在一个线程上。如果是这样,wcf的性能就有很大问题。

     

       各位大师帮我看看 这是什么原因 ?怎么让两个客户端同时返回,即这两个实例运行在不同线程上??

    2008年8月4日 6:53

答案

  •  

    建立如下wcf服务 ,采用tcpbinding:

          契约:

       [ServiceContract ]
       public interface Iservice
        {
           [OperationContract ]
           string getstr(string str);

        }

       

        实现:

    [ServiceBehavior (InstanceContextMode =InstanceContextMode.PerCall  )]
        public class servicetest:Iservice
        {
            
            public string getstr(string str)
            {
                Thread.Sleep(3000);
                return   str;
            }
          
        }

       

    用两个客户端同时访问getstr, 结果是一个客户端3秒返回 ,一个客户端6秒 。测试过是产生的两个实例,但这两个实例好像运行在一个线程上。如果是这样,wcf的性能就有很大问题。

     

       各位大师帮我看看 这是什么原因 ?怎么让两个客户端同时返回,即这两个实例运行在不同线程上??


    Hi,
       这个问题,我写了代码。同一个宿主,单调服务。2个客户端分别调用同一个服务操作请求。互补影响。服务端实例化两个服务实例来响应客户端请求。不阻塞服务端。
      你在检查一下你的代码。不要在客户端再用阻塞调用。我打算把这个测试整理一下,发出来,与大家分享。你的问题很好,受益匪浅~
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年6月22日 17:02
    版主
  •  

    建立如下wcf服务 ,采用tcpbinding:

          契约:

       [ServiceContract ]
       public interface Iservice
        {
           [OperationContract ]
           string getstr(string str);

        }

       

        实现:

    [ServiceBehavior (InstanceContextMode =InstanceContextMode.PerCall  )]
        public class servicetest:Iservice
        {
            
            public string getstr(string str)
            {
                Thread.Sleep(3000);
                return   str;
            }
          
        }

       

    用两个客户端同时访问getstr, 结果是一个客户端3秒返回 ,一个客户端6秒 。测试过是产生的两个实例,但这两个实例好像运行在一个线程上。如果是这样,wcf的性能就有很大问题。

     

       各位大师帮我看看 这是什么原因 ?怎么让两个客户端同时返回,即这两个实例运行在不同线程上??


    Hi,
       这个问题,我写了代码。同一个宿主,单调服务。2个客户端分别调用同一个服务操作请求。互补影响。服务端实例化两个服务实例来响应客户端请求。不阻塞服务端。
      你在检查一下你的代码。不要在客户端再用阻塞调用。我打算把这个测试整理一下,发出来,与大家分享。你的问题很好,受益匪浅~
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
          (1)WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Sessionful Service),单例服务(Singleton Service). 
         (2)服务实例的默认激活方式为会话服务模式。

         (3)针对三种方式,应该说单调服务(Call Service),会话服务(Sessionful Service)不需要客户端等待,可以分别响应客户端请求。单例服务(Singleton Service).服务需要依次响应客户端的请求。

         (4)服务并发模式对客户端请求处理也有影响,当服务的并发模式设置为ConcurrencyMode.Multiple,客户端请求不会放入WCF消息队列,会直接转发给WCF服务实例处理,此时不会等待。默认的最大并发调用数字16,而且限流对此也有影响,大家处理的时候应该注意。

         (5)服务的并发模式默认的情况是ConcurrencyMode.Single.客户端的消息会被放入WCF消息队列。等待服务的处理,此时如果长时间处理请求,可能导致连接出错。      所以这个是针对原有问题的正确和全面的答案~


    这个问题的已经整理成文章WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗。大家可以参考。

    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年6月26日 18:16
    版主

全部回复

  •  

    建立如下wcf服务 ,采用tcpbinding:

          契约:

       [ServiceContract ]
       public interface Iservice
        {
           [OperationContract ]
           string getstr(string str);

        }

       

        实现:

    [ServiceBehavior (InstanceContextMode =InstanceContextMode.PerCall  )]
        public class servicetest:Iservice
        {
            
            public string getstr(string str)
            {
                Thread.Sleep(3000);
                return   str;
            }
          
        }

       

    用两个客户端同时访问getstr, 结果是一个客户端3秒返回 ,一个客户端6秒 。测试过是产生的两个实例,但这两个实例好像运行在一个线程上。如果是这样,wcf的性能就有很大问题。

     

       各位大师帮我看看 这是什么原因 ?怎么让两个客户端同时返回,即这两个实例运行在不同线程上??


    Hi,
       这个问题,我写了代码。同一个宿主,单调服务。2个客户端分别调用同一个服务操作请求。互补影响。服务端实例化两个服务实例来响应客户端请求。不阻塞服务端。
      你在检查一下你的代码。不要在客户端再用阻塞调用。我打算把这个测试整理一下,发出来,与大家分享。你的问题很好,受益匪浅~
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年6月22日 17:02
    版主
  •  

    建立如下wcf服务 ,采用tcpbinding:

          契约:

       [ServiceContract ]
       public interface Iservice
        {
           [OperationContract ]
           string getstr(string str);

        }

       

        实现:

    [ServiceBehavior (InstanceContextMode =InstanceContextMode.PerCall  )]
        public class servicetest:Iservice
        {
            
            public string getstr(string str)
            {
                Thread.Sleep(3000);
                return   str;
            }
          
        }

       

    用两个客户端同时访问getstr, 结果是一个客户端3秒返回 ,一个客户端6秒 。测试过是产生的两个实例,但这两个实例好像运行在一个线程上。如果是这样,wcf的性能就有很大问题。

     

       各位大师帮我看看 这是什么原因 ?怎么让两个客户端同时返回,即这两个实例运行在不同线程上??


    Hi,
       这个问题,我写了代码。同一个宿主,单调服务。2个客户端分别调用同一个服务操作请求。互补影响。服务端实例化两个服务实例来响应客户端请求。不阻塞服务端。
      你在检查一下你的代码。不要在客户端再用阻塞调用。我打算把这个测试整理一下,发出来,与大家分享。你的问题很好,受益匪浅~
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
          (1)WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Sessionful Service),单例服务(Singleton Service). 
         (2)服务实例的默认激活方式为会话服务模式。

         (3)针对三种方式,应该说单调服务(Call Service),会话服务(Sessionful Service)不需要客户端等待,可以分别响应客户端请求。单例服务(Singleton Service).服务需要依次响应客户端的请求。

         (4)服务并发模式对客户端请求处理也有影响,当服务的并发模式设置为ConcurrencyMode.Multiple,客户端请求不会放入WCF消息队列,会直接转发给WCF服务实例处理,此时不会等待。默认的最大并发调用数字16,而且限流对此也有影响,大家处理的时候应该注意。

         (5)服务的并发模式默认的情况是ConcurrencyMode.Single.客户端的消息会被放入WCF消息队列。等待服务的处理,此时如果长时间处理请求,可能导致连接出错。      所以这个是针对原有问题的正确和全面的答案~


    这个问题的已经整理成文章WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗。大家可以参考。

    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年6月26日 18:16
    版主