- PR -

【C#2.0】.netRemoting通信開始時のエラー取得方法について

投稿者投稿内容
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2008-03-05 21:57
いつもお世話になっております、

いまさらな技術かもしれませんが、.netRemotingについて
ご存知の方いらっしゃいましたら教えてください。

.netRemoting通信を行うWindowsサービスを作成したのですが、
下記手順で通信を開始できないことがわかりました。
(下記@を行わなければ、正常に通信できます。)

このような場合には、どのようにすればよいのでしょうか?

【起動手順】
 @Winサービス実装PCのLANケーブルを抜去しておく
 AWinサービスを開始する
  ※特に通信開始エラーや例外は発生しない。
 BWinサービス実装PCのLANケーブルを接続する
 CクライアントからWinサービスへ接続を試みる
  (通信ができない。)

この場合には、どのタイミングでエラーが発生するのでしょうか?
(エラー発生がわからないとアプリ側で再接続処理などを実現できないので
 困っています。)

ご存知の方いらっしゃいましたら、よろしくお願いします。
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-03-06 08:29
確かCでタイムアウトが発生するはずです。

このタイムアウト時間(リトライ回数かな?)がデフォルトでは
かなり長かったはずです。
それを短くして、インスタンスを破棄して最初からすればよかった
はず。。。

あやふやな文章ですいません。(だいぶ前にやったきりなので)
参考になればと思います。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2008-03-06 08:58
早速の回答ありがとうございます。

>確かCでタイムアウトが発生するはずです。

上記のエラーですが、クライアント側では即座に発生します。

サーバ側(Windowsサービス側)でも、ある程度時間が経過すると
エラーが発生するという認識で大丈夫でしょうか?

サーバ側をしばらく放置して動作を監視してみます。

以上、お忙しいとは思いますが、よろしくお願いいたします。
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-03-06 10:19

多分、サーバーではエラーが発生しない?と思います(通信途中はでますが)

----------------

Remotingは分散(スケーラビリティ)にはすぐれていると思いますが、
1を足すメソッドでもエラーが発生する場合がある(Localではあり得ない)
(その他トランザクションの問題もある)

で、クライアントでRemotingエラーをcatchすると全て最初から(インスタンス破棄等)
でいいじゃないですかね(要するにRemotingはクライアント/サーバーは不可分な関係)
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2008-03-06 11:13
いつもお世話になっております。

現在リモーティングサーバ側は、DBのデータを検索するための
インターフェイスとして提供しようと考えています。
(Webサービスのようなことを、ソケット実装で実現したいだけです。)

そのため下記を条件に考えています。

 @常時、サービス提供できる

 ALANケーブル断などの通信エラーが発生しても、
  自動でそのうち復旧しサービス提供を再開できる。

掲題のエラーの件ですと、現状Aは満たせない状況です。
こういうケースは、あきらめるしかないのでしょうか?

以上、お忙しいとは思いますが、よろしくお願いいたします。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2008-03-06 12:51
.NET Remoting ではリモートオブジェクトのプロパティ・メソッドを使用したときに通信が発生します。
その時点で通信障害があったり、リモートオブジェクトの有効期間が切れていたりするとエラーが発生します。

あらかじめログインしておき、そのときにサーバー側にオブジェクトを生成し、
クライアント側でそのオブジェクトに対するリモートオブジェクトを保持しておくような場合、
有効期間を伸ばす、無制限にするなどの細工をしなくてはいけません。
「リース」「延長」などのワードで検索すると事例が見つかるのではないかと思います。

ですが、有効期間が長くなるとサーバー側で保持しているオブジェクトの実体の数も多くなりますので、
不特定多数のユーザーに公開するようなサービスの場合、リソース算定が難しくなります。
検索するたびにリモートオブジェクトを生成するほうがリソース管理上は楽と言えます。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2008-03-06 12:54
ところで、検索結果の戻り値の型には何をお考えでしょうか。
MarshalByRefObject を継承しているか、シリアライズ可能である必要があります。
MarshalByRefObject を継承する型である場合、プロパティ・メソッドを使用するたびに通信が発生し、
おそらくは使用に耐えないレスポンスになります。

おそらくは DataSet だと思いますが、DataSet はシリアライズ可能です。

DataReader の場合、ループするたび、列の値を取得するたびに通信が発生します。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-03-06 13:12
引用:

Makotoさんの書き込み (2008-03-06 11:13) より:
(Webサービスのようなことを、ソケット実装で実現したいだけです。)


これは何ででしょうか?
IIS使ってしまうのが一番簡単確実だと思いますよ。
※HTTP通信にはなりますが。

かなり細粒度でサービスを呼び出すなら向かないかもしれませんが、
そうでもなければHTTPチャネルでも十分だと思いますけどね。

スキルアップ/キャリアアップ(JOB@IT)