0

WCFサービスAPIのラッパーがあります

Class APIWrapper
{
   private WCFClient _client;
   //constructor opens a client connection
   public APIWrapper()
   {
      _client = new WCFClient();
      _client.open();
   }

   public API1()
   {
       _client.doSomething1();
   }

   public API2()
   {
       _client.doSomething2();
   }

}

聞きたい:

Q1タイムアウト例外は発生しますか?このラッパークラスインスタンスが長すぎる場合はどうなりますか?(WCF接続はデフォルトでキープアライブですか?configでその属性を設定しません)たとえば、ラッパークラスが構築された後、そのAPI1またはAPI2は10分後に呼び出されます。これは、このWCF接続のタイムアウト値よりも長くなります。

Q2接続を明示的に閉じる必要がありますか?そうであれば、以下のようにラッパークラスのデストラクタで接続を閉じる必要がありますか?

~APIWrapper
{
    if(_client !=null)
    try{
         _client.close();  }
    catch(Exception e){
         _client.Abort();   }
}
4

2 に答える 2

4

なぜそうしたいのかわかりませんが、WCFがIIS7でホストされている場合、WCFは接続の有無にかかわらず起動し、接続を維持する意味がありません。

私の経験では、これらの種類のサービスは、ステートレスの場合に最適に機能します(本当に正当な理由がない限り)。毎回接続を開いたり閉じたりすることを強くお勧めします。パフォーマンスのためにこれを行う場合は、毎回閉じたり開いたりしないようにする別の方法があります。

Q1:MSDNによると、openTimeoutは1分です

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding.opentimeout.aspx

Q2:接続を明示的に閉じる必要はありませんが、それは良い習慣であり、そうすることを強くお勧めします。接続を閉じないと、WCFにオーバーヘッドが発生する可能性があります。

于 2012-11-08T07:19:30.223 に答える
1

私が知っているように、WCFは接続を維持しません。事前定義された時間が経過した後(inactivityTimeout = "00:10:00")、サービスで_client.doSomething1()またはその他のメソッドを呼び出そうとすると、接続は例外をスローします。

WCF非アクティブタイムアウト

接続を維持するには、事前定義された間隔で、たとえば1分ごとに単純なメソッドを呼び出す必要があります。

ただし、本当に必要になるまで、ステートレスでwcfサービスを使用する必要があるという点でJordiに同意します。

于 2012-11-08T07:48:52.500 に答える