- PR -

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

投稿者投稿内容
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2008-03-06 13:13
> Winサービス実装PCのLANケーブルを抜去しておく

読み返してみたら、サーバー側のケーブルを抜くということですね。

クライアントからの要求のたびに、
ポートの状態が異常であれば復旧するというのは難しいかもしれません。
正しくポート制御が行われていなければサーバー側まで到達しないでしょうから、
サーバー側でエラーを検知して・・・というのも難しいと思います。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2008-03-06 14:52
回答ありがとうございます。

To:masaさん

>MarshalByRefObject を継承する型である場合、
>プロパティ・メソッドを使用するたびに通信が発生し、
>おそらくは使用に耐えないレスポンスになります。

これって、それほどですか?
(今回は、MarshalByRefObjectでSingleCallを使用しています)

LAN内なので不特定多数といっても同時接続は5〜10名程度と考えています。
まだロードテストは実施していないのですが、今夜からやってみます。

また何か事前に気をつけておいたほうがよさそうなことなどありますでしょうか?

>サーバー側でエラーを検知して・・・というのも難しいと思います。

こちらは、やはり無理ですか。
サーバとしてはListeningになっているので、無理かなとは思っていましたが...
(でも、LANケーブルを再接続しても復旧しない理由がわからないんですよね...)

To:なちゃさん

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

理由は下記2つです。

@既存のDBサーバなので、Webサーバを立てることができない

A [ブラウザ]→[IIS→Webアプリ→Webサービス]→[.netRemoting→DBMS]
 のような分散構成にしたかった。(※[]の枠が、PCを示します。)

Web系アプリからの受け口は、Webサービスで、
Winアプリからは、.netRemotingかWebサービスのどちらを使用するか
選べるようにしたかった。
というのが理由です。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2008-03-06 15:30
引用:


LAN内なので不特定多数といっても同時接続は5〜10名程度と考えています。
まだロードテストは実施していないのですが、今夜からやってみます。




LANだとそれほど気にはならないかもしれませんね。

「コネクション」に相当するものは MarshalByRefObject となると思いますが、
その「コネクション」に値取得メソッドを定義して、
その戻り値を DataSet などのシリアライズ可能な型にするとよいのではないかと思います。
取得した後のデータはローカルオブジェクトですからオーバーヘッドはありません。
細かく何度もアクセスするくらいならまとめて取得したほうがよいという考え方です。


引用:


>サーバー側でエラーを検知して・・・というのも難しいと思います。

(でも、LANケーブルを再接続しても復旧しない理由がわからないんですよね...)




最初にクライアントから要求があったときに全てを処理するのではなくて、
サービスの登録時にも「何か」をするからじゃないでしょうか。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2008-03-06 16:23

アドバイスありがとうございます。
上記のアドバイス、開発に役立てさせて頂きます。

>最初にクライアントから要求があったときに全てを処理するのではなくて、
>サービスの登録時にも「何か」をするからじゃないでしょうか。

アプリのソース的には、下記のようにremoting登録しているだけ
ですので問題ないと思うのですが...

〜〜〜〜〜〜〜〜〜〜〜

BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;

Hashtable channelConfig = new Hashtable();
channelConfig.Add("port", 1024);
channelConfig.Add("name", "");
channelConfig.Add("secure", false);

TcpServerChannel channel = new TcpServerChannel(channelConfig, provider);

ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(
        typeof(MyClass),
        "MyServiceName",
        WellKnownObjectMode.SingleCall);

Object sync = new Object();
lock (sync)
{
  Monitor.Wait(sync);
}

※MyClassは、自分の公開クラスです。

〜〜〜〜〜〜〜〜〜〜〜

今回は、いろいろ勉強になりました。
夜間試験などして、また不明点が発生した場合には質問させていただきたいと思います。

その際は、よろしくお願い致します。
ありがとうございました。

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