locked
SilverlightでDB変更通知の受け取り RRS feed

  • 質問

  • Silverlightの表示中に、データベースに変更があったら、
    Silverlight(XAP)でDBからデータを取得する・・といった事が実現出来ないか考えております。

     

    調べたところ、Silverlightから直接データベースにアクセスすることはできないようなので、
    データの取得にはWebサービスかWCFサービスを利用しようと考えています。

     

    Silverlightでタイマー処理を行い、定期的に(Webサービスを呼んで)データを取得する、といった事は出来ると思うのですが、
    定期的ではなくデータベースに変更があった場合にデータを取得しに行く・・という事が実現できればと考えています。

     

    ASP.NETのクエリ通知のように、データベースに変更があったという情報をSilverlightで受け取る事は出来るのでしょうか?

     

    開発環境はVisual Studio 2008、Silverlight3 で、WebサーバーはIIS 6.0 か 7.0 です。

     

    何か良い情報をお持ちの方がおりましたら、ご教授お願い致します。

     

    Silverlight初心者のため、質問内容に見当違いの所などありましたら、合わせて教えて頂けると幸いです・・。

    2010年6月2日 11:08

回答

  • >ASP.NETのクエリ通知のように

    ↑って、Web アプリケーションのクライアント側まで直接的に通知が到達するんでしたっけ?

    DBMS から Web アプリケーションに対して通知が行われて、それをトリガに Web アプリケーションがキャッシュをクリア、後はクライアントとWebアプリケーションの実装(事実上、AJAX などによるポーリング)でなんとかしてくれ、的なものなのかなーと思っていましたが…

    ごく一般的な構成を採用する場合、インターネット上に配置されたサーバとクライアントとの間で HTTP 接続を使用してやりとりする以上、サーバからクライアントに対して接続を行うことはできません。

    なので、表面的にはいかにもサーバ主導でクライアントに対して通知が送られてきているように見えても、最下層ではクライアントからポーリング的な操作が行われているはずです。

    # 若干の例外もあるにはありますが、ごく一般的な Web システム前提ということで… (どーせその例外を IIS はサポートしてませんし)

    • 回答の候補に設定 山本春海 2010年6月14日 6:23
    • 回答としてマーク 山本春海 2010年6月18日 4:14
    2010年6月2日 11:52
  • 私の場合、このような時は可能な限りソケット通信を使っています。

    別途ポートを開くことが可能であれば、これが一番ではないでしょうか?

    • 回答の候補に設定 山本春海 2010年6月14日 6:23
    • 回答としてマーク 山本春海 2010年6月18日 4:14
    2010年6月3日 0:09
  • 話が少し戻りますが、SilverlightではPollingDuplexHttpBindingが使用できるようなので、これも検討する余地はありそうです。

    情報源はこちら。

    http://www.microsoft.com/japan/powerpro/TF/column/st3_01_3.mspx

    http://msdn.microsoft.com/ja-jp/library/dd470106(VS.95).aspx

     

    • 回答の候補に設定 山本春海 2010年6月14日 6:23
    • 回答としてマーク 山本春海 2010年6月18日 4:14
    2010年6月8日 15:43

