带有命名管道的WCF:如何允许并行调用



这是我使用WCF和命名管道的第一种方法。

我要做的是一个windows服务监听一个命名管道,同时一个小GUI通过管道告诉它该做什么。

一切都很好:对服务进行调用,向GUI发送响应,然后完成工作。但是,如果我从GUI发送两个并发请求,那么服务将逐一处理它们:我希望手动管理并发服务端,并让它同时运行这两个请求。

我试着为这两个请求创建了两个不同的管道,它满足了我的需求,但当然这不是一个解决方案。

我正在使用.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();
}

任何关于如何改进整个事情的建议,甚至转换到另一种沟通方式,都将不胜感激。

提前非常感谢!

好吧,我已经解决了这个问题:首先,我的合同实现类缺少以下属性:

[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";
}
}

然后我发现该服务工作得很好,但在visualstudio中调试时就不能了。在系统上释放并安装它解决了问题。

最新更新