积极答复者
WCF一个疑惑?

问题
-
建立如下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的性能就有很大问题。
各位大师帮我看看 这是什么原因 ?怎么让两个客户端同时返回,即这两个实例运行在不同线程上??
- 已移动 微软中文技术论坛Moderator 2009年5月19日 10:01 ([Loc]From:Windows Vista 开发相关讨论)
- 已移动 小鱼儿 2009年5月19日 10:05 ([Loc]From:Windows Communication Foundation)
答案
-
建立如下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- 已标记为答案 微软中文技术论坛Moderator 2009年6月30日 3:21
-
建立如下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
(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- 已标记为答案 微软中文技术论坛Moderator 2009年6月30日 3:21
全部回复
-
建立如下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- 已标记为答案 微软中文技术论坛Moderator 2009年6月30日 3:21
-
建立如下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
(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- 已标记为答案 微软中文技术论坛Moderator 2009年6月30日 3:21