结果:真的是你的愚蠢错误。错误地将我的客户端添加到服务的Dictionary中导致了错误。我在所有错误的地方都在寻找问题。
我有一个带回调的命名管道WCF服务。它向客户端报告USB设备插件事件。我遇到的问题是,如果我退出客户端并重新启动它,我总是会遇到通道故障。当我退出客户端时,我按如下方式调用代码:
public void Dispose()
{
try
{
if (factory.State == CommunicationState.Opened)
{
proxy.UnSubscribe(_clientName);
factory.Close();
}
else
{
factory.Abort();
}
}
catch (Exception)
{
factory.Abort();
}
}
我按如下方式创建频道:
NetNamedPipeBinding netPipe = new NetNamedPipeBinding();
// Security is not worth it for this.
netPipe.Security.Mode = NetNamedPipeSecurityMode.None;
// The receive time on the client side is ignored. The time the callback session
// is kept alive is determined by the receive time on the service side which is infinite.
factory = new DuplexChannelFactory<IUsbBroker>(
new InstanceContext(this), netPipe,
new EndpointAddress("net.pipe://localhost/Gyannea/WCFCallbacks/UsbBroker"));
try
{
proxy = (IUsbBroker)factory.CreateChannel();
}
catch (Exception)
{
factory.Abort();
}
我在通道/代理创建中新添加了try-catch,以便在我重新启动客户端时尝试再次重新创建通道,如果在中止后出现故障,那么这是否是问题。它不起作用。
我错过了一些基本的东西吗? 谢谢!
答案 0 :(得分:0)
您如何托管wcf服务。
如果您在Windows Vista或更高版本上运行,则只有在您需要拥有管理员权限的同一登录会话中运行的进程才能访问WCF net.pipe服务。您应该在Windows服务中托管您的服务
请参阅以下帖子
Client on non-admin user can't communicate using net.pipe with services