5

これは、.NET リモート処理の例外がスローされたときに関するものです。MSDN を見ると、リモート処理で問題が発生した場合にリモート処理例外がスローされることが記載されています。サーバーが実行されていない場合、問題のないソケット例外が発生します。

私が理解しようとしているのは、リモート処理の例外を取得すると、サーバーが稼働していることを確認できるかどうかです。もしそうなら、それは問題を解決するでしょう。そうでない場合: リモート処理の例外がクライアント側で発生したのかサーバー側で発生したのかを判断する方法はありますか?

アップデート:

私が解決しようとしている問題は、サーバーが最初にダウンし、クライアントがサーバーにメッセージを送信することです。これで、「接続できませんでした...」というソケット例外が発生しましたが、これは問題ありません。

サーバーが使用可能かどうかを確認するために定期的にサーバーにメッセージを送信するスレッドがあります。さて、サーバーが起動し、その時点で、問題のない応答を取得するか、何らかの例外を取得する可能性があり、ほとんどの場合、それはリモート例外になります。だから、私が尋ねようとしているのは、メッセージが届かず、リモート例外が発生した場合、サーバーが稼働していて、まだこの例外が発生している可能性はありますか?

私がしているのは、何もせずに返すリモート オブジェクトのメソッドを呼び出すことだけです。例外がなければ、私は大丈夫です。ここで、リモート例外が発生し、リモート例外がサーバーで発生したことを知っていれば、例外が発生してもサーバーに接続されていることがわかります。

4

6 に答える 6

2

カスタム例外タイプを使用してリモーティング境界線を越えてスローされる場合は、これらのタイプを「[Serializable]」としてマークしてください。正確なエラー メッセージは思い出せませんが、最初に見たときは 1 日の大半を当惑させられました。

また、参考までに、TargetInvocationException には多くの場合、その InnerException プロパティに REAL 例外が埋め込まれています。「呼び出しのターゲットによって例外がスローされました」よりも無駄なことはありません。

于 2008-09-16T16:57:55.330 に答える
1

リモート処理の例外を取得しても、サーバーが稼働していることは保証されません。そのポートで別の何かが実行されてリッスンしている場合、接続は成功し、ソケット例外は発生しません。この場合に何が起こるかは、実際に接続を取得したアプリケーションがどのように動作するかによって異なりますが、おそらくクライアントでリモート例外が生成されることになります。

これを確認するにはもう少し調査が必要ですが、リモート例外はクライアントとサーバー間の通信の問題を示していると思われるため、それを生成した「クライアント側」または「サーバー側」はありません。これは、2 人の会話が楽しくなく、どちらかが原因である可能性があることを意味します。

于 2008-09-16T16:17:40.950 に答える
0

サーバー側のアプリケーションロジックが例外をスローした場合、クライアントにマーシャリングして何が起こったかを知らせることができるはずです。これをテストするには、リモートオブジェクトのメソッドの1つで意図的に例外をスローします。次に、例外を予期してクライアント側からその特定のメソッドを呼び出します。

HttpChannel channel = new HttpChannel();
ChannelServices.RegisterChannel(channel);

IMyRemoteObject obj = (IMyRemoteObject) Activator.GetObject(
    typeof(IMyRemoteObject),
    "http://localhost:1234/MyRemoteObject.soap");
Console.WriteLine("Client.Main(): Reference to rem.obj. acquired");
    int tmp = obj.GetValue();
    Console.WriteLine("Client.Main(): Original server side value: {0}",tmp);
Console.WriteLine("Client.Main(): Will set value to 42");

try
{
    // This method will throw an ApplicationException in the server-side code.
    obj.SetValue(42);
}
catch (Exception ex)
{
    Console.WriteLine("=====");
    Console.WriteLine("Exception type: " + ex.GetType().ToString());
    Console.WriteLine("Message: " + ex.Message);
    Console.WriteLine("Source: " + ex.Source);
    Console.WriteLine("Stack trace: " + ex.StackTrace);
    Console.WriteLine("=====");
}

このように例外が発生することが予想されます

=====
Exception type: System.ApplicationException
Message: testing
Source: Server
Stack trace:
Server stack trace:
   at Server.MyRemoteObject.SetValue(Int32 newval) in i:\projects\remoting.net\ch03\01_singlecallobjects\server\server.cs:line 27
   at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(MethodBase mb, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)

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 General.IMyRemoteObject.SetValue(Int32 newval)
   at Client.Client.Main(String[] args) in i:\projects\remoting.net\ch03\01_singlecallobjects\client\client.cs:line 29
=====

ソースがサーバーにあり、サーバー側のスタックトレースがあることがわかります。

于 2008-09-16T16:44:08.827 に答える
0

そのように設定したので、リモーティングに TCP を使用していると仮定します。HTTP 経由の場合、(TCP ネットワーク ポート) サーバーへの接続に失敗したときに WebException がスローされるためです。指定された TCP ポートでチャネルを登録するアプリケーション プログラムをサーバーが起動していない場合、SocketException が発生します。結局のところ、サーバーはそのポートをリッスン/応答していません。クライアントはどのようにしてソケット接続を確立できますか?

ただし、RemotingException が発生した場合、必ずしもサーバーが適切な Remoting アプリケーションを正常に実行しているとは限りません。ポート 80 (IIS) など、間違ったポートの間違った URI に接続してテストできます。

IMyRemoteObject obj = (IMyRemoteObject) Activator.GetObject(
    typeof(IMyRemoteObject),
    "tcp://localhost:80/MyRemoteObject.rem");

クライアントはポート 80 への TCP 接続を確立できますが、呼び出しに応答するのは IIS であり、Remoting アプリではないため、RemotingException が発生します。IIS はリモート呼び出しを直接処理できません。そうは言っても、RemotingException は、クライアント側の問題を意味することもあります。このブログ記事は、理解を深めるのに役立つかもしれません。

http://www.cookcomputing.com/blog/archives/000308.html

于 2008-09-16T17:09:08.753 に答える
0

正しいメッセージを送信し、サーバーが受信したメッセージも正しいことを確認してください。たとえば、アサーション (Design by Contract と呼ばれます) を使用します。そのような可能性がある場合は、サーバー側とクライアント側を同時にデバッグしてみてください。(同時に 2 つの VS インスタンスを実行する)

于 2008-09-16T16:00:45.093 に答える
0

前回のリモーティング アプリケーションのソース コードにはアクセスできませんでしたが、覚えている限りでは、取得した例外のいずれかが原因でサーバーが稼働しているかどうかを明確に知る方法を見つけることができませんでした。
ネットワークが存在するかどうかを確認し、存在しない場合はユーザーに警告しました (Environment クラスのメソッドだと思います)。

于 2008-09-16T16:13:30.213 に答える