[覚え書き] Silverlight で Pingするアプリを作る その3


前回はPingを実行するサービスの作成と、サービスの参照を追加した。
今回は、ユーザーインターフェースの作成とPingサービスの利用について記す。

まずはSilverlightPingプロジェクトにあるMainPage.xamlを開いて、下記のようにデザインする。

<Grid x:Name="LayoutRoot" Background="White">
    <TextBox Height="24" HorizontalAlignment="Left" Margin="12,20,0,0" Name="txtHost" VerticalAlignment="Top" Width="150" />
    <Button Content="PING" Height="23" HorizontalAlignment="Left" Margin="168,20,0,0" Name="btnPing" VerticalAlignment="Top" Width="75" Click="btnPing_Click" />
    <TextBlock Height="115" HorizontalAlignment="Left" Margin="14,54,0,0" Name="textBlockMessage" Text="" VerticalAlignment="Top" Width="345" />
</Grid>

次に、MainPage.xaml.cs を下記のようにする。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using SilverlightPing.PingService;

namespace SilverlightPing
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        /// <summary>
        /// [PING]ボタンクリック時の処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPing_Click(object sender, RoutedEventArgs e)
        {            
            PingClient pc = new PingClient();
            pc.ExecutePingCompleted += new EventHandler<ExecutePingCompletedEventArgs>(pc_ExecutePingCompleted);

            // Pingの実行
            pc.ExecutePingAsync(txtHost.Text);            

        }

        /// <summary>
        /// Ping完了時の処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void pc_ExecutePingCompleted(object sender, ExecutePingCompletedEventArgs e)
        {
            // 実行結果を表示
            textBlockMessage.Text = e.Result.ToString();
        }
    }
}

上記について補足説明。

まず PingServiceを使用できるようにするため、using SilverlightPing.PingService; を追加している。

次に[Ping]ボタンがクリックされたときのイベントbtnPing_Clickでは、PingClientクラスのインスタンスを作成してしている。
このPingClientクラスは、PingServiceを作成したときに自動で生成されたもので「WCFサービス名Clinent」という名称になる。
WCFサービスはPingという名前で作成したので、PingClientというクラスが自動で生成されたと言うことである。

で、Pingの実行が完了したときのイベントとして、pc_ExecutePingCompleted を追加している。
これにより、Pingの実行完了をイベントで取得し、TextBlockへメッセージを表示している。

以上でSilverlightからPingを実行するアプリの作成は終わり。

ちなみに、このアプリでyahooに対してPingをしてみたところ下記のようになった。

[覚え書き] Silverlight で Pingするアプリを作る その2

今回は Pingのサービス部分を実装。

前回作成したソリューションの「SilverlightPing.Web」プロジェクトにある IPing.cs を開き下記コードを追加する。
(実際には[OperationContract]の下のstring ExecutePing(string HostName); のみ)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace SilverlightPing.Web
{
    // メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コードと config ファイルの両方で同時にインターフェイス名 "IPing" を変更できます。
    [ServiceContract]
    public interface IPing
    {
        [OperationContract]
        string ExecutePing(string HostName);
    }
}

次に Ping.svc.cs を開き、ExecutePingメソッドを実装する。
このメソッドはPingが成功すればIPアドレス、bytes, timeを文字列として返し、失敗した場合には”NG”という文字列を返すメソッド。
今回はエラー処理を実装していない。必要に応じて追加する必要がある。
(あくまでもSilverlightでPingをするという実験なので)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace SilverlightPing.Web
{
    // メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コード、svc、および config ファイルで同時にクラス名 "Ping" を変更できます。
    public class Ping : IPing
    {
        /// <summary>
        /// Pingを実行する
        /// </summary>
        /// <param name="HostName">Ping対象のホスト</param>
        /// <returns></returns>
        public string ExecutePing(string HostName)
        {
            System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
            System.Net.NetworkInformation.PingReply reply;

            // Pingを送信
            reply = ping.Send(HostName);
            
            // Pingが成功したか?
            if (reply.Status == System.Net.NetworkInformation.IPStatus.Success)
                return reply.Address.ToString() + ":bytes=" + reply.Buffer.Length.ToString() +
                    " Time=" + reply.RoundtripTime.ToString() + "ms";
            else
                return "NG";
        }
    }
}

Pingサービスの作成はこれで終了。

次に、作成したサービスを使用できるようにするため、「SilverlightPing」のプロジェクトにサービス参照を追加する。

「サービス参照の追加」ダイアログで[探索]ボタンをクリックして、先ほど作成したサービスを探し、「名前空間」に「PingService」と入力する。
「名前空間」に入力する名称は任意でよい。

次回はユーザーインターフェースの作成とPingの実行について記す。

[覚え書き] Silverlight で Pingするアプリを作る その1

Silverlight では System.Net.NetworkInformation にあるPingクラスを使用することができない。
そこでWCFサービスを利用してPingクラスを使用できるようにしてみる。
まずは新規プロジェクトを作成する。
ここではソリューション名を「SilverlightPing」とした。

次に表示されるダイアログでは何も変更せずに[OK]ボタンをクリックする。

ソリューションエクスプローラで「プロジェクト名.Web」となっている方のプロジェクトにWCFサービスを追加する。
この例では「SilverlightPing.Web」というプロジェクトにWCFサービスを追加。
クラス名は「Ping」とした。

これで下準備は完了。
次回はコードを実装する。