} // Invoke // This is called for all remoted calls on a TP except Ctors // The method called may be Sync, Async or OneWay(special case of Async) // In the Async case we come here for both BeginInvoke & EndInvoke internal virtual IMessage InternalInvoke( IMethodCallMessage reqMcmMsg, bool useDispatchMessage, int callType) { Message reqMsg = reqMcmMsg as Message; if ((reqMsg == null) && (callType != Message.Sync)) { // Only the synchronous call type is supported for messages that // aren't of type Message. throw new RemotingException( Environment.GetResourceString("Remoting_Proxy_InvalidCallType")); } IMessage retMsg = null; Thread currentThread = Thread.CurrentThread; // pick up call context from the thread LogicalCallContext cctx = currentThread.GetLogicalCallContext(); Identity idObj = IdentityObject; ServerIdentity serverID = idObj as ServerIdentity; if ((null != serverID) && idObj.IsFullyDisconnected()) { throw new ArgumentException( String.Format(Environment.GetResourceString("Remoting_ServerObjectNotFound"), reqMcmMsg.Uri)); } // Short-circuit calls to Object::GetType and Object::GetHashCode MethodBase mb = reqMcmMsg.MethodBase; if (_getTypeMethod == mb) { // Time to load the true type of the remote object.... Type t = GetProxiedType(); return(new ReturnMessage(t, null, 0, null /*cctx*/, reqMcmMsg)); } if (_getHashCodeMethod == mb) { int hashCode = idObj.GetHashCode(); return(new ReturnMessage(hashCode, null, 0, null /*cctx*/, reqMcmMsg)); } // check for channel sink if (idObj.ChannelSink == null) { throw new RemotingException( Environment.GetResourceString("Remoting_Proxy_NoChannelSink")); } // Set the identity in the message object IInternalMessage iim = (IInternalMessage)reqMcmMsg; iim.IdentityObject = idObj; if (null != serverID) { Message.DebugOut("Setting serveridentity on message \n"); iim.ServerIdentityObject = serverID; } else { // We need to set the URI only for identities that // are not the server identities. The uri is used to // dispatch methods for objects outside the appdomain. // Inside the appdomain (xcontext case) we dispatch // by getting the server object from the server identity. iim.SetURI(idObj.URI); } Message.DebugOut("InternalInvoke. Dispatching based on class type\n"); AsyncResult ar = null; switch (callType) { case Message.Sync: Message.DebugOut("RemotingProxy.Invoke Call: SyncProcessMsg\n"); BCLDebug.Assert(!useDispatchMessage, "!useDispatchMessage"); bool bSkipContextChain = false; Context currentContext = currentThread.GetCurrentContextInternal(); IMessageSink nextSink = idObj.EnvoyChain; // if we are in the default context, there can be no // client context chain, so we can skip the intermediate // calls if there are no envoy sinks if (currentContext.IsDefaultContext) { if (nextSink is EnvoyTerminatorSink) { bSkipContextChain = true; // jump directly to the channel sink nextSink = idObj.ChannelSink; } } retMsg = CallProcessMessage(nextSink, reqMcmMsg, idObj.ProxySideDynamicSinks, currentThread, currentContext, bSkipContextChain); break; case Message.BeginAsync: case Message.BeginAsync | Message.OneWay: // For async calls we clone the call context from the thread // This is a limited clone (we dont deep copy the user data) cctx = (LogicalCallContext)cctx.Clone(); iim.SetCallContext(cctx); ar = new AsyncResult(reqMsg); InternalInvokeAsync(ar, reqMsg, useDispatchMessage, callType); Message.DebugOut("Propagate out params for BeginAsync\n"); retMsg = new ReturnMessage(ar, null, 0, null /*cctx*/, reqMsg); break; case Message.OneWay: // For async calls we clone the call context from the thread // This is a limited clone (we dont deep copy the user data) cctx = (LogicalCallContext)cctx.Clone(); iim.SetCallContext(cctx); InternalInvokeAsync(null, reqMsg, useDispatchMessage, callType); retMsg = new ReturnMessage(null, null, 0, null /*cctx*/, reqMcmMsg); break; case (Message.EndAsync | Message.OneWay): retMsg = new ReturnMessage(null, null, 0, null /*cctx*/, reqMcmMsg); break; case Message.EndAsync: // For endAsync, we merge back the returned callContext // into the thread's callContext retMsg = RealProxy.EndInvokeHelper(reqMsg, true); break; } return(retMsg); }
internal virtual IMessage InternalInvoke(IMethodCallMessage reqMcmMsg, bool useDispatchMessage, int callType) { Message message1 = reqMcmMsg as Message; if (message1 == null && callType != 0) { throw new RemotingException(Environment.GetResourceString("Remoting_Proxy_InvalidCallType")); } IMessage message2 = (IMessage)null; Thread currentThread = Thread.CurrentThread; LogicalCallContext logicalCallContext = currentThread.GetMutableExecutionContext().LogicalCallContext; Identity identityObject = this.IdentityObject; ServerIdentity serverIdentity = identityObject as ServerIdentity; if (serverIdentity != null && identityObject.IsFullyDisconnected()) { throw new ArgumentException(Environment.GetResourceString("Remoting_ServerObjectNotFound", (object)reqMcmMsg.Uri)); } MethodBase methodBase = reqMcmMsg.MethodBase; if ((MethodBase)RemotingProxy._getTypeMethod == methodBase) { return((IMessage) new ReturnMessage((object)this.GetProxiedType(), (object[])null, 0, logicalCallContext, reqMcmMsg)); } if ((MethodBase)RemotingProxy._getHashCodeMethod == methodBase) { return((IMessage) new ReturnMessage((object)identityObject.GetHashCode(), (object[])null, 0, logicalCallContext, reqMcmMsg)); } if (identityObject.ChannelSink == null) { IMessageSink chnlSink = (IMessageSink)null; IMessageSink envoySink = (IMessageSink)null; if (!identityObject.ObjectRef.IsObjRefLite()) { RemotingServices.CreateEnvoyAndChannelSinks((MarshalByRefObject)null, identityObject.ObjectRef, out chnlSink, out envoySink); } else { RemotingServices.CreateEnvoyAndChannelSinks(identityObject.ObjURI, (object)null, out chnlSink, out envoySink); } RemotingServices.SetEnvoyAndChannelSinks(identityObject, chnlSink, envoySink); if (identityObject.ChannelSink == null) { throw new RemotingException(Environment.GetResourceString("Remoting_Proxy_NoChannelSink")); } } IInternalMessage internalMessage = (IInternalMessage)reqMcmMsg; internalMessage.IdentityObject = identityObject; if (serverIdentity != null) { internalMessage.ServerIdentityObject = serverIdentity; } else { internalMessage.SetURI(identityObject.URI); } switch (callType) { case 0: bool bSkippingContextChain = false; Context currentContextInternal = currentThread.GetCurrentContextInternal(); IMessageSink ms = identityObject.EnvoyChain; if (currentContextInternal.IsDefaultContext && ms is EnvoyTerminatorSink) { bSkippingContextChain = true; ms = identityObject.ChannelSink; } message2 = RemotingProxy.CallProcessMessage(ms, (IMessage)reqMcmMsg, identityObject.ProxySideDynamicSinks, currentThread, currentContextInternal, bSkippingContextChain); break; case 1: case 9: LogicalCallContext callContext1 = (LogicalCallContext)logicalCallContext.Clone(); internalMessage.SetCallContext(callContext1); AsyncResult asyncResult = new AsyncResult(message1); this.InternalInvokeAsync((IMessageSink)asyncResult, message1, useDispatchMessage, callType); message2 = (IMessage) new ReturnMessage((object)asyncResult, (object[])null, 0, (LogicalCallContext)null, (IMethodCallMessage)message1); break; case 2: message2 = RealProxy.EndInvokeHelper(message1, true); break; case 8: LogicalCallContext callContext2 = (LogicalCallContext)logicalCallContext.Clone(); internalMessage.SetCallContext(callContext2); this.InternalInvokeAsync((IMessageSink)null, message1, useDispatchMessage, callType); message2 = (IMessage) new ReturnMessage((object)null, (object[])null, 0, (LogicalCallContext)null, reqMcmMsg); break; case 10: message2 = (IMessage) new ReturnMessage((object)null, (object[])null, 0, (LogicalCallContext)null, reqMcmMsg); break; } return(message2); }
internal virtual IMessage InternalInvoke(IMethodCallMessage reqMcmMsg, bool useDispatchMessage, int callType) { Message m = reqMcmMsg as Message; if ((m == null) && (callType != 0)) { throw new RemotingException(Environment.GetResourceString("Remoting_Proxy_InvalidCallType")); } IMessage message2 = null; Thread currentThread = Thread.CurrentThread; LogicalCallContext logicalCallContext = currentThread.GetLogicalCallContext(); Identity identityObject = this.IdentityObject; ServerIdentity identity2 = identityObject as ServerIdentity; if ((identity2 != null) && identityObject.IsFullyDisconnected()) { throw new ArgumentException(Environment.GetResourceString("Remoting_ServerObjectNotFound", new object[] { reqMcmMsg.Uri })); } MethodBase methodBase = reqMcmMsg.MethodBase; if (_getTypeMethod == methodBase) { return(new ReturnMessage(base.GetProxiedType(), null, 0, logicalCallContext, reqMcmMsg)); } if (_getHashCodeMethod == methodBase) { return(new ReturnMessage(identityObject.GetHashCode(), null, 0, logicalCallContext, reqMcmMsg)); } if (identityObject.ChannelSink == null) { IMessageSink chnlSink = null; IMessageSink envoySink = null; if (!identityObject.ObjectRef.IsObjRefLite()) { RemotingServices.CreateEnvoyAndChannelSinks(null, identityObject.ObjectRef, out chnlSink, out envoySink); } else { RemotingServices.CreateEnvoyAndChannelSinks(identityObject.ObjURI, null, out chnlSink, out envoySink); } RemotingServices.SetEnvoyAndChannelSinks(identityObject, chnlSink, envoySink); if (identityObject.ChannelSink == null) { throw new RemotingException(Environment.GetResourceString("Remoting_Proxy_NoChannelSink")); } } IInternalMessage message3 = (IInternalMessage)reqMcmMsg; message3.IdentityObject = identityObject; if (identity2 != null) { message3.ServerIdentityObject = identity2; } else { message3.SetURI(identityObject.URI); } AsyncResult ar = null; switch (callType) { case 0: { bool bSkippingContextChain = false; Context currentContextInternal = currentThread.GetCurrentContextInternal(); IMessageSink envoyChain = identityObject.EnvoyChain; if (currentContextInternal.IsDefaultContext && (envoyChain is EnvoyTerminatorSink)) { bSkippingContextChain = true; envoyChain = identityObject.ChannelSink; } return(CallProcessMessage(envoyChain, reqMcmMsg, identityObject.ProxySideDynamicSinks, currentThread, currentContextInternal, bSkippingContextChain)); } case 1: case 9: logicalCallContext = (LogicalCallContext)logicalCallContext.Clone(); message3.SetCallContext(logicalCallContext); ar = new AsyncResult(m); this.InternalInvokeAsync(ar, m, useDispatchMessage, callType); return(new ReturnMessage(ar, null, 0, null, m)); case 2: return(RealProxy.EndInvokeHelper(m, true)); case 3: case 4: case 5: case 6: case 7: return(message2); case 8: logicalCallContext = (LogicalCallContext)logicalCallContext.Clone(); message3.SetCallContext(logicalCallContext); this.InternalInvokeAsync(null, m, useDispatchMessage, callType); return(new ReturnMessage(null, null, 0, null, reqMcmMsg)); case 10: return(new ReturnMessage(null, null, 0, null, reqMcmMsg)); } return(message2); }