带命名管道的 WCF:如何允许并行调用?
WCF with named pipes: how to allow parallel calls?
这是我使用 WCF 和命名管道的第一种方法。
我要做的是 windows 服务监听命名管道,同时一个小的 GUI 告诉它通过管道做什么。
一切正常:对服务进行调用,将响应传递到 GUI 并完成工作。
但是,如果我从 GUI 发送两个并发请求,那么该服务将一一处理它们:我想手动管理并发服务端并让它 运行 同时请求两个请求。
我已经尝试为 2 个请求创建 2 个不同的管道,它满足了我的需要,但当然这不是解决方案。
我使用的是 .NET Framework 4.0,我无法更改它。
这是我的示例代码:
服务:管道配置
ServiceHost host = new ServiceHost(typeof(CommandReceiver), new Uri[] {new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(ICommandReceiver), new NetNamedPipeBinding(), "myPipe");
host.Open();
服务:合约接口和实现
[ServiceContract]
public interface ICommandReceiver
{
[OperationContract]
string Foo();
[OperationContract]
string Bar();
}
public class CommandReceiver : ICommandReceiver
{
public string Foo()
{
//Do stuffs
System.Threading.Thread.Sleep(3000);
return "FOO";
}
public string Bar()
{
//Do stuffs
System.Threading.Thread.Sleep(3000);
return "BAR";
}
}
客户端:管道配置
ChannelFactory<ICommandReceiver> pipeFactory = new ChannelFactory<ICommandReceiver>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/myPipe"));
ICommandReceiver serviceProxy = pipeFactory.CreateChannel();
客户端:调用服务
public string GetFoo()
{
return serviceProxy.Foo();
}
public string GetBar()
{
return serviceProxy.Bar();
}
任何关于如何改进整个事情的建议,甚至切换到另一种通信方式,将不胜感激。
非常感谢您!
好的,我已经解决了这个问题:首先我在我的合同实施中缺少以下属性 class:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
public class CommandReceiver : ICommandReceiver
{
public string Foo()
{
//Do stuffs
System.Threading.Thread.Sleep(3000);
return "FOO";
}
public string Bar()
{
//Do stuffs
System.Threading.Thread.Sleep(3000);
return "BAR";
}
}
然后我发现该服务可以完美运行,但 在 visual studio 中调试时并非如此。在系统上发布并安装它解决了问题。
这是我使用 WCF 和命名管道的第一种方法。
我要做的是 windows 服务监听命名管道,同时一个小的 GUI 告诉它通过管道做什么。
一切正常:对服务进行调用,将响应传递到 GUI 并完成工作。 但是,如果我从 GUI 发送两个并发请求,那么该服务将一一处理它们:我想手动管理并发服务端并让它 运行 同时请求两个请求。
我已经尝试为 2 个请求创建 2 个不同的管道,它满足了我的需要,但当然这不是解决方案。
我使用的是 .NET Framework 4.0,我无法更改它。
这是我的示例代码:
服务:管道配置
ServiceHost host = new ServiceHost(typeof(CommandReceiver), new Uri[] {new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(ICommandReceiver), new NetNamedPipeBinding(), "myPipe");
host.Open();
服务:合约接口和实现
[ServiceContract]
public interface ICommandReceiver
{
[OperationContract]
string Foo();
[OperationContract]
string Bar();
}
public class CommandReceiver : ICommandReceiver
{
public string Foo()
{
//Do stuffs
System.Threading.Thread.Sleep(3000);
return "FOO";
}
public string Bar()
{
//Do stuffs
System.Threading.Thread.Sleep(3000);
return "BAR";
}
}
客户端:管道配置
ChannelFactory<ICommandReceiver> pipeFactory = new ChannelFactory<ICommandReceiver>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/myPipe"));
ICommandReceiver serviceProxy = pipeFactory.CreateChannel();
客户端:调用服务
public string GetFoo()
{
return serviceProxy.Foo();
}
public string GetBar()
{
return serviceProxy.Bar();
}
任何关于如何改进整个事情的建议,甚至切换到另一种通信方式,将不胜感激。
非常感谢您!
好的,我已经解决了这个问题:首先我在我的合同实施中缺少以下属性 class:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
public class CommandReceiver : ICommandReceiver
{
public string Foo()
{
//Do stuffs
System.Threading.Thread.Sleep(3000);
return "FOO";
}
public string Bar()
{
//Do stuffs
System.Threading.Thread.Sleep(3000);
return "BAR";
}
}
然后我发现该服务可以完美运行,但 在 visual studio 中调试时并非如此。在系统上发布并安装它解决了问题。