2011-02-03 18 views
0

私はWindowsサービスでホストされている単純なWCFサービスを持っています。サービス自体は、完了までに10秒かかる長いトランザクションをシミュレートするだけです。私はまた、私はそれが呼び出されていることを知っているので、私のデータベースにエントリを記録するサービス内のコードを持っています、完了した操作...ここでは、サービス構成の要約は次のとおりです。NetTcpBinding WCF NetTcpBinding +単一インスタンス+単一同時実行性=コールのブロック/ドロップ?

  • SessionMode:可(実際には関係ありません)
  • IsOneWay:真
  • InstanceContextMode:シングル
  • ConcurrencyMode:シングル
  • バインディング

    1. 次に、サービスメソッドを4回連続して呼び出すテストクライアントがあります。ログには、すべてが順番に実行され、以前の呼び出しでサービスが完了したときに複数のコールがキューに入れられ、サービスされることが期待されます。

      しかし、私は唯一の第一のコールがログに記録され、残りは廃棄され見ることができます。各コールの間に15秒の間隔を置くと、すべてのコールが配信され、記録されます。私はあらゆる種類の設定(inactivityTimeout、listenBackLog、...など)を使いこなしましたが、何も助けませんでした。

      私はここで何が欠けていますか?

    答えて

    0
    • InstanceContextMode: singleシングルトンを作成します - つもりが要求をサービスできるサービス・クラスの単一のインスタンスでしかあります。

    • ConcurrencyMode: singleは意味:シングルトンサービスクラスのみが、例えば、一度に単一の要求を処理できることそれは順次これらの2つの設定を使用することにより、着信要求

    を処理します、あなたははい、要求は、順次一つずつ提供されます....自分で素敵なボトルネックを作成しました。だから明らかに、ある時点で、2回目以降のリクエストはタイムアウトなどの何かに実行され、落とされなければなりません。これらのタイムアウトは、通常は1分に設定されているので、10秒のトランザクションは、本当にすべての悲しみ....それは本当にあなたがこれらの呼び出しを行う方法によって異なり

    を起こしてはならない、とあなたはまったくコードを提供しないので、私がすることができます推測のみ。あなたは単一のWCFクライアント側プロキシを使用していますか?それとも、本当に4つの別々のアプリインスタンスがあり、それぞれがリクエストを送信していますか?

    あなたがリクエストを送信し、クライアント側でエラーや障害を取得しています?もしそうなら、どんな種類のエラー?クライアントコードによってセッションが開始されますか?ただ、好奇心のうち

    :これは単なる思考実験である、またはあなたが任意のシステムで、このようなボトルネックを作成したい理由を具体的な理由があります?推奨されるベストプラクティスはInstanceContextMode = PerCallを持つことであり、それはそれらの問題をすべて解決するでしょう、私は確信しています:4つの要求はそれぞれサービスクラスの独自のコピーを取得し、同時に処理する必要があります。

    +0

    はい、私は、単一のWCFクライアント側のプロキシを使用していますし、コードは次のようになります。)(Service1Clientクライアント=新しいService1Clientを。 client.StartProcess(); client.StartProcess(); client.StartProcess(); client.StartProcess();これらの設定ではシングルトンを作成しており、各コールは順次処理されます。私がこれを行う必要がある理由は、サービス内の操作を別の呼び出しで中断することができず、それぞれの要求をキューに入れて1つずつ処理する必要があるためです。また、クライアント側にエラーや障害はまったくありません。 – notlkk

    関連する問題