none
AjaxとWCFを組み合わせ、Ajax+COMETのような機能を実装 RRS feed

  • 質問

  • タイトルの様な事をしたいと思っています。
    具体的には、サーバ側に別マシンのCPU使用率を外部ファイルに吐きだすという機能があり、
    その使用率を出来るだけリアルタイムに近い状態でクライアントに表示したいと思っています。
    普通に見に行くと負荷がかかるため、非同期のサーバ・プッシュ型を利用したいと考えています。


    下記のサイトで聞いてみたところ、リンク先のコールバック処理が使えると教えて頂きました。

    http://handcraft.blogsite.org/ComponentGeek/ShowArticle/43.aspx


    また以下の2点が重要だそうです。

    ・サービスの呼び出し時に、WCFサービスはstaticフィールドにコールバック情報を保持する
    ・必要に応じて、保持したサービスクラスのインスタンス経由でコールバックを呼び出すようにする。

    ただ、保持の方法や、どうやってコールバックの起こる条件を設定するのかが分からず困っています。

    どなたか方法や詳しいサイトを知っていれば、教えて頂けると幸いです。
    せめてコールバック条件の設定方法だけでも分かれば良いのですが・・・。
    2010年1月24日 5:30

回答

  • チョトスさんこんにちは

    たぶん質問にこたえた handcraft です。 まず下記の件、できるか確証がないと断った上で書いたはずです。

    >・サービスの呼び出し時に、WCFサービスはstaticフィールドにコールバック情報を保持する
    >・必要に応じて、保持したサービスクラスのインスタンス経由でコールバックを呼び出すようにする。


    とにかく、クライアントはブラウザだったのですね。ということは WCFは IISかなにかでホストされることを考えていますか?
    Cometのようなという記述で気付くべきだったのですが、おそらくサーバはIISでホストされるのではなくまた、クライアントともにコンソールプログラムだと思って当時返信したと思います。

    ブラウザの場合も、Ajax を使用してWebサービスを呼び出し、サーバ側で値が変わるまで処理を返す処理をブロックしていれば、擬似的に comet と同じようなことをできると思いますが。リソースが非効率に使用されると思います。

    クライアントの数、サーバのスペック等にもよりますが、javascript (or Silverlight?)で定期的にポーリングするほうがシンプルで簡単だと思うのですが。
    負荷のことを気にしているというのなら、 ASP.NET の Cache 機能を使用すればある程度対応できます。下記のサイトで紹介されているように、 キャッシュ破棄のタイミングをファイルが変更されたらという指定も可能です。

    [ASP.NET]キャッシュ破棄のタイミングを指定するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/201aspcashdep/aspcashdep.html
    • 回答としてマーク 菊地俊介 2010年2月10日 8:08
    2010年1月26日 0:17

すべての返信

  • その使用率を出来るだけリアルタイムに近い状態でクライアントに表示したいと思っています。
    クライアントアプリケーションは何なのでしょうか?
    handcraftさんのサイトでは、コンソールアプリケーションを使用していますがそれであればサンプルそのままでWCFサービス側を書き換えるだけでいけますよね。
    2010年1月25日 9:07
  • >西脇様
    クライアントはブラウザを考えています。
    また、クライアント側は一回表示して終わりではなく、表示を随時変化させようと思っています。
    これは調べたところ、Ajaxを使えばどうにかなるという事は分かりました。
    とりあえず今はまずサービス側に手をつけていこうとしている感じです。

    現時点でどうにかしなければならないと思っているのは、

    ・外部ファイルの更新をコールバック条件にするにはどうすればいいか?

    という点です。

    また、最初の投稿に書いた「コールバック情報をstaticフィールドに保持する」というのも今一つよく分かっていません。
    とりあえず別クラスの中でstaticの変数を作成しておき、それを実行クラス内で使用しています。
    何か使わなければならない理由などはあるのでしょうか?

    質問だらけで申し訳ありませんが、答えて頂けると幸いです。
    2010年1月25日 11:20
  • チョトスさんこんにちは

    たぶん質問にこたえた handcraft です。 まず下記の件、できるか確証がないと断った上で書いたはずです。

    >・サービスの呼び出し時に、WCFサービスはstaticフィールドにコールバック情報を保持する
    >・必要に応じて、保持したサービスクラスのインスタンス経由でコールバックを呼び出すようにする。


    とにかく、クライアントはブラウザだったのですね。ということは WCFは IISかなにかでホストされることを考えていますか?
    Cometのようなという記述で気付くべきだったのですが、おそらくサーバはIISでホストされるのではなくまた、クライアントともにコンソールプログラムだと思って当時返信したと思います。

    ブラウザの場合も、Ajax を使用してWebサービスを呼び出し、サーバ側で値が変わるまで処理を返す処理をブロックしていれば、擬似的に comet と同じようなことをできると思いますが。リソースが非効率に使用されると思います。

    クライアントの数、サーバのスペック等にもよりますが、javascript (or Silverlight?)で定期的にポーリングするほうがシンプルで簡単だと思うのですが。
    負荷のことを気にしているというのなら、 ASP.NET の Cache 機能を使用すればある程度対応できます。下記のサイトで紹介されているように、 キャッシュ破棄のタイミングをファイルが変更されたらという指定も可能です。

    [ASP.NET]キャッシュ破棄のタイミングを指定するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/201aspcashdep/aspcashdep.html
    • 回答としてマーク 菊地俊介 2010年2月10日 8:08
    2010年1月26日 0:17
  • >handcraft様

    以前はありがとうございました。
    確定ではないというのは重々承知していましたが、質問する時に確証が無いと書くのも悪いと思い、ああいった書き方になってしまいました。
    申し訳ありません。

    WCFについてですが、今のところはIISでホストすることを考えています。
    教えて頂いたものを参考にしつつ手を加えて何とかできないかと試行錯誤中です。

    Javascriptでポーリングですか・・・。
    Ajaxの事ばかり考えていましたが、同じような事が可能なのですね。検討してみたいと思います。
    貴重な情報ありがとうございます。
    Silverlightは別のフレームワークが必要みたいなので、今回は見送ろうと思います。


    お陰さまで色々と選択の幅が広りました。
    教えて頂いた情報を元になんとかやってみたいと思います。
    2010年1月26日 14:04