C# 操作';Ping&x27;无法完成,因为会话通道在等待接收错误消息时超时
我有一个客户端-服务器应用程序,客户端访问wcf服务。C# 操作';Ping&x27;无法完成,因为会话通道在等待接收错误消息时超时,c#,wcf,exception,callback,timeout,C#,Wcf,Exception,Callback,Timeout,我有一个客户端-服务器应用程序,客户端访问wcf服务。 我也有一个记时器。计时器运行后—WS发送客户机回调.Ping请求,以确保客户机仍然处于活动状态。 由于某种原因,当连接两个(或多个)客户端时,其中一个客户端在尝试执行Callback.Ping时将崩溃,并出现以下异常: 由于会话失败,无法完成操作“Ping” 通道在等待接收消息时超时。增加 超时,或者在中设置绑定的接收超时属性 您的配置文件,或在上设置ReceiveTimeout属性 直接装订。 我要提到的是,客户端和WS-configur
我也有一个记时器。计时器运行后—WS发送客户机回调.Ping请求,以确保客户机仍然处于活动状态。
由于某种原因,当连接两个(或多个)客户端时,其中一个客户端在尝试执行Callback.Ping时将崩溃,并出现以下异常:
由于会话失败,无法完成操作“Ping” 通道在等待接收消息时超时。增加 超时,或者在中设置绑定的接收超时属性 您的配置文件,或在上设置ReceiveTimeout属性 直接装订。 我要提到的是,客户端和WS-configuration文件都声明了
receiveTimeout、sendTimeout、openTimeout和closeTimeout
,设置为10:00:00
分钟。有人能帮我解决问题吗 编辑:
app.config(客户端):
Web.config(服务器):
计时器运行后,服务调用Ping:
public class SubscribedCustomer
{
public IServerCallback Callback;
public SubscribedCustomer(IServerCallback callback)
{
Callback = callback;
}
public void Ping(List<int> itemIds, IServerCallback serverCallback = null)
{
try
{
Callback.Ping(itemIds);
}
catch (Exception ex)
{
if (serverCallback != null)
{
Callback = serverCallback;
//recursive call with the new servercallback set
Ping(itemIds);
}
else
{
SetClientNotRunning("No reply from client");
}
}
}
}
公共类订阅客户
{
公共回调;
公共订阅客户(IServerCallback)
{
回调=回调;
}
公共无效Ping(列表项ID,IServerCallback serverCallback=null)
{
尝试
{
Ping(itemIds);
}
捕获(例外情况除外)
{
if(serverCallback!=null)
{
回调=服务器回调;
//使用新的servercallback集进行递归调用
Ping(itemIds);
}
其他的
{
SetClientNotRunning(“没有来自客户端的回复”);
}
}
}
}
服务器合同:
public interface IServerCallback
{
[OperationContract(IsOneWay = true)]
void Ping(List<int> itemIds);
}
公共接口调用
{
[运营合同(IsOneWay=true)]
作废Ping(列表项ID);
}
谢谢 您正在使用使用可靠会话的绑定。这与接收/发送的超时时间不同。检查这个,看看是否有帮助。否则,您需要发布有关客户端和服务配置以及实现详细信息的完整详细信息。Hi@PetarVučetin。我在配置文件中不使用可靠的会话。我读过你提到的链接,它很有趣,但似乎不适合我的情况。我已经更新了上面的代码。你怎么想?请发布你的服务合同和服务实施代码,以便我们能够看到哪里出了问题。嘿@MarcSelis。谢谢你的评论。上面更新了我的代码。@Marcelis你有什么建议吗?
public class SubscribedCustomer
{
public IServerCallback Callback;
public SubscribedCustomer(IServerCallback callback)
{
Callback = callback;
}
public void Ping(List<int> itemIds, IServerCallback serverCallback = null)
{
try
{
Callback.Ping(itemIds);
}
catch (Exception ex)
{
if (serverCallback != null)
{
Callback = serverCallback;
//recursive call with the new servercallback set
Ping(itemIds);
}
else
{
SetClientNotRunning("No reply from client");
}
}
}
}
public interface IServerCallback
{
[OperationContract(IsOneWay = true)]
void Ping(List<int> itemIds);
}