如何使用Silverlight 4检测与我的服务器的连接

时间:2011-03-14 18:54:25

标签: silverlight-4.0

我的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客户端连接/断开连接。

我要尝试的下一件事是套接字,但只是获得一个工作样本是困难的。在继续沿着这条路前行之前,还有其他方法可以实现这个目标吗?

2 个答案:

答案 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) );