Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 目标计算机未运行时WCF超时_C#_.net_Wcf - Fatal编程技术网

C# 目标计算机未运行时WCF超时

C# 目标计算机未运行时WCF超时,c#,.net,wcf,C#,.net,Wcf,我的.NET 4.5应用程序使用WCF NET.tcp绑定到与服务器的CumCommunication。沟通非常简单。客户端只调用一个方法,服务器返回true/false。服务器必须在5秒内响应。如果没有,客户端将尝试其他服务器。时间对我来说至关重要。 当带有服务器的PC运行时,WCF超时(发送、接收、打开、关闭、操作和通道初始化超时)工作正常。但是,当电脑未运行时(或配置中填写了错误的IP地址),引发异常几乎需要30秒。我是否必须配置任何其他超时以使其正常工作 这是我的客户端代码(app.co

我的.NET 4.5应用程序使用WCF NET.tcp绑定到与服务器的CumCommunication。沟通非常简单。客户端只调用一个方法,服务器返回true/false。服务器必须在5秒内响应。如果没有,客户端将尝试其他服务器。时间对我来说至关重要。 当带有服务器的PC运行时,WCF超时(发送、接收、打开、关闭、操作和通道初始化超时)工作正常。但是,当电脑未运行时(或配置中填写了错误的IP地址),引发异常几乎需要30秒。我是否必须配置任何其他超时以使其正常工作

这是我的客户端代码(app.config文件中没有任何内容):

NetTcpBinding=newnettcpbinding(SecurityMode.None)
{
SendTimeout=TimeSpan.FromMillions(Configuration.Instance.LocalConfiguration.Failover.SendTimeout),
ReceiveTimeout=TimeSpan.FromMillicles(Configuration.Instance.LocalConfiguration.Failover.ReceiveTimeout),
OpenTimeout=TimeSpan.FromMillimes(Configuration.Instance.LocalConfiguration.Failover.OpenTimeout),
CloseTimeout=TimeSpan.FromMillimes(Configuration.Instance.LocalConfiguration.Failover.CloseTimeout),
TransactionFlow=false,
TransactionProtocol=TransactionProtocol.Default,
TransferMode=TransferMode.Buffered,
Security=new NetTcpSecurity(){Mode=SecurityMode.None},
ReliableSession=new OptionalReliableSession(){Enabled=false},
ReaderQuotas=new System.Xml.XmlDictionaryReaderQuotas(){MaxArrayLength=16384,MaxBytesPerRead=4096,MaxDepth=32,MaxNameTableCharCount=16384,MaxStringContentLength=8192},
Name=“NoSecurity”,
MaxReceivedMessageSize=65535,
MaxConnections=10,
MaxBufferSize=65535,
MaxBufferPoolSize=524288,
ListenBacklog=10,
HostNameComparisonMode=HostNameComparisonMode.strong通配符
};
BindingElementCollection be=binding.CreateBindingElements();
tcptTransportBindingElement tcpBe=be.Find();
tcpBe.ChannelInitializationTimeout=TimeSpan.fromMillimes(Configuration.Instance.LocalConfiguration.Failover.InitializationTimeout);
tcpBe.TransferMode=TransferMode.Buffered;
CustomBinding CustomBinding=新的CustomBinding(be);
FailoverClient.ListenerClient serviceClient=新的FailoverClient.ListenerClient(customBinding,新端点地址(address));
serviceClient.InnerChannel.OperationTimeout=TimeSpan.FromMillicles(Configuration.Instance.LocalConfiguration.Failover.OperationTimeout);
ps:30秒后引发的异常是“System.ServiceModel.EndpointNotFoundException…”。。。尝试持续了00:00:04.123。TCP错误10060…“带嵌套异常”System.Net.Sockets.SocketException…远程方在一段时间后没有正确响应…'

编辑: 我找到了一个解决办法,但它没有解决我的问题。我可以使用异步调用并等待完成

        Task<bool> task = serviceClient.HeartbeatAsync();
        try
        {
            if (task.Wait(5000))
            {
                Console.WriteLine("Task result: " + task.Result);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
Task Task=serviceClient.HeartbeatAsync();
尝试
{
如果(任务等待(5000))
{
Console.WriteLine(“任务结果:+Task.result”);
}
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}

您确定应用了此配置get吗?您是否检查了服务绑定上正在运行的值,以确保将其设置为5?据我所知,4个配置参数应该足够好,我猜在网络层有问题……路由协议是决定如何到达服务器的协议……因此,所有相邻路由器都会被查询IP地址,如果IP地址正确或IP跳数不多,确定路由所需的时间非常少,但对于不正确或停机的IP,相邻路由器可能会将查询级联到其相邻路由器,并且可能会加起来确定没有可用的此类服务器。这解释了所需的时间,但是否有任何配置可以使其超时我不确定….@Marty超时值仅在成功连接到服务器且客户端在超过指定间隔的时间内等待服务器响应时有效。在这种情况下,连接本身未建立,并且需要相当长的时间才能发现服务器不可用,因此OP正在查找配置,该配置确定如果在x秒内未找到服务器,则应停止查找服务器。您是否可以使用类似于[此]?()您是否尝试过用显式的测试时间跨度替换“故障切换”超时?从技术上讲,这应该由openTimeout来处理。像这样:或者
        Task<bool> task = serviceClient.HeartbeatAsync();
        try
        {
            if (task.Wait(5000))
            {
                Console.WriteLine("Task result: " + task.Result);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }