4

次のシナリオ (Visual Studio 2010、WCF) の開発を開始しています。ネットワーク内のさまざまなクライアントが、私が独自に開発した Web サービスを呼び出します。これは、Windows サービスの一部としてホストされているため、自己ホスト型の WCF について話しています。 Windows サービス内の Web サービス。

その自己ホストされた WCF Web サービスは、外部 Web サービスを呼び出すため、一種のファサードのように機能します。

明らかに、私の自己ホスト型 WCF Web サービスは同時呼び出しを受け入れる必要があります。ここで私の質問があります。私が計画しているのは、自己ホスト型 WCF Web サービスのさまざまなクライアントから呼び出される操作です。単純にクライアントを作成します。外部 Web サービスを呼び出し、外部 Web サービスを呼び出し、外部 Web サービスから同期応答を取得してから、呼び出し元のクライアントに応答します。

簡単に聞こえますが、サービス ホストに入る複数のスレッドについて考慮する必要があることはありますか? 明らかに、ホスト自体の「グローバル」変数には注意する必要がありますが、呼び出された Web サービスのさまざまな操作で外部 Web サービス クライアントを作成するだけで済む場合、または何かを見落としている場合は、保存する必要があります。

皆さんありがとう!

乾杯、ステボ

4

1 に答える 1

10

ここでは、特に WCF のインスタンス化とコンカレンシーに関連する選択肢がいくつかあります。

インスタンス化: ここでの選択肢は

  • PerCall : クライアント要求ごとに新しい InstanceContext (およびサービス オブジェクト) が作成されます。
  • PerSession : 新しいクライアント セッションごとに新しい InstanceContext (およびサービス オブジェクト) が作成され、そのセッションの存続期間中維持されます (これには、セッションをサポートするバインディングが必要です)。
  • Single : 単一の InstanceContext (およびサービス オブジェクト) が、アプリケーションの存続期間中のすべてのクライアント要求を処理します。

同時実行:

  • Single : 各インスタンス コンテキストは、一度にインスタンス コンテキストでメッセージを処理する最大 1 つのスレッドを持つことができます。同じインスタンス コンテキストを使用したい他のスレッドは、元のスレッドがインスタンス コンテキストを終了するまでブロックする必要があります。
  • Multiple : 各サービス インスタンスは、メッセージを同時に処理する複数のスレッドを持つことができます。この同時実行モードを使用するには、サービスの実装がスレッドセーフである必要があります。
  • Reentrant : 各サービス インスタンスは一度に 1 つのメッセージを処理しますが、再入可能な操作呼び出しを受け入れます。サービスは、WCF クライアント オブジェクトを介して呼び出す場合にのみ、これらの呼び出しを受け入れます。

最初にインスタンス化を見てみましょう:

呼び出しごと: 基本的に、2 つのクライアントがサービスを呼び出した場合、サービスの 2 つの異なるインスタンスが作成され、呼び出しが完了すると破棄されます。

Per Session : これら 2 つのクライアントがプロキシ経由でそれぞれ 2 つの呼び出しを行う場合、これらの呼び出しの両方に対してホストで作成される wcf インスタンスは同じになります (各プロキシに対して、2 つのインスタンスがそれぞれ 2 つを提供しますが、各呼び出し元は同じインスタンスに移動します)。 、その後破棄

Single : 両方のプロキシ/クライアントが同じインスタンスを使用するため、呼び出し元 1 が操作を呼び出し、次に呼び出し元 2 が呼び出しを行い、この同じインスタンスが再利用されます。

かなり簡単です。

並行性に関する限り、上記のインスタンス コンテキストで一度にアクティブなスレッドの数です。ここで、「複数のスレッドを安全に使用するコードを理解して開発することは、書くのが難しい場合がある」と述べている経験と MSDN を支持します (ただし、不可能ではありません) 。

したがって、要件に基づいて、状態を維持したくないようであり、スケーラビリティが懸念される可能性があります。これは、複数のプロキシ呼び出しにサービスを提供しており、シングル インスタンス モードを必要とするあらゆる種類のグローバル データを共有する必要がないためです。考えられる解決策は次のとおりです。

[ServiceBehavior
(ConcurrencyMode.Single,
 InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService: IYourService
{
}
于 2012-09-05T19:57:40.587 に答える