QA@IT
«質問へ戻る

質問を投稿

処理時間のかかるリモートオブジェクトのメソッドを呼び出すとエラーになるのですが

実行環境

WindowsXP Pro SP1
.NET Framework1.1 SP1

Singleton型リモートオブジェクトを使用しています。
処理に時間がかかるメソッドを実行すると120秒前後のところで
必ず、例外(System.Runtime.Remoting.RemotingException等)が発生してしまいます。

試しにマイクロソフトのサンプル

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconremotingexamplehostinginiis.asp

にThread.Sleepでウエイトを挿入すると同様の現象が発生しました。

念のためにSingleton用のサンプル(一番下に貼っておきます)も作って見ましたが結果は一緒でした。

ウエイトを120秒にすると必ず落ちます。
どんどん時間を減らしていくと105秒では落ちるが104秒だとOKでした。

この現象はIISをリモートオブジェクトのコンテナにした場合のみに発生しています。

フォーマッタをバイナリ、XMLどちらにしてもダメでした。

リース期間、タイムアウトを設定してもダメでした。

デリゲートを使用した非同期呼び出しを行ってもダメでした。

回避方法をご存知の方がいらっしゃいましたら、ぜひご教授おねがいします。

現象再現サンプル



\------------------------ ServiceClass.cs ------------------------
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Threading;
using System.Web;

public class ServiceClass : MarshalByRefObject {
   public string GetServerString(){
      Thread.Sleep(1000 * 120);
      return "Hi";
   }
}

\------------------------ Web.config ------------------------

<configuration>
   <system.runtime.remoting>
      <application>
         <service>
            <wellknown mode="Singleton" type="ServiceClass, ServiceClass" objectUri="ServiceClass.rem"/>
         </service>
         <channels>
            <channel ref="http"/>
         </channels>
      </application>
   </system.runtime.remoting>
</configuration>

\------------------------ Client.cs ------------------------

using System;
using System.Collections;
using System.Diagnostics;
using System.Net;
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Security.Principal;

public class Client {
   public static void Main(string[] Args){
        ServiceClass service = (ServiceClass)Activator.GetObject(typeof(ServiceClass), 
                                "http://localhost/HttpBinary/ServiceClass.rem");
        Console.WriteLine("The server says : " + service.GetServerString());
   }
}


質問者:アッキー

実行環境    
WindowsXP Pro SP1
.NET Framework1.1 SP1

Singleton型リモートオブジェクトを使用しています。
処理に時間がかかるメソッドを実行すると120秒前後のところで
必ず、例外(System.Runtime.Remoting.RemotingException等)が発生してしまいます。

試しにマイクロソフトのサンプル

[http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconremotingexamplehostinginiis.asp](http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconremotingexamplehostinginiis.asp)

にThread.Sleepでウエイトを挿入すると同様の現象が発生しました。

念のためにSingleton用のサンプル(一番下に貼っておきます)も作って見ましたが結果は一緒でした。

    ウエイトを120秒にすると必ず落ちます。
    どんどん時間を減らしていくと105秒では落ちるが104秒だとOKでした。

この現象はIISをリモートオブジェクトのコンテナにした場合のみに発生しています。

フォーマッタをバイナリ、XMLどちらにしてもダメでした。

リース期間、タイムアウトを設定してもダメでした。

デリゲートを使用した非同期呼び出しを行ってもダメでした。

回避方法をご存知の方がいらっしゃいましたら、ぜひご教授おねがいします。


現象再現サンプル


~~~


\------------------------ ServiceClass.cs ------------------------
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Threading;
using System.Web;

public class ServiceClass : MarshalByRefObject {
   public string GetServerString(){
      Thread.Sleep(1000 * 120);
      return "Hi";
   }
}

\------------------------ Web.config ------------------------

<configuration>
   <system.runtime.remoting>
      <application>
         <service>
            <wellknown mode="Singleton" type="ServiceClass, ServiceClass" objectUri="ServiceClass.rem"/>
         </service>
         <channels>
            <channel ref="http"/>
         </channels>
      </application>
   </system.runtime.remoting>
</configuration>

\------------------------ Client.cs ------------------------

using System;
using System.Collections;
using System.Diagnostics;
using System.Net;
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Security.Principal;

public class Client {
   public static void Main(string[] Args){
        ServiceClass service = (ServiceClass)Activator.GetObject(typeof(ServiceClass), 
                                "http://localhost/HttpBinary/ServiceClass.rem");
        Console.WriteLine("The server says : " + service.GetServerString());
   }
}


~~~



質問者:アッキー