我的Silverlight应用程序的用户将通过VPN连接访问服务器。因此,内置的NetworkInterface.GetIsNetworkAvailable是没有用的。
我尝试了两种不同的方法来检查与服务器的连接; WebClient和WCF服务。
至于服务,我尝试了以下方法。我无法看到如何使用常规服务调用,因为返回处理程序永远不会命中。
var ping = new PingServiceClient();
ping.InnerChannel.Open( new TimeSpan(1500) );
var result = ping.State == CommunicationState.Opened;
使用WebClient,我尝试了这个:
var client = new WebClient();
client.OpenReadCompleted += (s, e) => { MessageBox.Show( "Returned from server" ); };
client.OpenReadAsync( new PingServiceClient().Endpoint.Address.Uri );
在这两种情况下,结果都是相同的(表示已连接)我是否连接到服务器(我将样本推送到实时服务器并使用VPN客户端连接/断开连接。
我要尝试的下一件事是套接字,但只是获得一个工作样本是困难的。在继续沿着这条路前行之前,还有其他方法可以实现这个目标吗?
答案 0 :(得分:1)
无论如何,WebClient可能会完成返回。您需要检查请求中是否有错误。
var client = new WebClient();
client.OpenReadCompleted += (s,e) =>
{
if (e.Error == null)
{
MessageBox.Show("Returned from server");
}
}
client.OpenReadAsync( new PingServiceClient().Endpoint.Address.Uri );
答案 1 :(得分:0)
我在服务器上放了一个小文本文件并读取它的内容。所以这个测试工作可靠[编辑:见评论]:
var client = new WebClient();
client.OpenReadCompleted += (s, e) =>
{
if ( e.Error == null )
{
var bytesReceived = new byte[ e.Result.Length ];
e.Result.Read( bytesReceived, 0, 50 );
var result = Encoding.UTF8.GetString( bytesReceived, 0, bytesReceived.Length );
if ( result.Contains( "pingback" ) )
{
MessageBox.Show("Server up");
}
else
{
MessageBox.Show( "Server down" );
}
}
else
{
MessageBox.Show("Server down");
}
};
var uri = string.Format( "{0}{1}{2}{3}{4}{5}", App.Current.Host.Source.Scheme, "://", App.Current.Host.Source.DnsSafeHost, ":", App.Current.Host.Source.Port, "/Ping.txt" );
client.OpenReadAsync( new Uri(uri) );