我有一个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)
这显然不能帮助我识别来自客户端的调用方法。