- - PR -
【C#2.0】.netRemoting通信開始時のエラー取得方法について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-03-05 21:57
いつもお世話になっております、
いまさらな技術かもしれませんが、.netRemotingについて ご存知の方いらっしゃいましたら教えてください。 .netRemoting通信を行うWindowsサービスを作成したのですが、 下記手順で通信を開始できないことがわかりました。 (下記@を行わなければ、正常に通信できます。) このような場合には、どのようにすればよいのでしょうか? 【起動手順】 @Winサービス実装PCのLANケーブルを抜去しておく AWinサービスを開始する ※特に通信開始エラーや例外は発生しない。 BWinサービス実装PCのLANケーブルを接続する CクライアントからWinサービスへ接続を試みる (通信ができない。) この場合には、どのタイミングでエラーが発生するのでしょうか? (エラー発生がわからないとアプリ側で再接続処理などを実現できないので 困っています。) ご存知の方いらっしゃいましたら、よろしくお願いします。 | ||||
|
投稿日時: 2008-03-06 08:29
確かCでタイムアウトが発生するはずです。
このタイムアウト時間(リトライ回数かな?)がデフォルトでは かなり長かったはずです。 それを短くして、インスタンスを破棄して最初からすればよかった はず。。。 あやふやな文章ですいません。(だいぶ前にやったきりなので) 参考になればと思います。 | ||||
|
投稿日時: 2008-03-06 08:58
早速の回答ありがとうございます。
>確かCでタイムアウトが発生するはずです。 上記のエラーですが、クライアント側では即座に発生します。 サーバ側(Windowsサービス側)でも、ある程度時間が経過すると エラーが発生するという認識で大丈夫でしょうか? サーバ側をしばらく放置して動作を監視してみます。 以上、お忙しいとは思いますが、よろしくお願いいたします。 | ||||
|
投稿日時: 2008-03-06 10:19
多分、サーバーではエラーが発生しない?と思います(通信途中はでますが) ---------------- Remotingは分散(スケーラビリティ)にはすぐれていると思いますが、 1を足すメソッドでもエラーが発生する場合がある(Localではあり得ない) (その他トランザクションの問題もある) で、クライアントでRemotingエラーをcatchすると全て最初から(インスタンス破棄等) でいいじゃないですかね(要するにRemotingはクライアント/サーバーは不可分な関係) | ||||
|
投稿日時: 2008-03-06 11:13
いつもお世話になっております。
現在リモーティングサーバ側は、DBのデータを検索するための インターフェイスとして提供しようと考えています。 (Webサービスのようなことを、ソケット実装で実現したいだけです。) そのため下記を条件に考えています。 @常時、サービス提供できる ALANケーブル断などの通信エラーが発生しても、 自動でそのうち復旧しサービス提供を再開できる。 掲題のエラーの件ですと、現状Aは満たせない状況です。 こういうケースは、あきらめるしかないのでしょうか? 以上、お忙しいとは思いますが、よろしくお願いいたします。 | ||||
|
投稿日時: 2008-03-06 12:51
.NET Remoting ではリモートオブジェクトのプロパティ・メソッドを使用したときに通信が発生します。
その時点で通信障害があったり、リモートオブジェクトの有効期間が切れていたりするとエラーが発生します。 あらかじめログインしておき、そのときにサーバー側にオブジェクトを生成し、 クライアント側でそのオブジェクトに対するリモートオブジェクトを保持しておくような場合、 有効期間を伸ばす、無制限にするなどの細工をしなくてはいけません。 「リース」「延長」などのワードで検索すると事例が見つかるのではないかと思います。 ですが、有効期間が長くなるとサーバー側で保持しているオブジェクトの実体の数も多くなりますので、 不特定多数のユーザーに公開するようなサービスの場合、リソース算定が難しくなります。 検索するたびにリモートオブジェクトを生成するほうがリソース管理上は楽と言えます。 | ||||
|
投稿日時: 2008-03-06 12:54
ところで、検索結果の戻り値の型には何をお考えでしょうか。
MarshalByRefObject を継承しているか、シリアライズ可能である必要があります。 MarshalByRefObject を継承する型である場合、プロパティ・メソッドを使用するたびに通信が発生し、 おそらくは使用に耐えないレスポンスになります。 おそらくは DataSet だと思いますが、DataSet はシリアライズ可能です。 DataReader の場合、ループするたび、列の値を取得するたびに通信が発生します。 | ||||
|
投稿日時: 2008-03-06 13:12
これは何ででしょうか? IIS使ってしまうのが一番簡単確実だと思いますよ。 ※HTTP通信にはなりますが。 かなり細粒度でサービスを呼び出すなら向かないかもしれませんが、 そうでもなければHTTPチャネルでも十分だと思いますけどね。 |