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

Posted

技术标签:

【中文标题】带有命名管道的 WCF:如何允许并行调用?【英文标题】:WCF with named pipes: how to allow parallel calls? 【发布时间】:2020-04-24 15:33:23 【问题描述】:

这是我第一次使用 WCF 和命名管道。

我要做的是一个 Windows 服务在一个命名管道上监听,而一个小的 GUI 告诉它通过管道做什么。

一切正常:调用服务,将响应传递到 GUI 并完成工作。 但是如果我从 GUI 发送两个并发请求,那么服务将一个一个地处理它们:我想手动管理并发服务端并让它同时运行两个请求。

我尝试为 2 个请求创建 2 个不同的管道,它可以满足我的需要,但当然这不是解决方案。

我使用的是 .NET Framework 4.0,但无法更改。

这是我的示例代码:

SERVICE:管道配置

ServiceHost host = new ServiceHost(typeof(CommandReceiver), new Uri[] new Uri("net.pipe://localhost") );            
host.AddServiceEndpoint(typeof(ICommandReceiver), new NetNamedPipeBinding(), "myPipe");
host.Open();

SERVICE:合约接口和实现

[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();

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

非常感谢您!

【问题讨论】:

【参考方案1】:

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

[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:如何允许并行调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用命名管道从 C++ 调用 WCF 方法?

如何在 WCF 中自动重新连接命名管道绑定

WCF 命名管道 IO 异常 - 管道已结束。 (109, 0x6d)

创建命名管道 (WCF) 所需的最低操作系统权限

如何避免并行命名管道的死锁?

WCF 命名管道流