我有两个.NET C#windows窗体应用程序,它们通过WCF命名管道相互通信。其中一个应用程序是托管WCF服务,另一个是客户端。通信工作正常,客户端可以调用服务方法和回调工作正常等。但是,我遇到的一个问题是如果主机应用程序关闭,客户端无法检测到管道不再可用。我已经尝试在管道上为所有事件注册事件处理程序(Closing,Closed,Faulted),但是当主机应用程序关闭时,这些事件永远不会被调用。此外,如果我尝试使用pipe.State属性检查客户端中的管道状态,即使管道出现故障,我也会返回Opened状态。当然,如果我尝试调用服务方法,它会引发异常。我要么要求我的客户端应用程序通知服务正在关闭,关闭或出现故障,要么我需要能够在每次调用服务方法之前检测到它。
有没有人有这种情况的工作示例?
答案 0 :(得分:2)
在.NET 3.5上使用WCF而不是命名管道对我有用。这是一个例子
public ClientUpdaterTray()
{
InitializeComponent();
InstanceContext context = new InstanceContext(new ClientUpdaterServiceCallback());
client = new ClientUpdaterTrayServiceClient(context);
client.InnerChannel.Faulted += new EventHandler(InnerChannel_Faulted);
client.InnerDuplexChannel.Faulted += new EventHandler(InnerDuplexChannel_Faulted);
}
void InnerDuplexChannel_Faulted(object sender, EventArgs e)
{
// Connection faulted
}
void InnerChannel_Faulted(object sender, EventArgs e)
{
// Connection faulted
}
答案 1 :(得分:0)
我不认为服务器可以告诉客户端它没有客户端实际调用服务器它已经关闭。
我能想到的最佳解决方案是你在try catch中进行调用,然后在错误发生时处理错误。