4

vs2008、vb.net、C#、fw3.5を使用

クライアントでサービスを利用しています

サービスはIISでホストされています

Client(winforms MDI)は、/ l、/ r、/ ct、および/nスイッチを使用してsvcutilを使用して生成されます

サービスとクライアントの両方がMyEntities.dllを使用します

TransportWithMessageCredentialでnettcpを使用していますプロキシをメインフォームにキャッシュします

if  Membership.ValidateUser(UsernameTextBox.Text, PasswordTextBox.Text)
    _proxy = new MyServiceClient
    _proxy.ClientCredentials.UserName.UserName = "username"
    _proxy.ClientCredentials.UserName.Password = "password"

次に、_proxyを使用する必要のある子フォーム/プラグインに_proxyを渡します。

List(of Orders) =  _proxy.ChannelFactory.CreateChannel.GetOrders(customer)

すべてがうまく機能していますが、私の質問はこれです:

通話後、チャンネルはどうなりますか?彼らは魔法のように処分されていますか?

プロファイラーを使用してこれを監視するにはどうすればよいですか?

1つの場所でエラー処理を行う方法はありますか、または「ブロックの問題を使用する」WCFクライアントの最善の回避策は何ですか?のようにすべての呼び出しでtry / catchを配置する必要がありますか?

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}

_proxy.InnerChannel.Faultedをサブスクライブして、そこでクリーンアップできますか?

よろしく

_エリック

4

2 に答える 2

2

ユースケースに応じて、私は2つの異なることを行うために使用します。

  • チャネルのインスタンスが一度に1つしか使用されていないことがわかっているクライアントのシナリオでは、チャネルを怠惰に作成し、作成されたインスタンスを再利用します。障害が発生したり、閉じられたり、廃棄されたりした場合は、チャネルが再作成されます。
  • 複数のチャンネルを同時にリクエストできるシナリオでは、例外処理ダンスを行うのが最善だと思います。コードの膨張を回避するために、実行した実際の作業のデリゲートを受け入れるメソッドに一元化して、ペイロードコードの周囲に1回限りの外骨格を形成することができます。
于 2010-02-05T12:52:48.473 に答える
1

追加のテスト結果/メモ

私は自分の質問に部分的に答えたようです、私はこれを500Xのループで実行しました

 List(of Orders) =  _proxy.ChannelFactory.CreateChannel.GetOrders(customer)

これは非常に悪いことであり、11回目の反復の開始時に、私のサービスの最大ユーザーであるタイムアウトエラーが発生しました(10)。これは、誰かが任意のwcfクライアントを実装し、wcfサーバーが許可する数のチャネルを開くことができることを意味しますか?

これで期待どおりの結果が得られ、500回の反復がすべて完了したことがわかりました。

  Dim channel = _proxy.ChannelFactory.CreateChannel
     e.result = Channel.GetOrders(customer)
     Dim Ich = DirectCast(channel, ServiceModel.IClientChannel)
     Ich.Close()
     Ich.Dispose()

私の質問は、_proxy.InnerChannel.Faultedイベント内でキャストして閉じて破棄することはできますか、それともすべての呼び出しに対して、試行でラップしてから、タイムアウト/通信/障害の例外をキャッチして、プロキシをそのままにしてチャネルを破棄することができますか?後者の場合、これをカプセル化する方法はありますか?

よろしく

_エリック

于 2010-02-02T21:21:16.897 に答える