2009-03-17 26 views
3

私は以下の問題があります。基本的に小さなテストでうまく動作するWCFサービスがあります。c#wcf - プロキシクラスopen()を呼び出すと例外が発生します

「通信オブジェクト、System.ServiceModel.Channels.ServiceChannel、できない:私はバッチ/負荷テストを試みる場合しかし、私は、open()メソッドは、プロキシクラスで呼び出されたメッセージでInvalidOperationExceptionを得ますOpened状態になっている間に変更されます。

私はGoogleを検索しましたが、この例外メッセージを実際に引用している他の人は見つかりませんでした。

私は、サービスが公開されている方法の1つを介してデータを受け取った場合、基本的に何らかの処理を実行し、データに関連付けられたサービス(別のデータ異なるルーティングになります)。サービスができるだけ迅速に実行されるように、データの受信、処理、ルーティングの各サイクルは、スレッドプール内の別々のスレッドによって処理されます。これは、あるスレッドがproxyClass.Open()を呼び出している間に別のスレッドが既にそれを使用しているときに発生する問題かもしれませんか?実際にはこれが問題ならば、lockブロックはこの問題を解決しますか?

おかげでみんな、 - あまりに長いのためにこのプロジェクトにworkikng、そして最終的にそれの背中を見たいと思っされてアイブ - これは、最後のつまずきであるように思われるので、任意のヘルプは非常に

:-)感謝します

================================ ===============================

WCFプロキシクラスのためにusing構成を使用すべきではないことを強調してくれてありがとう。複数回)あなたがオープン(と呼ばれてきたようですが、間違いなく聞こえる

try 
{ 
    client = new proxy.DataConnectorServiceClient(); 
    client.Open(); 
    //do work 
    client.Close(); 
} 
.................. //catch more specific exceptions 
catch(Exception e) 
{ 
    client.Abort(); 
} 
+0

スレッド間で同じプロキシオブジェクトを共有していますか? –

+0

はい、私はそうです - ロックブロックについて尋ねられた理由は... –

+0

こんにちは、私は以下のコメントを更新しました。問題 – mamu

答えて

1

:私のようなプロキシを使用する必要があります。しかし、MSDNの記事は、これまでのように1つの簡単な質問文学の最も明確に書かれた作品ではありません同じオブジェクトに

2

どのようにプロキシを使用していますか?呼び出しごとに新しいプロキシオブジェクトを作成する。プロキシの使用方法に関するいくつかのコードを追加してください。

プロキシを使用する望ましい方法は、新しいプロキシを作成して完了したらそれを破棄することです。間違っている開いたプロキシのproxy.open()を呼び出しています。それはちょうど一度呼び出されるべきです。

最後に、wcfは失敗したプロキシを破棄しないので、次のようなものを使用してみてください。それが助けになるかもしれないが、それを撃つ。

if (proxy.State == CommunicationState.Faulted) 
{ 
    proxy.Abort(); 
} 
else 
{ 
    try 
    { 
     proxy.Close(); 
    } 
    catch 
    { 
     proxy.Abort(); 
    } 
} 

なぜこれを行うのですか? http://msdn.microsoft.com/en-us/library/aa355056.aspx

あなたが上に投稿したコードは動作しますが、あなたはいつも例外を食べています。したがって、wcf関連の例外を別のcatchで処理し、Excelionで一般的なcatchを実行してから例外をスローします。

はまた、あなたはまだ、あなたはあなたの代理でDisposeメソッドをオーバーライドして、WCFエラーの場合には中止の方法で処分することができますステートメントを使用しての利便性を使用する場合。

最初の呼び出しで必要なときに開くように.Open()を呼び出す必要はありません。

+0

に関する私の考えを追加しました。私はプロキシクラスを悪用していません。私はopen()とclose()を呼び出し、毎回新しいオブジェクトをインスタンス化します。コードは、古典的なパターン次の使用 (プロキシ=新しいproxy.DataConnectorServiceClientを()){ 試み{proxy.open() //( }最後に{ proxy.close仕事ありません)。 } } 希望するものがあります。 –

+0

実際の代理処理コードを投稿するほうが良いと思います。 "(プロキシ="ではなく、 "使用(varプロキシ="? "プロキシ"はスレッド間で共有されていますか?そうなら、それはあなたの問題です。 –

2

私はあなたが.NET 3.5以降を使用していると仮定しています。 .NET 3.5では、WCF ClientBase'1クラス(生成されたクライアントプロキシの基本クラス)がキャッシュされたChannelFactories/Channelsを使用するように更新されました。その結果、キャッシュを無効にするクライアントの使用/作成方法(Bindingオブジェクトを受け入れるクライアントコンストラクタ、またはバッキングチャネルが作成される前にいくつかの特定のプロパティの1つにアクセスするクライアントコンストラクタ)を使用していない限り、新しいClientインスタンスを使用している場合、同じチャネルを使用している可能性があります。つまり、.Open()を呼び出す前に、常に.Createdステータスを確認していることを確認してください。

0

あなたはいつか前と同じロードブロックに当たった。

usingステートメントの問題は、フォールト状態になると、ブロックの最後に閉じようとします。私たちにとって非常に重要な別の考慮点は、プロキシを毎回作成するコストです。

我々は、これらのブログの記事から多くのことを学びました:

http://blogs.msdn.com/wenlong/archive/2007/10/26/best-practice-always-open-wcf-client-proxy-explicitly-when-it-is-shared.aspx

http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx

をHopefulyそれは同様にあなたを助けます。

乾杯、ワーグナー。

関連する問題