Silverlight 4のネットワークサービスの作成
5724 ワード
WEBプロジェクトを右クリックし、Silverlight-enabled WCF Serviceを追加します.サービス名をTestServiceと名付けました.このサービスに追加する方法は以下の通りです.
サービスリファレンスを追加し、Silverlightプロジェクトを右クリックし、サービスリファレンスを追加し、先ほど作成したTestServiceを見つけ、新しいリファレンスをMyWebServerと命名します.注意:まずWEBプロジェクトを生成しなければなりません.そうしないと、新しいサービスを正しく認識できません.サービスリファレンスを作成すると、VSはWebserviceとインタラクティブなクラス、サービス名+Clientというプロキシクラスを作成します.たとえば、上記のサービスリファレンスでは、カスタムメソッドを使用するTestServiceClientクラスを作成します.
OK、今から新しく作成したサービスを利用します.まずcsに名前空間を追加します.以下のようにします.
Silverlightでは、すべてのWebServicesが非同期でアクセスする必要があります.原理は、Callメソッドです.この場合、アプリケーションはインタフェース上の操作など、他のことを続けることができます.実行結果が戻ると、MethodName Completedメソッドを実行するイベントがトリガーされます.私たちの方法はGetServerTimeCompletedです.コードは次のとおりです.
デフォルトでは、サービス待ち時間は1分です.つまり、1分後にサービスが対応していない場合(サーバーがダウンしているか、ネットワークがスムーズではない場合)は、方法は終了しますが、コードは次のように設定できます.
もう一つ問題がありますが、現在のWEBサービスアドレスはどのようなものなのか、もし絶対アドレスであれば、今後プログラムを発表する際に大きな不便に直面します.このサービスアドレスは開発時に使う絶対アドレスなので、今後サーバに配置する際、IPアドレスの変更により、修正する必要があります.経験のある開発者はこの時、相対的な住所を使うことを考慮します.はい、私たちが今やっている仕事はこれです.修正コードは次のとおりです.
上のコードの最初の行を見て、Silverlightアプリケーションとウェブサイトがサーバーにある場合、OK、ポート番号は自動的に取得されます.もちろん、名前空間を2つ追加する必要があります.
次に、サービスを提供するサーバが忙しい場合、ユーザーに「サーバが忙しい」ことを示す友好的なインタフェースをどのように提供するかについても、次の作業を開始します.
この機能を実現するにはBusyIndicatorコントロールが必要ですが、このコントロールはToolkitにあります.まだインストールされていない場合は、すぐにダウンロードしてください.http://silverlight.codeplex.comああ、インストールしたら、ツールバーでそれが見えます.このコントロールをページの適切な位置に置いて、名前の属性をbusyに設定します.
その後、コードに次のコードを追加します.
サービスから取得したデータ量が小さすぎるため、効果を表示するとbusyコントロールの効果は点滅するだけですが、データ量が大きい場合、このコントロールが提供するヒント機能は役に立ちます:)
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コントロールの効果は点滅するだけですが、データ量が大きい場合、このコントロールが提供するヒント機能は役に立ちます:)