MarshalByReferenceObject
そのメソッドは .net リモート処理を介して呼び出されます。
public class MyServer : MarshalByReferenceObject
{
public void DoSomething();
}
System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType(
typeof(MyServer), "serverUrl", System.Runtime.Remoting.WellKnownObjectMode.SingleCall);
クライアントは次のようにサーバーを呼び出しています。
var server = Activator.GetObject(typeof(MyServer), "serverUrl");
server.DoSomething();
デバッグの目的で、クライアントが DoSomething() メソッドを呼び出したときに、実際の呼び出し元が誰であるかをログに記録したいと思います。
server.DoSomething() 関数内から呼び出し元のメソッドを特定するにはどうすればよいですか? または、Activator.GetObject によって呼び出されるサーバー コンストラクター内からですか?
理想的には、どのクライアント メソッドがサーバーを呼び出したか、どの親メソッドがそのクライアント メソッドを呼び出したかなど、スタック トレース全体が必要です。しかし、私はある種の発信者識別に落ち着くでしょう。クライアントは私が管理しているので、どうにかして名前を付けることができますか? インターフェイスの仕様はすでにかなり決まっているので、そうでなければ余分なstring callerId
パラメーターをすべてのメソッドに追加することは避けたいと思います。
もちろん、ローカル スタック トレースはSystem.Runtime.Remoting
メソッドのみを識別し、実際のリモート呼び出し元は識別しません。
サーバー側のスタックトレースの例:
at MyServer.MyServer(), line 123
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
[...]
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
これは明らかに、クライアントからの呼び出しメソッドを識別するのに役立ちません。