サーバー側のアプリケーションロジックが例外をスローした場合、クライアントにマーシャリングして何が起こったかを知らせることができるはずです。これをテストするには、リモートオブジェクトのメソッドの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
=====
ソースがサーバーにあり、サーバー側のスタックトレースがあることがわかります。