c# – 为什么此WCF服务一次只能为一个请求服务?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 为什么此WCF服务一次只能为一个请求服务?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2966字,纯文字阅读大概需要5分钟。
内容图文
![c# – 为什么此WCF服务一次只能为一个请求服务?](/upload/InfoBanner/zyjiaocheng/808/5a89becff84f41b587a37379fcfad389.jpg)
我看过几个类似的问题,但根据他们的答案,我无法解决这个问题.
我有以下WCF服务用于在同一服务器上运行的应用程序之间进行通信,请注意ConcurrencyMode设置为Multiple:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false, ConcurrencyMode = ConcurrencyMode.Multiple)]
internal class MyService : ServiceBase, IMyService
{
...
}
我们有一个WPF应用程序,我们通过以下方式创建服务实例:
var serv = new MyService();
var servHost = new ServiceHost(serv, new Uri("..."));
servHost.AddServiceEndpoint(typeof(IMyService), ServiceBase.DefaultInterProcessBinding, string.Empty);
servHost.Open();
ServiceBase.DefaultInterProcessBinding的位置如下:
public static readonly Binding DefaultInterProcessBinding = new NetNamedPipeBinding()
{
CloseTimeout = TimeSpan.FromHours(1),
OpenTimeout = TimeSpan.FromHours(1),
ReceiveTimeout = TimeSpan.MaxValue,
SendTimeout = TimeSpan.FromHours(1),
HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
MaxBufferSize = 1073741824,
MaxBufferPoolSize = 524288,
MaxReceivedMessageSize = 1073741824,
TransferMode = TransferMode.Buffered,
ReaderQuotas = new XmlDictionaryReaderQuotas()
{
MaxDepth = 32,
MaxStringContentLength = 8192,
MaxArrayLength = 16384,
MaxBytesPerRead = 4096,
MaxNameTableCharCount = 16384
}
};
当我们并行向此服务发送多个请求时,由于某种原因,它一次只处理一个请求. (确定性很容易测试,因为我们有相当长的运行请求,因此可以非常清楚地看到我们在客户端并行调用3个请求,而在服务器端,它们一次一个地顺序处理. )
这可能是什么原因?我应该检查哪些其他配置参数?
(更新:我从客户端调用服务的代码与此类似:
Task.Factory.StartNew(() =>
{
serviceClient.Foo();
});
Task.Factory.StartNew(() =>
{
serviceClient.Bar();
});
Task.Factory.StartNew(() =>
{
serviceClient.Baz();
});
通过调试,我可以看到,所有三个请求都被立即调用,但它们在服务器上一次处理一个.)
更新2:问题可能不是在服务器上,而是在客户端上.如果我为调用创建一个新的客户端对象,那么它们将被正确并行处理.我通过以下方式创建客户端:
var factory = new ChannelFactory<IMyService>(ServiceBase.DefaultInterProcessBinding, new EndpointAddress("..."));
serviceClient = factory.CreateChannel();
我应该在工厂或渠道配置其他东西吗?
解决方法:
我发现问题不是在服务器上,而是在客户端.
看来如果你用ChannelFactory创建一个频道,你必须在它上面显式调用Open().否则,每次调用请求时框架都会调用EnsureOpened(),并且EnsureOpened()将阻塞,直到上一个请求完成,因此实际上一次只发送一个请求.
(详情:http://blogs.msdn.com/b/wenlong/archive/2007/10/26/best-practice-always-open-wcf-client-proxy-explicitly-when-it-is-shared.aspx)
所以改变这段代码
var factory = new ChannelFactory<IMyService>(ServiceBase.DefaultInterProcessBinding, new EndpointAddress("..."));
serviceClient = factory.CreateChannel();
对此:
var factory = new ChannelFactory<IMyService>(ServiceBase.DefaultInterProcessBinding, new EndpointAddress("..."));
serviceClient = factory.CreateChannel();
((IClientChannel)serviceClient).Open();
解决了问题,现在请求是并行发送的.
(顺便说一句,我需要相当多的谷歌搜索来找到这个解决方案,我很奇怪为什么这个问题在MSDN上没有更强烈的广告宣传.)
内容总结
以上是互联网集市为您收集整理的c# – 为什么此WCF服务一次只能为一个请求服务?全部内容,希望文章能够帮你解决c# – 为什么此WCF服务一次只能为一个请求服务?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。