3


6

この質問を最初に投稿したとき、Webサービスとアプリケーションコントローラとの間に強い結合があり、そこでコントローラはサービスに複数のスレッドを開く必要がありました。 1つのデータセット クライアントが返されるデータを使用する準備が整う前に大量の処理とマージを行う必要があり、そのレイヤをサービスに移動して、サプライヤへの非同期スレッドをサービスに開かせて結果をマージすることを望みました。クライアントに返す前に。

私が抱えていた1つの課題は、すべてのスレッドが完了して結果がマージされるまで待つことができなかったことです。 そのため、サービスにオブザーバパターンを実装して、新しい結果セットがマージされて使用可能になったときにアプリケーションに通知し、それらをアプリケーションに送信するように要求しました。

ASMX WebサービスまたはWCFを使用してこれを実行する方法を探していましたが、これまでのところWCFを使用して実装することに気付きましたが、このスレッドは常に提案や改善のために開かれています。

6 Answer


5


OK私の問題に対する解決策は WCFから来た

ASMX Webサービスの従来の要求応答操作に加えて、WCFは次のような追加の操作タイプをサポートします。一方向コール、二重コールバック、ストリーミング。

推測するのはそれほど難しくありません、二重コールバックは私が探していたものでした。

二重コールバックでは、サービスからクライアントへのコールバックを実行できます。 コールバックコントラクトはサーバー上で定義され、クライアントはコールごとにコールバックエンドポイントを提供する必要があります。 その後、コールバック参照をいつ、何回使用するかを決定するのは、サービス次第です。

双方向対応のバインディングのみがコールバック操作をサポートします。 WCFは、HTTPを介したコールバックをサポートするためにWSDualHttpBindingを提供します(TCPおよびIPCプロトコルが二重通信をサポートするので、コールバックサポートもNetNamedPipeBindingおよびNetTcpBindingによって存在します)

ここで注意しなければならない1つの非常に重要なことは、二重コールバックは非標準の純粋なMicrosoftの機能であるということです。 私のWebサービスとアプリケーションの両方がMicrosoft ASP.NET上で実行されているので、これは私の現在のタスクに問題を引き起こしていません。

https://rads.stackoverflow.com/amzn/click/com / 0596521308 [WCFサービスのプログラミング]で、WCFをすぐに使い始めることができました。 700ページを超えるため、WCFのすべての概念について深く掘り下げており、コールバックおよびその他の種類の操作に関する専用章があります。

私がネット上で見つけたいくつかの他の良いリソースがあります。

http://social.msdn.microsoft.com/content/en-us/msft/netframework/wcf/screencastsWindows Communication Foundation(WCF)のスクリーンキャスト]

http://www.codeplex.com/servicefactory[Webサービスソフトウェアファクトリー]
http://msdn.microsoft.com/ja-jp/magazine/cc163481.aspx[WCFのサービスファクトリ]


1


これは、Windows Workflow Foundationの完璧な使用例のようです。 各サプライヤから情報を取得するワークフローを簡単に作成し、準備ができたら結果をマージすることができます。 それはずっときれいで、そしてWFはあなたのためにすべての非同期のことをするでしょう。


1


ここで二重通信が必要かどうかはよくわかりません…​ IMOは、コールバックを伴う標準の非同期呼び出しで、データ配信の通知を受け取るのに十分すぎるほどです。

最大の問題は何ですか? 非同期などについて話しているのであれば、通常、データをクライアントに渡すのにかかる時間について話しています。 これはデータ量が多いためですか。 または複雑なサーバーでデータを生成する?

それがデータ量であれば、パフォーマンスを大幅に向上させる方法がいくつか考えられます。それらのほとんどはDTOオブジェクトを使用することです(問題ではないと思われる DataSet`や DataTable`は含まれません)。 たとえば、http://code.google.com/p/protobuf-net/[protobuf-net]を使用すると、データ転送に必要なデータ量と処理量が大幅に削減されます。


0


これを実現する方法の1つは、あなたのWSを*非同期的に*呼び出すことです。

ただし、データの照会に時間がかかりすぎると、タイムアウトの問題が生じる可能性があります。 たとえば、サプライヤのWebサイトの1つが停止しているか非常に遅い場合は、クエリ全体が失敗する可能性があります。 クライアント側のビジネスロジックでWSの代わりにマージを実行した方が良いかもしれません。


0


この解決策があなたの特定のタスクに合うかどうかわからないが、とにかく:

  1. WS APIにページングパラメータを追加します(int pageNumber、int pageSize、out int totalPages)。

  2. 要求の詳細(おそらくハッシュ値)を出力データに関連付ける短期TTLキャッシュを追加します。

アプリケーションが最初のページを要求したら、準備ができたらすぐにそれを返し、収集されたデータやマージされたデータをまとめてキャッシュに入れます。

ただし、最新のデータを取得することはできません。キャッシュのリロード間隔を慎重に設定してください。


0


あなたのシナリオと技術をアーカイブするための絶対的な最善の方法はあなたのWebサービスに対してあなたのWebアプリ/ライブラリの間に何らかの種類のトークンを持つことです。 ただし、結合すると最初の応答からアイテムが削除される可能性があるため、WSから完全なデータを取得する必要があります。

それとも、私はまだWCF Webサービスを使用してスレッドを処理する方がコントローラーからより良いだろうと思います