我看到了几个类似的问题,但是我无法根据它们的答案解决这个问题。
我有一个用于在同一服务器上运行的两个应用程序之间通信的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();
我应该在工厂或通道上配置其他内容吗?