- PR -

自作例外におけるシリアル化

1
投稿者投稿内容
tacsim
会議室デビュー日: 2003/11/05
投稿数: 5
投稿日時: 2003-11-05 09:21
お世話様になります。
.NET Remotingを使ったC/Sシステムの開発をしています。

サーバー側でカラムごとにエラーをセットしたDataSetを
例外と一緒にクライアント側に返そうと思い下記の様な
例外クラスを作成しました。
.NET Framework1.0で開発中は問題なく動作していたのですが、
.NET Framework1.1に変更したところ「サーバーで内部エラー
が見つかりました。詳細情報を取得するには、サーバーの
.configファイルでcustomErrorsをオンにしてください。」
という例外が発生するようになってしまいました。
サーバーアプリとクライアントアプリを同一マシンで動かし
た場合は正常に動作しますのでシリアル化、逆シリアル化
のロジック自体は問題ないような気がします。
個人的にはセキュリティ関係のような気もするんですが、
この場合、どのような方法でこの現象を回避することが
出来るでしょうか?

ちなみに構成ファイルに<customErrors mode="on" />
を追加してみましたが、特に変化はありませんでした。

[Serializable()]
public class myException : Exception, ISerializable
{
  public DataSet myDataSet;

  public myException() : base()
  {
    this.DataSet = null;
  }
  public myException(string message, DataSet dataset) : base(message)
  {
    this.myDataSet = dataset;
  }
  protected myException(SerializationInfo info, StreamingContext context) : base(info, context)
  {
    this.myDataSet = (DataSet)info.GetValue("DataSet", typeof(DataSet));
  }
  public override void GetObjectData(SerializationInfo info, StreamingContext context)
  {
    base.GetObjectData(info, context);
    info.AddValue("DataSet", this.myDataSet);
  }
}


[ メッセージ編集済み 編集者: tacsim 編集日時 2003-11-05 09:27 ]
Hisashi.O
会議室デビュー日: 2003/08/04
投稿数: 7
投稿日時: 2003-11-05 10:15

サーバの内部エラーは、「.NET リモート処理での自動逆シリアル化」に
該当するような気がします。下記のURLの対処を実施してみてください。

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

> ちなみに構成ファイルに
> を追加してみましたが、特に変化はありませんでした。

<customErrors mode="off"/>と設定してください。サーバ側のスタックトレースが
クライアントで見れるようになると思います。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpgenref/html/gnconcustomerrorselement.asp
tacsim
会議室デビュー日: 2003/11/05
投稿数: 5
投稿日時: 2003-11-05 13:38
Hisashi.Oさん、返答ありがとうございます。

「.NETリモート処理での自動逆シリアル化」について
見てみました。
構成ファイルで逆シリアル化レベルの設定をしてみた
のですが、状況は変わりませんでした。

構成ファイルには下記のように変更しました(一部抜粋)。
どこか問題となるところがあるでしょうか?
それともどこか別のところに問題があるのでしょうか?

<channels>
<channel ref="tcp" port="8086" />
 ↓ここから
<serverProviders>
<formatter ref="binary" typeFilterLevel="Low" />
</serverProviders>
 ↑ここを追加
</channel>
</channels>


サーバー側のスタックトレースは取れるようにはなったの
ですが、正直ここからの突っ込んだ調べ方がわかりません。
現在は
try
{
  [リモート呼出]
}
catch( Exception e )
{
  Console.WriteLine(e.StackTrace);
}
==出力==
Exception rethrown at [0];
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at [サーバー側のメソッド名]
at [クライアント側のメソッド名]
======

といった感じで調べているのですが、これだけ見てもいまいち
原因が良くわかりません。
スタックトレースってもう少し効果的な使い方があるんですよね?
よろしかったらそのいろはだけでも教えていただけないでしょうか?
Hisashi.O
会議室デビュー日: 2003/08/04
投稿数: 7
投稿日時: 2003-11-05 14:28
■■■
例外情報からどのような例外がスローされているかを
確認する必要があります。
★Console.WriteLine(e);
Console.WriteLine(e.StackTrace);

■■■
typeFilterLevel="Low"は何も指定しない場合と同じですので、
typeFilterLevel="Full"と指定してください。

#すいません。
#.NETリモート処理での自動逆シリアル化に該当しないような気がしてきました。。。


[ メッセージ編集済み 編集者: Hisashi.O 編集日時 2003-11-05 14:38 ]
1

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