我正在尝试为wcf客户端实现重新连接逻辑。我知道你必须在当前频道进入故障状态后创建一个新频道。我在一个通道故障事件处理程序中执行了此操作:
internal class ServiceClient : DuplexClientBase, IServiceClient
{
public ServiceClient(ICallback callback, EndpointAddress serviceAddress)
: base(callback, MyUtility.GetServiceBinding("NetTcpBinding"), serviceAddress)
{
// Open the connection.
Open();
}
public void Register(string clientName)
{
// register to service
}
public void DoSomething()
{
// some code
}
}
public class ClientApp
{
private IServiceClient mServiceClient;
private ICallback mCallback;
public ClientApp()
{
mServiceClient = new ServiceClient( mCallback, new EndpointAddress("someAddress"));
mServiceClient.Register();
// register faulted event for the service client
((ICommunicationObject)mServiceClient).Faulted += new EventHandler(ServiceClient_Faulted);
}
void ServiceClient_Faulted(object sender, EventArgs e)
{
// Create new Service Client.
mServiceClient = new ServiceClient( mCallback, new EndpointAddress("someAddress"));
// Register the EI at Cell Controller
mServiceClient.Register();
}
public void DoSomething()
{
mServiceClient.DoSomething();
}
}
但是在我的单元测试中,我仍然得到一个“通信对象,System.ServiceModel.Channels.ServiceChannel,因为它处于Faulted状态”而无法用于通信。“
回调频道是否仍然存在故障,如果是,我该如何更换回叫频道?
答案 0 :(得分:5)
到目前为止,我已经体验到需要在故障时重新创建WCF连接 - 否则似乎没有办法恢复它。至于何时发生故障,该方法似乎很好,但通常会在当前请求通过时触发并清理WCF连接(建立新连接等) - 导致此操作失败 - 尤其是在超时时。
一些建议: - 如果与超时相关,请跟踪上次调用的时间以及包含超时值的常量。如果由于不活动而导致WCF连接被丢弃,请将其丢弃并重新创建,然后再通过网络发送请求。 - 另一件事,看起来你没有重新添加故障处理程序,这意味着第一次故障将被处理,但第二次故障它将在没有处理程序的情况下倒下,因为没有附加新故障。
希望这有帮助
答案 1 :(得分:0)
您是否尝试通过在Faulted事件处理程序中调用mServiceClient.Abort来重置通信通道?
编辑:
我发现您没有在恢复代码中重新初始化mCallback对象。您可能需要将其分配给新实例。