すべての返信

  • >ASP.NETのクエリ通知のように

    ↑って、Web アプリケーションのクライアント側まで直接的に通知が到達するんでしたっけ?

    DBMS から Web アプリケーションに対して通知が行われて、それをトリガに Web アプリケーションがキャッシュをクリア、後はクライアントとWebアプリケーションの実装(事実上、AJAX などによるポーリング)でなんとかしてくれ、的なものなのかなーと思っていましたが…

    ごく一般的な構成を採用する場合、インターネット上に配置されたサーバとクライアントとの間で HTTP 接続を使用してやりとりする以上、サーバからクライアントに対して接続を行うことはできません。

    なので、表面的にはいかにもサーバ主導でクライアントに対して通知が送られてきているように見えても、最下層ではクライアントからポーリング的な操作が行われているはずです。

    # 若干の例外もあるにはありますが、ごく一般的な Web システム前提ということで… (どーせその例外を IIS はサポートしてませんし)

    • 回答の候補に設定 山本春海 2010年6月14日 6:23
    • 回答としてマーク 山本春海 2010年6月18日 4:14
    2010年6月2日 11:52
  • 渋木宏明様、返信ありがとうございます。

    >>ASP.NETのクエリ通知のように

    >↑って、Web アプリケーションのクライアント側まで直接的に通知が到達するんでしたっけ?

     サーバー側にあるASP.NETまでの通知で、クライアントまでは通知は到達してませんでした・・。 思い違いをしていました。

    >ごく一般的な構成を採用する場合、インターネット上に配置されたサーバとクライアントとの間で HTTP 接続を使用してやりとり

    >する以上、サーバからクライアントに対して接続を行うことはできません。

    やはり難しいのですね・・。 記載頂いたように、クライアントからのポーリングで実装方法を検討してみます。

    2010年6月2日 23:46
  • 私の場合、このような時は可能な限りソケット通信を使っています。

    別途ポートを開くことが可能であれば、これが一番ではないでしょうか?

    • 回答の候補に設定 山本春海 2010年6月14日 6:23
    • 回答としてマーク 山本春海 2010年6月18日 4:14
    2010年6月3日 0:09
  • >サーバー側にあるASP.NETまでの通知で、クライアントまでは通知は到達してませんでした・・。

    やっぱりそうですよね (^^;

    実際に使った事ないので、うろ覚えレベルでしたが>じぶん

    >クライアントからのポーリングで実装方法を検討してみます。

    最下層ではポーリングにならざるを得ませんが、自作するとなると工数も発生しますし、総合的な品質を確保するのもなかなかムズカシイと思います。

    なので、ミドルウェアなど、なんらかの既存の基盤をりようするのが良い気がします。(具体的な製品とかしらないのですが。。。)

    >別途ポートを開くことが可能であれば、これが一番ではないでしょうか?

    イントラなら有りだと思いますが、インターネット上に配置するようなサービスの場合はちょと厳しいんじゃないでしょうか。

    2010年6月3日 0:27
  • puni様、返信ありがとうございます。

    Silverlightではソケット通信が使えるのですね。

    イントラネットで使用するアプリなので、ポートを開くことは可能かも知れません。

    Silverlightでのソケット通信の方法や制限などを調べて、検討してみます。

    2010年6月3日 2:33
  • 渋木宏明様、返信ありがとうございます。

    ミドルウェアの利用は難しいかも知れませんが、打診してみます。

    品質の確保は・・テストを繰り返してなんとかするしかないですかね ^^;

    ポーリングやソケット通信などヒントを頂いたので、色々考えてみます。

    参考になるWebページや情報が見つかったらここに追記します。

    2010年6月3日 2:43
  • >品質の確保は・・テストを繰り返してなんとかするしかないですかね ^^;

    作り込みの精度の問題もさることながら、あまり安易な手法を採用すると、クライアントからサーバに対してのポーリングの頻度と総量によっては、サーバに対してサービス拒否攻撃(DoS)を行うのと同じことになってしまう点に注意して下さい。

    なので、もしある程度規模の大きな展開を考えているのであれば、なるべく実績のある既存インフラ(探せば無償利用可能なものもあるかもしれません)を利用するのが吉と思います。

     

    2010年6月3日 4:23
  • >イントラネットで使用するアプリなので、ポートを開くことは可能かも知れません。

    イントラネットなんですね。

    なら、手法選択の幅も広いし、サーバ負荷の見積も立てやすいですね。

     

    2010年6月3日 4:41
  • 渋木宏明様、返信ありがとうございます。

    参考にさせて頂きます。

    ASP.NETのページにSilverlightをホストし、

    ASP.NETが「DBクエリ通知」で更新通知を受け取ったら、ソケット通信によりASP.NET→Silverlight(XAP)に通知を投げる、という方法で出来ました。

    実際の運用に耐えうるレベルかはわからないので、今回この方法を採用するかどうかは未定ですが、よい学習になりました。

    2010年6月8日 5:59
  • 話が少し戻りますが、SilverlightではPollingDuplexHttpBindingが使用できるようなので、これも検討する余地はありそうです。

    情報源はこちら。

    http://www.microsoft.com/japan/powerpro/TF/column/st3_01_3.mspx

    http://msdn.microsoft.com/ja-jp/library/dd470106(VS.95).aspx

     

    • 回答の候補に設定 山本春海 2010年6月14日 6:23
    • 回答としてマーク 山本春海 2010年6月18日 4:14
    2010年6月8日 15:43
  • cafelasm様、情報ありがとうございます。

    PollingDuplexHttpBindingを使った方法と、DBクエリ通知を組み合わせる事で、やりたい事が実現できました。

    有効な手法の一つとして検討します。どうもありがとうございました。

    2010年6月10日 0:32