2011-12-19 17 views
0

私はちょうどthisチュートリアルに続き、コードを少し演奏しました。私は、どこかでチャンネルのタイムアウトがあると読んでいるので、最終的には自動的に閉じられるかもしれません。だから私は呼び出したいメソッドごとにクライアントで新しいチャンネルを開こうとしましたが、最終的に(呼び出しが多かったので)エラーが出ました。ChannelFactory <TChannel> .CreateChannelとは何が反対ですか?

同時に開くことができるチャンネルの数に制限があるようです。しかし、チャンネルはカスタムオブジェクトのインスタンスなので、私はそれを閉じるか、それを削除するか、それを取り除くために何をする必要があるかわからないので、他のチャンネルを作成することができます。

それから私は私のTChannelIChannel(私はしません上記のリンクどのチュートリアル)を実装する必要がありCreateChanneldocumentationに気づきました。では、私は自分のチャンネルをどのように閉鎖するのですか?もしそうなら、どのように閉じるか、Closeメソッドの実装で何をすべきですか?そして、私はインターフェイスを実装する必要がある場合、私は他のすべてのメソッドの実装で何をすべきですか?

または、それが持続する間だけ1つのチャンネルを使用する必要がありますか?とにかく、自分が持っているものが自分のクラスのインスタンスであれば、フォールトかオープンかクローズかを知るはずです。

私がかなり迷っているので、正しい方向に向けることを願っています。

答えて

5

ChannelFactory<TChannel>.CreateChannelは、指定したサービスタイプのチャネルを作成して返します。返されたオブジェクトはすでにIChannelを実装しています。あなたは(通常?)独自のCloseメソッドやその他の方法を実装する必要はありません。IChannel

通常、すべての通話に新しいチャネルを作成するのではなく、再使用するだけです。 (特定の場合のみ、すべての通話に対して新しいチャネルを作成する方が良い場合があります)。

チャンネルを閉じるには、IClientChannelにキャストしてください。このパターンを使用します。

try 
{ 
    ((IClientChannel)channel).Close(); 
} 
catch (Exception ex) 
{ 
    ((IClientChannel)channel).Abort(); 
} 

あなたは、チャネル(すなわちCreatedOpenedFaultedClosed)の状態を取得するために((IClientChannel)channel).Stateを使用することができます。

+0

ありがとう私は今アフリカだから後で試してみましょう。とにかく、どうやってこのようなことを知ることができますか?ドキュメントに関する多くの情報が見つかりません。私は少しでも私が思うように求める必要はありません。これは書籍でしか見つからない情報ですか? – Juan

+0

私は、CodeProject.com、MSDN、dotnetconsult.co.ukのような検索を通じて、時間の経過とともに見つかったいくつかの情報源を使用します。そしてもちろん、すべての最大のソース...StackOverflow;) – Peladao

+0

これはうまくいくでしょう。私はdotnetconsult 1をチェックアウトします。 – Juan

1

ペラダオは基本的に頭の爪に当たっています。

CreateChannelは、自分のカスタムサービスインターフェイス IClientChannelの両方を実装する(プロキシ)オブジェクトを作成します。

通常、チャネルを開いたままにして、その呼び出しを再利用します。また、フォールト状態になっても回復しない場合は、新しいチャネルを開く必要があることに注意してください。 Peladaoは、(IClientChannel).Stateを介して障害状態を検出できると述べています。また、一般的に例外も発生することを忘れないでください。

メモリが使用されている場合、WCFのデバッグプロセスでは、サービスに対して同時に10個のチャネルが受け入れられます。

関連する問題