WPF,SilverlightとXAML読書ノート第48-Silverlightネットワークと通信
28524 ワード
説明:本シリーズは基本的に『WPFの秘密』の読書ノートです.構成と文章の内容については、「WPFの秘書」の編成を参照して、内容をまとめて、個人的な理解を加えました.
この部分はSilverlightのネットワークと通信機能について重点的に議論します.2.0版からは、Silverlightは、複数のモードのネットワークアクセスをサポートしています.最も原始的なSilverlightコントロールからサポートされているJavaScript方法は、Silverlight Frame ewarkに内蔵されているCクラスを通じて、ほとんど任意の機能を実現できます.これらの方法を一つ一つ検討します.
SilverlightコントロールによるJavaScriptサポート
このような方式の最終目的はJavaScriptで取得したネットワークデータをSilverlightの要素に割り当てるだけであり、コードは大体以下の通りである. JavaScriptがデータを取得する方法は、次の2つに分けられます.
xmlHttpRequestコンポーネントを使用したJavaScriptを作成し、Ajax方式でデータを非同期的に取得する.
私たちは下記のコードセグメントを通してこの方式の実現を見てみます.
Silverlight項目にASP.NET Webサービスの参照を追加し、アクセスします.
Silverlightには「System.Web.Script.Services.Script Service」という属性を含むサービス(メソッドも「WebMethod」と表記される必要があります)の参照を追加し、ページでScript Managerコントロールを使ってサービスを参照すると自動的にJavaScriptエージェントが生成されます.これは私たちが必要なものです.上記の操作が完了したら、下記のJavaScriptコードを使ってWeb Serviceにアクセスして、私達が欲しいデータを取得することができます.注意生成されたJavaScriptエージェントでは、WebServiceName.WebMethodという対象の名来訪問サービスを使用しています.
Silverlight FraameweetにおけるWebClinetとWebRequestの方法
まず、WebClintの機能を理解します.NETを使ってSilverlightプログラムを行う時、WebClientは最も使いやすいネットワークアクセス機能を提供しています.このタイプの2つの方法DownloadStringAsyncとOpenReadAsyncはそれぞれ文字列を取得し、他のタイプのデータを取得します.これらの方法も非同期法に対応するコールバック関数は、それぞれDownloadString ComplettedとOpenReadComplettedである.下のコードはDownloadStringAyncを使ってWebClientの使用を実証しました.
SilverlightでWCFを使用します.
Silverlight Frame ewarkではSystem.ServiceModelのクラスがSilverlightのWCFに対するサポートを提供しています.以下の小さな例は、Visual StudioにWCFの参照を付加することによってプロキシを生成することを示しており、これは符号化の複雑さを大幅に低減している.この例をセグメントコードで分析します.まずDataContractです.これはサーバ側とクライアント側のデータ転送タイプの契約です. これらはSilverlightにおけるインターネットへのアクセスの主な方法です.
本文が終わる
この部分はSilverlightのネットワークと通信機能について重点的に議論します.2.0版からは、Silverlightは、複数のモードのネットワークアクセスをサポートしています.最も原始的なSilverlightコントロールからサポートされているJavaScript方法は、Silverlight Frame ewarkに内蔵されているCクラスを通じて、ほとんど任意の機能を実現できます.これらの方法を一つ一つ検討します.
SilverlightコントロールによるJavaScriptサポート
このような方式の最終目的はJavaScriptで取得したネットワークデータをSilverlightの要素に割り当てるだけであり、コードは大体以下の通りである.
1 var valFromNet;
2 var SL = document.getElementById("silverlightPlugIn");
3 SL.content.findName("txt").Text = valFromNet;
xmlHttpRequestコンポーネントを使用したJavaScriptを作成し、Ajax方式でデータを非同期的に取得する.
私たちは下記のコードセグメントを通してこの方式の実現を見てみます.
1 function getAsyncResult() {
2 xmlHttp = new XMLHttpRequest();
3 xmlHttp.open("GET", "http://localhost:36360/ServerTime.ashx", true);
4 xmlHttp.onreadystatechange = handleAJAXCallback;
5 xmlHttp.send(null);
6 }
7
8 function handleAJAXCallback() {
9 if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) {
10 var SL = document.getElementById("silverlightPlugIn");
11 SL.content.findName("txt").Text = xmlHttp.responseText;
12 }
13 }
反転関数で非同期取得の結果をSilverlightの要素に設定します.この例では、ASP.NETが作成したHttpHandlerを訪問しました.他の任意の入手可能なデータのUrlに変えられます.ちなみに、レギュレータ関数でチームXmlHttpRequestの状態を検出しました.4は完了を要求します. Silverlight項目にASP.NET Webサービスの参照を追加し、アクセスします.
Silverlightには「System.Web.Script.Services.Script Service」という属性を含むサービス(メソッドも「WebMethod」と表記される必要があります)の参照を追加し、ページでScript Managerコントロールを使ってサービスを参照すると自動的にJavaScriptエージェントが生成されます.これは私たちが必要なものです.上記の操作が完了したら、下記のJavaScriptコードを使ってWeb Serviceにアクセスして、私達が欲しいデータを取得することができます.注意生成されたJavaScriptエージェントでは、WebServiceName.WebMethodという対象の名来訪問サービスを使用しています.
1 function onLoad()
2 {
3 Service.getTime(onSuccess, onFailed,"");
4 }
5
6 function onSuccess(result)
7 {
8 var sl = document.getElementById("silverlightPlugIn");
9 sl.content.findName("txtShort").Text = result.strShortTime;
10 sl.content.findName("txtLong").Text = result.strLongTime;
11 }
12
13 function onFailed(result)
14 {
15 alert(result);
16 }
ここで得られたresultというオブジェクトは、JSON形式に順序付けられています.Silverlight FraameweetにおけるWebClinetとWebRequestの方法
まず、WebClintの機能を理解します.NETを使ってSilverlightプログラムを行う時、WebClientは最も使いやすいネットワークアクセス機能を提供しています.このタイプの2つの方法DownloadStringAsyncとOpenReadAsyncはそれぞれ文字列を取得し、他のタイプのデータを取得します.これらの方法も非同期法に対応するコールバック関数は、それぞれDownloadString ComplettedとOpenReadComplettedである.下のコードはDownloadStringAyncを使ってWebClientの使用を実証しました.
1 public Page()
2 {
3 InitializeComponent();
4 WebClient cl = new WebClient();
5 Uri uri = new Uri("http://localhost:36360/Web/Time.ashx");
6
7 cl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(cl_DownloadStringCompleted);
8 cl.DownloadStringAsync(uri);
9 }
10
11 void cl_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
12 {
13 txtTime.Text = e.Result;
14 }
なお、WebClientを使用するには、System.Net名前空間への参照を追加する必要があります.WebClientには、他の一般的な属性も含まれており、データが転送中にtrueに戻ります.WebClientでは、現在進行中の非同期転送をキャンセルするために、Cancel Ayncメソッドが使用され、このときDownloadString Completted/OpenReadComplettedイベントパラメータのCancelled属性はtrueに設定されます.次に紹介するのはWebRequest類であり、このクラスは標準的なHTTP要求を実現するために用いられ、主にPOSTを通じてアクセスするアドレスを含む.このクラスの使用は.NET FramewarkのHttpWebRequestと似ています.以下ではコアコードの一部を例として示します. 1 private void b_Click(object sender, RoutedEventArgs e)
2 {
3 Uri uri = new Uri("http://localhost:22602/WebRequestTest_Web/SubmitForm.ashx");
4 WebRequest rq = WebRequest.Create(uri);
5 rq.Method = "POST";
6 rq.ContentType = "application/x-www-form-urlencoded";
7 rq.BeginGetRequestStream(new AsyncCallback(RequestReady), rq);
8 rq.BeginGetResponse(new AsyncCallback(ResponseReady), rq);
9 }
10 void RequestReady(IAsyncResult aR)
11 {
12 WebRequest rq = aR.AsyncState as WebRequest;
13 Stream rqStream = rq.EndGetRequestStream(aR);
14 StreamWriter w = new StreamWriter(rqStream);
15 w.Write("t1=" + t1.Text + "&");
16 w.Write("t2=" + t2.Text + "&");
17 w.Write("t3=" + t3.Text );
18 w.Flush();
19 }
上記のコードでは、要求データの取得と応答データの取得に際して、非同期要求を行います.応答データの取得が完了すると、以下のようなコールバック関数が必要となります. 1 void ResponseReady(IAsyncResult aR)
2 {
3 WebRequest rq = aR.AsyncState as WebRequest;
4 using(WebResponse rs = rq.EndGetResponse(aR))
5 using (Stream rpStream = rs.GetResponseStream())
6 {
7 StreamReader rdr = new StreamReader(rpStream);
8 string postStatus = rdr.ReadToEnd();
9 }
10 }
SilverlightでWCFを使用します.
Silverlight Frame ewarkではSystem.ServiceModelのクラスがSilverlightのWCFに対するサポートを提供しています.以下の小さな例は、Visual StudioにWCFの参照を付加することによってプロキシを生成することを示しており、これは符号化の複雑さを大幅に低減している.この例をセグメントコードで分析します.まずDataContractです.これはサーバ側とクライアント側のデータ転送タイプの契約です.
1 [DataContract]
2 public class Person
3 {
4 public Person(string strName, string strAge)
5 {
6 Name = strName;
7 Age = strAge;
8 }
9 [DataMember]
10 public string Name { get; set; }
11 [DataMember]
12 public string Age { get; set; }
13 }
それからサービスコードです.サービス契約とサービスの実現を含みます. 1 [ServiceContract]
2 public interface IPersonService
3 {
4 [OperationContract]
5 Person[] getPeople();
6 }
7
8 public class PersonService : IPersonService
9 {
10 public Person[] getPeople()
11 {
12 Person[] people =
13 {
14 new Person("Derek Snyder","32"),
15 new Person("Yoshi Latimer","19"),
16 new Person("Mark Steel","31")
17 };
18 return people;
19 }
20 }
この簡単な例に対して、私達はバックミュージックHttpBindingを使います.サービスのconfigにおけるServiceModelの部分は以下のコードを参照してください. 1 <system.serviceModel>
2 <behaviors>
3 <serviceBehaviors>
4 <behavior name="PersonServiceBehavior">
5 <serviceMetadata httpGetEnabled="true"/>
6 <serviceDebug includeExceptionDetailInFaults="false"/>
7 </behavior>
8 </serviceBehaviors>
9 </behaviors>
10 <services>
11 <service behaviorConfiguration="PersonServiceBehavior" name="PersonService">
12 <endpoint address="" binding="basicHttpBinding" contract="IPersonService">
13 <identity>
14 <dns value="localhost"/>
15 </identity>
16 </endpoint>
17 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
18 </service>
19 </services>
20 </system.serviceModel>
以上がサービスの重要なコードです.WCFサービスの参照を追加した後、私達は下記のコードを使ってWCFにサービスを訪問することができます.1 public Page()
2 {
3 InitializeComponent();
4 Binding binding = new BasicHttpBinding();
5 EndpointAddress endPoint = new EndpointAddress("http://localhost:36360/WCFService/PersonService.svc");
6 PSProxy.PersonServiceClient client = new PSProxy.PersonServiceClient(binding, endPoint);
7 client.getPeopleCompleted += new EventHandler<PersonService.PSProxy.getPeopleCompletedEventArgs>(client_getPeopleCompleted);
8 client.getPeopleAsync();
9 }
コールバック関数では、得られたオブジェクトをItems Controlのデータテンプレートに結びつけます.ItemControlのXAML: 1 <ItemsControl x:Name="_item">
2 <ItemsControl.ItemTemplate>
3 <DataTemplate>
4 <StackPanel Orientation="Vertical">
5 <StackPanel Orientation="Horizontal">
6 <TextBlock FontWeight="Bold" Text="{Binding Name}" />
7 <TextBlock Text=" : "></TextBlock>
8 <TextBlock FontWeight="Bold" Text="{Binding Age}" />
9 </StackPanel>
10 </StackPanel>
11 </DataTemplate>
12 </ItemsControl.ItemTemplate>
13 </ItemsControl>
コールバック関数:1 void client_getPeopleCompleted(object sender, PersonService.PSProxy.getPeopleCompletedEventArgs e)
2 {
3 _item.ItemsSource = e.Result;
4 }
クライアントの構成は、参照を追加する際に自動的に生成され、もはや説明しない.本文が終わる