2012-10-12 5 views
5

従来のサードパーティツール(C/C++で開発されたもの)があります。このツールには、ジョブを実行するWindowsサーバーを実行するサーバーコンポーネントがあります(複雑な連鎖の長いデータベースクエリ)。また、すべてのユーザーのデスクトップにインストールされたクライアントモジュールがあり、ユーザーはジョブの追加、実行中のジョブとその進捗状況の表示、ジョブの削除、つまり基本的なジョブの管理が可能になります。 .NETテクノロジを使用して、このようなツールを社内で開発したいと考えています。.NETでこのクライアント/サーバーアプリケーションを設計する方法は?

現在、私たちはこのようなツールをどのように設計し、パズルの重要な部分が欠落しているように見えています。

クライアント:現在、我々は、コンソールアプリケーションとしてそれを開発するために考えているが、どのような建築家、それをにかなり確実ではない:私たちは

WPF

にサーバを開発するためのクライアントのデスクトップアプリケーションを決定しました。

ジョブを実行し続けながら、我々が持っている主な問題は、どのようにサーバーのコンソールアプリケーションは、(WPFのクライアントは、ジョブのステータスを取得するように)ASMXまたはWCF Webサービスを

を公開することができていますか?

変更があった場合に、進行状況の更新をサーバーからWPFクライアントにプッシュする方法はありますか?

私たちはこれを行う方法を研究しようとしていますが、トピックに関連するものは見つけられません。記事/指針の指針は大きな助けになるでしょう。

+0

可能な複製:http://stackoverflow.com/questions/11170457/discussion-client-server-application-architecture –

+0

@MikeMcCaughanあなたが言ったリンクは類似しているように見えますが、私の場合は私のサーバーではありませんクライアントにサービスを提供することに加えて、長時間実行する作業があります。 – Aron

+0

これを試してください:http://dasunhegoda.com/architecture-products/1180/ – Techie

答えて

3

混乱は、ジョブとWCFエンドポイントの実行が同じものであることを前提としています。私はこれを3つの主要項目に分割します:

  1. クライアントジョブ管理のUI要素を持つクライアントアプリケーションです。
  2. ジョブ情報を取得し、ジョブ要求の作成/削除を送信するWCFサービスエンドポイント。
  3. ジョブを実行するアプリケーション。

クライアントアプリケーション

クライアント・アプリケーションは、WCFサービスを通じてジョブデータを取得する必要があります。あなたは、WCFサービスは、クライアント・アプリケーションが必要とするエンドポイントを公開します/削除ジョブ/などの雇用を創出

WCFサービス /実行中のジョブを表示するため

を画面を提供します。これには、CreateJob、ViewJobs、DeleteJobなどの項目が含まれます。サービスは、データベースのバックエンドに対して読み取り/書き込みを行う必要があります。

仕事アプリケーション

業務アプリケーションは、新しい/削除されたジョブをポーリングし、ジョブが完了するのに必要なものは何でも実行することになり。これは、WCFサービスが読み取るデータベースバックエンドのジョブステータスを更新します。これは、SQLジョブ、Windowsサービス、コンソールアプリケーションなどです(おそらくWindowsサービスとしています。これは、常にジョブを処理するために常に実行されているものが必要なためです)。これが否定されたジョブを実行しているアプリケーションからのWCFサービスを分離することにより

質問

How can a server console application expose ASMX or WCF web services(so that WPF clients get the status of the jobs) WHILE CONTINUING TO RUN THE JOBS?

。注:WCFとジョブ実行者をホストするコンソールアプリケーションを持つことはできますが、概念的には別々のものと考えることができます(同じコンソールアプリケーションでのホスティングは実装の詳細です)。

How to push progress updates from server to the WPF clients when there is a change?

私はこれをしないだろう。 UIをポーリングするか、またはWCFエンドポイントを介してステータスを取得するための更新ボタンを提供します。

これを絶対に行う必要がある場合は、ジョブを実行するときにJob Executerがメッセージを公開する必要があり、クライアントアプリケーションはこれらのメッセージ(MSMQ、サービスバス実装、BizTalkなど)を受け取る必要があります。私は、サーバープッシュ

にポーリングを好むのはなぜ

は今、私はそれについて考えることを私はプッシュスタイル、およびいくつかのどこで投票を行うだろう場合は、おそらくあります。

オフサイト(一般的にVPN経由またはインターネット経由で接続)のクライアントが多数ある場合、クライアントの帯域幅としてポーリングを行い、ネットワークの待ち時間にはコストがかかります。クライアントの数が多い場合、すべての更新メッセージをすべての加入クライアントに送信する必要があります。この場合、私はモデルに教えないでください。

クライアントが社内にいて、リアルタイム情報が必要な場合は、プッシュモデルが理にかなっています。この場合、クライアントはサーバーアプリケーションに接続し、接続を介してメッセージを前後に送信することができます(私は個人的にこれを行っていないので、ソケットの設定よりも上位のものを設定する方法はありません)。

メッセージが更新されるが、クライアントがさまざまな場所にある場合は、パブ/サブモデルが最適な場合があります。 pub/subでは、アプリケーションは更新メッセージが発生したときにプッシュします。メッセージングシステムは、メッセージを購読しているクライアントが存在するかどうかを確認し、購読しているすべてのクライアントについて、メッセージのコピーをメッセージングシステムに転送します。あなたの例では、クライアントはジョブメッセージにsubscribeを送り、メッセージングシステムはクライアントが指定した場所に更新を送信します(クライアントはメッセージを受け入れる方法が必要です)。NServiceBus、BizTalkは、このタイプの通信の例です。

+0

詳細な説明をありがとう。私が探しているものに非常に近い。サーバープッシュよりもポーリングを好む理由を説明してください。 – Aron

+0

私の答えはより多くの考えを広げました。高レベルから、私は快適さと親しみのために投票を行う傾向があります。私は主にリクエストレスポンスモデルに役立つウェブアプリケーションを扱っています。 –

1

WCFサービスのホスティングオプションについて質問しているようです。このような4つのオプションがあります。

  1. はセルフマネージドホスティングアプリケーションに - つまりは、コンソールアプリケーションを作成するには、サービスを作成し、(コンソールアプリケーション)が生きている間、それは生き続けて別のWPFのアプリなど。それは
  2. インターネットインフォメーションサービス(IIS)を起動時にWindowsによって自動的に起動可能なWindowsサービスを作成します - - ASP.NETサービス
  3. Windowsプロセスアクティブ化サービス(WAS)と同様に、それをホストするWindowsサービスマネージド
  4. - 新しいアクティベーションサービス、私は個人的にそれを使用していません。

詳細情報here

あなたの質問に完全に答えるために、私はASMXサービスを使用しません。理由の良いリストについては、this questionを参照してください。

関連する問題