Silverlight 4のネットワークサービスの作成

5724 ワード

WEBプロジェクトを右クリックし、Silverlight-enabled WCF Serviceを追加します.サービス名をTestServiceと名付けました.このサービスに追加する方法は以下の通りです.
    public
 class
 TestService
    {
        [OperationContract]
        public DateTime GetServerTime()

        {

            return DateTime.Now;

        }
 
    }

サービスリファレンスを追加し、Silverlightプロジェクトを右クリックし、サービスリファレンスを追加し、先ほど作成したTestServiceを見つけ、新しいリファレンスをMyWebServerと命名します.注意:まずWEBプロジェクトを生成しなければなりません.そうしないと、新しいサービスを正しく認識できません.サービスリファレンスを作成すると、VSはWebserviceとインタラクティブなクラス、サービス名+Clientというプロキシクラスを作成します.たとえば、上記のサービスリファレンスでは、カスタムメソッドを使用するTestServiceClientクラスを作成します.
OK、今から新しく作成したサービスを利用します.まずcsに名前空間を追加します.以下のようにします.
using
 SilverlightApplication3.MyWebServer;      // SilverlightApplication3

Silverlightでは、すべてのWebServicesが非同期でアクセスする必要があります.原理は、Callメソッドです.この場合、アプリケーションはインタフェース上の操作など、他のことを続けることができます.実行結果が戻ると、MethodName Completedメソッドを実行するイベントがトリガーされます.私たちの方法はGetServerTimeCompletedです.コードは次のとおりです.
public
 MainPage()
        {
            InitializeComponent();
            TestServiceClient proxy = new
 TestServiceClient();
            proxy.GetServerTimeCompleted += new
 EventHandler<GetServerTimeCompletedEventArgs>(proxy_GetServerTimeCompleted);
            proxy.GetServerTimeAsync();   // 。
        }

        void
 proxy_GetServerTimeCompleted(object
 sender, GetServerTimeCompletedEventArgs e)
        {
            try

            {
                label1.Content = e.Result.ToLongTimeString();
            }
            catch
 (Exception err)
            {
                label1.Content = "
 
"
;
            } 
        }

デフォルトでは、サービス待ち時間は1分です.つまり、1分後にサービスが対応していない場合(サーバーがダウンしているか、ネットワークがスムーズではない場合)は、方法は終了しますが、コードは次のように設定できます.
proxy.InnerChannel.OperationTimeout = TimeSpan.FromSeconds(30
);

もう一つ問題がありますが、現在のWEBサービスアドレスはどのようなものなのか、もし絶対アドレスであれば、今後プログラムを発表する際に大きな不便に直面します.このサービスアドレスは開発時に使う絶対アドレスなので、今後サーバに配置する際、IPアドレスの変更により、修正する必要があります.経験のある開発者はこの時、相対的な住所を使うことを考慮します.はい、私たちが今やっている仕事はこれです.修正コードは次のとおりです.
EndpointAddress address = new
 EndpointAddress("
http://localhost:
"
 + HtmlPage.Document.DocumentUri.Port + "
/TestService.svc
"
);
TestServiceClient proxy = new
 TestServiceClient();
proxy.Endpoint.Address = address;

上のコードの最初の行を見て、Silverlightアプリケーションとウェブサイトがサーバーにある場合、OK、ポート番号は自動的に取得されます.もちろん、名前空間を2つ追加する必要があります.
using
 System.ServiceModel;
using
 System.Windows.Browser;

次に、サービスを提供するサーバが忙しい場合、ユーザーに「サーバが忙しい」ことを示す友好的なインタフェースをどのように提供するかについても、次の作業を開始します.
この機能を実現するにはBusyIndicatorコントロールが必要ですが、このコントロールはToolkitにあります.まだインストールされていない場合は、すぐにダウンロードしてください.http://silverlight.codeplex.comああ、インストールしたら、ツールバーでそれが見えます.このコントロールをページの適切な位置に置いて、名前の属性をbusyに設定します.
<toolkit:BusyIndicator  Name="
busy
"
 VerticalAlignment="
Top
"
 Width="
100
"
 BusyContent="
 ...
"
 />

その後、コードに次のコードを追加します.
busy.IsBusy = true
; 
proxy.GetServerTimeCompleted += new
 EventHandler<GetServerTimeCompletedEventArgs>(proxy_GetServerTimeCompleted);
proxy.GetServerTimeAsync();
try

{
       label1.Content = e.Result.ToLongTimeString();
}
 catch
 (Exception err)
{
        label1.Content = "
 
"
;
}
 finally

{
        busy.IsBusy = false
;
}

サービスから取得したデータ量が小さすぎるため、効果を表示するとbusyコントロールの効果は点滅するだけですが、データ量が大きい場合、このコントロールが提供するヒント機能は役に立ちます:)