鈴木章太郎

Silverlight2によるRich Interactive Application 開発 - サンプル編 Tech・Ed 2008 Yokohama Demo紹介(1)-2

2008-09-01 19:05:00

皆さん、こんにちは!前回の続きです。まずは、このデモの実行結果の画面を、お見せしましょう。これが単純なデモなのですが、動かなかったものの実行結果です。申し訳ありません。

Cheeseを検索するとこのような結果が返ってきます。

手順の最初から、もう一度、おさらいさせていただきます。

1.まず、ADO.NET Entity Modelを使って、SQLサーバーデータベースファイル(.mdf)から、サービスを作成するまでです。エンティティモデルの作成を行います。

Visual Studion 2008を起動し、プロジェクトファイルを作成しますが、初期段階はこのようになっている必要があります。

※試される際には、前回Uploadしたプロジェクトから、DBファイルと、画像ファイルだけを取り出して、新しいプロジェクトにインポートして行ってみてください。

まずは、Project Catalog Demo Webのプロジェクトを右クリックして、新しい項目の追加、を行います。その中から、ADO.NET Entity Modelを選びます。

ProductModelと名前をつけて、追加ボタンをクリックします。そうすると、下記のようなダイアログが出ますので、”はい”をクリックします。

次に、下記のようなコンテンツ選択画面が出ますので、データベースを選択して次に進みます。

そうすると、次のようなモデルが出てきますので、データベースを選んで、ProductModel(例)という名前を付けて次に進みます。

ここではテーブルは一つしかないのでこれを選んで、完了を押せばEntity Modelが出来上がりです。

大きなDBのクラスとして作成され、列がマッピングされているのがわかります。詳細な構成は、ProductModel.edmx.csという自動構成ファイルをご覧ください。

2.次にこれを、サービスとして公開します。セッションでご紹介したとおり、これにはBeta2から使えるようになった、Silverlight-Enabled WCF Serviceを利用します。これは、SilverlightがDOMのモデルを前提にしていることから、自動的にASP.NET 互換モードで認証を統合してくれたり、BasicHttpBinding、SOAP1.1を最初から設定してくれるなど、Silverlightに特化したWCFサービスで、非常に便利なものです。

まず、同じプロジェクトの上で、右クリックし、新しい項目の追加、を行います。

Silverlight-Enabled WCF Serviceを選び、名前を、ProductEntService.svc(例)にします。これを編集して、サービスにメソッドを追加して、これを公開します。

まず、IEnumerable型のコレクションを、ResultSetというターゲットのコントロール(XAMLにあります)にバインディングしなければならないので、System.Collections.Generic;を追加し、ProductModelも追加したうえで、下記のようにコーディングをします。

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ProductEntService
{
    [OperationContract]
    public IEnumerable
<Products>GetProducts(string searchString)

    {
        ProductDbEntities Pde = new ProductDbEntities();
        // Add your operation implementation here
        return from p in Pde.Products
               where p.ProductDescr.Contains(searchString)
               select p;
    }

ProductDbEntities は、ProductModel.edmx.csに自動生成されているPartial classです。

これでいったんBuildします。

そうすると、プロダクト名に、検索ボックスに入力した文字列が含まれていれば、結果を返すメソッドをもったサービスが公開されます。

しかも、このテンプレートには、

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

とあり、Web.Configにも下記のように書いてありますので、

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service behaviorConfiguration="ProductServiceBehavior" name="ProductService">
<endpoint address="" binding="basicHttpBinding" contract="ProductService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>

BasicHttpBindingも、ASP.NET統合認証モードも、両方ともここで実現できるというわけです。

3.最後に、Silverlightのコントロール(クライアント側)に、サービス参照の追加を行って、プロキシクライアントを作成し、その結果セットを、XAMLのフォームにバインドすれば、完成です。

ProductCatalogDemo1のプロジェクト上で右クリックして、サービス参照の追加、をクリックして、探索をクリックすると、GetProductsを有するProductServiceというのが見つかりますので、この名前を付けてOKで追加します。

今度は、プロキシのメソッドを作ります。下記のようにコーディングをします。

まず、using句で、ProductCatalogDemo1.ProductService;を入れます。

Expression Blendを開く」で、Page.XAMLを開いていただき、XAMLをみます。そこに、OKボタンというのがあるので、それのプロパティを見つけて、イベントのタブに切り替えて、Clickのところに、”OK_Click”と入力して、ダブルクリックします。Visual Studioの方に画面が切り替わります(あるいはが黄色く点滅します)。

そうすると、OK_Clickというイベントハンドラが出来上がるので、その中に、下記のように入力します。

private void Ok_Click(object sender, RoutedEventArgs e)
{
    var proxy = new ProductService.ProductEntServiceClient();

    proxy.GetProductsAsync(SearchBox.Text);

    proxy.GetProductsCompleted += new EventHandler(proxy_GetProductsCompleted);

 }

GetProductAsyncに、SearchBox(XAMLにある検索テキストボックス)のテキスト欄に入力された文字列を渡します。

GetProductAsyncなのか、というのは、Silverlight自体が非同期のWebサービス呼び出しをしていることに起因します。なぜ非同期のモデルを採用したのか、というのはよく聞かれる質問です。

これは、もしクラッシュしてしまった場合、Silverlightは、ブラウザーのDOMのモデルと統合されているため、ブラウザー自体がクラッシュしてしまう虞があることが一番の理由です。

次に、GetProductsCompleted += で、結果セットをResutSet(IEnumerable型)にバインドしてやる必要があるのですが、ここまで打ってから、TABを2回押すと、自動的に、このメソッドスタブが生成されますので、その中に、下記の内容を入力して、ビルドします。

void proxy_GetProductsCompleted(object sender, GetProductsCompletedEventArgs e)
        {
            ResultsList.ItemsSource = e.Result;
        }

これでビルドすると、下記のエラーーが出ます。

エラー 2 'System.Runtime.Serialization.DataContractAttribute' に 'IsReference' の定義がありません。 C:\Users\shosuz\Documents\Visual Studio 2008\Projects\TechEd2008Demos\ProductCatalogDemo1-Pre\ProductCatalogDemo1\Service References\ProductService\Reference.cs 16 140 ProductCatalogDemo1

この部分は、どうやらパラメータが足りないので、 'IsReference' の個所を、エラーの部分をダブルクリックして、当該個所をすべて削除してみてください(通常はこのファイルはいじらないのですが)。

※セッションでもお話ししましたが、ADO.NET Entity Model(Entity Framework)は一応製品版(.NET Framework 3.5 SP1)Silverlight2は、まだBeta2が最新版ですので、不整合が起こる可能性があります。

再度ビルドしたうえで、ProductCatalogDemo1TestPage.htmlを右クリックしてブラウザで実行すると、冒頭の画面が出ますので、検索ボックスに、Cheeseとか、Wineとかを入れてみて検索してみてください。

以上で、解説は終わりです。是非ともやってみてくださいませ。次回は、ソリューションサンプルに追加したWebサービスのデモを解説いたします。これはほとんど今回と同じですので簡単に解説しますね。

それではまた(^^)!

※マイクロソフト社員のコミュニティ参加について

※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]