WCF 命名管道错误:管道已结束。 (109, 0x6d)

Posted

技术标签:

【中文标题】WCF 命名管道错误:管道已结束。 (109, 0x6d)【英文标题】:WCF Named Pipe Error: The pipe has been ended. (109, 0x6d) 【发布时间】:2014-03-11 19:17:51 【问题描述】:

我查看了其他有关“管道已结束。(109, 0x6d)”的帖子,但没有一个解决了我的问题。我在这个博客上有一个相对简单的设置基础:http://tech.pro/tutorial/855/wcf-tutorial-basic-interprocess-communication

我觉得我非常关注它,只是删除了 HTTP 绑定。

这是服务器代码:

public class InterProcessServer : IInterProcessServer 

    private ServiceHost _host = null;

    public event EventHandler<CommandLineArgsEventArgs> CommandLineArgsReceived;

    protected InterProcessServer(Uri serverAddress, string serviceName)
    
        IPassCommandLineArgs passArgs = null;
        passArgs = CreatePassCommandLineArgs();
        passArgs.CommandLineArgsReceived += new EventHandler<CommandLineArgsEventArgs> passArgs_CommandLineArgsReceived);

        _host = new ServiceHost(passArgs, new Uri[]  serverAddress );
        _host.AddServiceEndpoint(typeof(IPassCommandLineArgs), new NetNamedPipeBinding(), serviceName);
        _host.Open();
    

    public static IInterProcessServer CreateInterProcessServer(Uri serverAddress, string serviceName)
    
        return new InterProcessServer(serverAddress, serviceName);
    

    public void Dispose()
    
        try
        
            _host.Close();
        
        catch  
    

    private void passArgs_CommandLineArgsReceived(object sender, CommandLineArgsEventArgs e)
    
        EventHandler<CommandLineArgsEventArgs> handler = CommandLineArgsReceived;

        if (handler != null)
            handler(sender, e);
    

    protected virtual IPassCommandLineArgs CreatePassCommandLineArgs()
    
        return new PassCommandLineArgs();
    

这是客户端代码:

public class InterProcessClient : IInterProcessClient

    private IPassCommandLineArgs _pipeProxy = null;
    private ChannelFactory<IPassCommandLineArgs> _pipeFactory = null;

    protected InterProcessClient(Uri serviceAddress)
    
        _pipeFactory = new ChannelFactory<IPassCommandLineArgs>(new NetNamedPipeBinding(), new EndpointAddress(serviceAddress));
        _pipeProxy = _pipeFactory.CreateChannel();
    

    public static IInterProcessClient CreateInterProcessClient(Uri serviceAddress)
    
        return new InterProcessClient(serviceAddress);
    

    public void SendArgs(string[] args)
    
        _pipeProxy.PassArgs(args);           
    


    public void Dispose()
    
        try
        
            if (_pipeFactory != null)
                _pipeFactory.Close();
        
        catch  
    

我已确保客户端连接的地址是正确的。谁能提供一个想法,为什么当从客户端调用 _pipeProxy.PassArgs(args); 时我可能会收到错误消息?测试只是在同一台机器上以不同进程运行的两个控制台应用程序之间进行。

框架 4.0 顺便说一句。

谢谢!

编辑这里是服务接口和实现:

[ServiceContract]
public interface IPassCommandLineArgs

    event EventHandler<CommandLineArgsEventArgs> CommandLineArgsReceived;

    [OperationContract]
    void PassArgs(string[] args);


[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PassCommandLineArgs : IPassCommandLineArgs

    public event EventHandler<CommandLineArgsEventArgs> CommandLineArgsReceived;

    public void PassArgs(string[] args)
    
        EventHandler<CommandLineArgsEventArgs> hander = CommandLineArgsReceived;

        if (hander != null)
            hander(this, new CommandLineArgsEventArgs()  Args = args );
    

【问题讨论】:

您能否发布您的服务接口 IPassCommandLineArgs 及其使用的所有类型? 【参考方案1】:

好的。这是调用代码将具有无效字符的地址传递给客户端的问题。仅此而已。

【讨论】:

您的意思是net.pipe://server:1234/path 地址的字符无效?角色是什么? 最后有一个“\0”。不知道为什么我检查地址时没有看到它。 Tcp/ip 使用 :1234 等端口。我认为这对命名管道无效。

以上是关于WCF 命名管道错误:管道已结束。 (109, 0x6d)的主要内容,如果未能解决你的问题,请参考以下文章

WCF NamedPipe CommunicationException - “管道已结束。 (109,0x6d)。“

神秘 => 从管道读取错误:管道已结束。 (109, 0x6d)

WCF命名管道另一个端点错误但没有其他端点?

WCF 服务命名管道故障

WCF 命名管道在 WinApp 中超时,但在 ConsoleApp 中没有?

从 VB6 到 WCF 的命名管道