internal ServerIdentity(MarshalByRefObject obj, Context serverCtx) : base(obj is ContextBoundObject) { if (obj != null) { if (!RemotingServices.IsTransparentProxy(obj)) { this._srvType = obj.GetType(); } else { this._srvType = RemotingServices.GetRealProxy(obj).GetProxiedType(); } } this._srvCtx = serverCtx; this._serverObjectChain = null; this._stackBuilderSink = null; }
// Creates a new server identity. This form is used by RemotingServices.Wrap // internal ServerIdentity(MarshalByRefObject obj, Context serverCtx) : base(obj is ContextBoundObject) { if (null != obj) { if (!RemotingServices.IsTransparentProxy(obj)) { _srvType = obj.GetType(); } else { RealProxy rp = RemotingServices.GetRealProxy(obj); _srvType = rp.GetProxiedType(); } } _srvCtx = serverCtx; _serverObjectChain = null; _stackBuilderSink = null; _refCount = 0; }
public void AttachServerObject(MarshalByRefObject serverObject, Context context) { this.DisposeServerObject(); this._context = context; this._serverObject = serverObject; if (RemotingServices.IsTransparentProxy(serverObject)) { RealProxy realProxy = RemotingServices.GetRealProxy(serverObject); if (realProxy.ObjectIdentity == null) { realProxy.ObjectIdentity = this; } } else { if (this._objectType.IsContextful) { this._envoySink = context.CreateEnvoySink(serverObject); } this._serverObject.ObjectIdentity = this; } }
// // internal void Init(Object o, Identity idObj, Type requestedType) { Message.DebugOut("RemotingServices::FillObjRef: IN"); BCLDebug.Assert(idObj != null, "idObj != null"); // Set the URI of the object to be marshaled uri = idObj.URI; // Figure out the type MarshalByRefObject obj = idObj.TPOrObject; BCLDebug.Assert(null != obj, "Identity not setup correctly"); // Get the type of the object Type serverType = null; if (!RemotingServices.IsTransparentProxy(obj)) { serverType = obj.GetType(); } else { serverType = RemotingServices.GetRealProxy(obj).GetProxiedType(); } Type typeOfObj = (null == requestedType ? serverType : requestedType); // Make sure that the server and requested types are compatible // (except for objects that implement IMessageSink, since we // just hand off the message instead of invoking the proxy) if ((null != requestedType) && !requestedType.IsAssignableFrom(serverType) && (!typeof(IMessageSink).IsAssignableFrom(serverType))) { throw new RemotingException( String.Format( CultureInfo.CurrentCulture, Environment.GetResourceString( "Remoting_InvalidRequestedType"), requestedType.ToString()));; } { RemotingTypeCachedData cache = (RemotingTypeCachedData) InternalRemotingServices.GetReflectionCachedData(typeOfObj); TypeInfo = (IRemotingTypeInfo)cache.TypeInfo; } if (!idObj.IsWellKnown()) { // Create the envoy info EnvoyInfo = System.Runtime.Remoting.EnvoyInfo.CreateEnvoyInfo(idObj as ServerIdentity); // Create the channel info IChannelInfo chan = (IChannelInfo) new ChannelInfo(); // Make sure the channelInfo only has x-appdomain data since the objref is agile while other // channelData might not be and regardless this data is useless for an appdomain proxy if (o is AppDomain) { Object[] channelData = chan.ChannelData; int channelDataLength = channelData.Length; Object[] newChannelData = new Object[channelDataLength]; Array.Copy(channelData, newChannelData, channelDataLength); for (int i = 0; i < channelDataLength; i++) { if (!(newChannelData[i] is CrossAppDomainData)) { newChannelData[i] = null; } } chan.ChannelData = newChannelData; } ChannelInfo = chan; if (serverType.HasProxyAttribute) { SetHasProxyAttribute(); } } else { SetWellKnown(); } // See if we should and can use a url obj ref? if (ShouldUseUrlObjRef()) { if (IsWellKnown()) { // full uri already supplied. SetObjRefLite(); } else { String httpUri = ChannelServices.FindFirstHttpUrlForObject(URI); if (httpUri != null) { URI = httpUri; SetObjRefLite(); } } } } // Init
internal void Init(object o, Identity idObj, RuntimeType requestedType) { this.uri = idObj.URI; MarshalByRefObject tporObject = idObj.TPOrObject; RuntimeType runtimeType; if (!RemotingServices.IsTransparentProxy(tporObject)) { runtimeType = (RuntimeType)tporObject.GetType(); } else { runtimeType = (RuntimeType)RemotingServices.GetRealProxy(tporObject).GetProxiedType(); } RuntimeType runtimeType2 = (null == requestedType) ? runtimeType : requestedType; if (null != requestedType && !requestedType.IsAssignableFrom(runtimeType) && !typeof(IMessageSink).IsAssignableFrom(runtimeType)) { throw new RemotingException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_InvalidRequestedType"), requestedType.ToString())); } if (runtimeType.IsCOMObject) { DynamicTypeInfo dynamicTypeInfo = new DynamicTypeInfo(runtimeType2); this.TypeInfo = dynamicTypeInfo; } else { RemotingTypeCachedData reflectionCachedData = InternalRemotingServices.GetReflectionCachedData(runtimeType2); this.TypeInfo = reflectionCachedData.TypeInfo; } if (!idObj.IsWellKnown()) { this.EnvoyInfo = System.Runtime.Remoting.EnvoyInfo.CreateEnvoyInfo(idObj as ServerIdentity); IChannelInfo channelInfo = new ChannelInfo(); if (o is AppDomain) { object[] channelData = channelInfo.ChannelData; int num = channelData.Length; object[] array = new object[num]; Array.Copy(channelData, array, num); for (int i = 0; i < num; i++) { if (!(array[i] is CrossAppDomainData)) { array[i] = null; } } channelInfo.ChannelData = array; } this.ChannelInfo = channelInfo; if (runtimeType.HasProxyAttribute) { this.SetHasProxyAttribute(); } } else { this.SetWellKnown(); } if (ObjRef.ShouldUseUrlObjRef()) { if (this.IsWellKnown()) { this.SetObjRefLite(); return; } string text = ChannelServices.FindFirstHttpUrlForObject(this.URI); if (text != null) { this.URI = text; this.SetObjRefLite(); } } }
internal IMessageSink GetServerObjectChain(out MarshalByRefObject obj) { obj = null; // NOTE: Lifetime relies on the Identity flags for // SingleCall and Singleton being set by the time this getter // is called. // get // { if (!this.IsSingleCall()) { // This is the common case if (_serverObjectChain == null) { lock (this) { if (_serverObjectChain == null) { MarshalByRefObject srvObj = (MarshalByRefObject) this.TPOrObject; _serverObjectChain = _srvCtx.CreateServerObjectChain( srvObj); } } } BCLDebug.Assert(null != _serverObjectChain, "null != _serverObjectChain"); return(_serverObjectChain); } else { // ---------- SINGLE CALL WKO -------------- // In this case, we are expected to provide // a fresh server object for each dispatch. // Since the server object chain is object // specific, we must create a fresh chain too. // We must be in the correct context for this // to succeed. BCLDebug.Assert(Thread.CurrentContext == _srvCtx, "Bad context mismatch"); // For singleCall we create a fresh object & its chain // on each dispatch! MarshalByRefObject srvObj = (MarshalByRefObject) Activator.CreateInstance((Type)_srvType, true); // make sure that object didn't Marshal itself. // (well known objects should live up to their promise // of exporting themselves through exactly one url) String tempUri = RemotingServices.GetObjectUri(srvObj); if (tempUri != null) { throw new RemotingException( String.Format( Environment.GetResourceString( "Remoting_WellKnown_CtorCantMarshal"), this.URI)); } // Set the identity depending on whether we have the server // or proxy if (!RemotingServices.IsTransparentProxy(srvObj)) { #if _DEBUG Identity idObj = srvObj.__RaceSetServerIdentity(this); #else srvObj.__RaceSetServerIdentity(this); #endif #if _DEBUG BCLDebug.Assert(idObj == this, "Bad ID state!"); BCLDebug.Assert(idObj == MarshalByRefObject.GetIdentity(srvObj), "Bad ID state!"); #endif } else { RealProxy rp = null; rp = RemotingServices.GetRealProxy(srvObj); BCLDebug.Assert(null != rp, "null != rp"); // #if _DEBUG // Identity idObj = (ServerIdentity) rp.SetIdentity(this); // #else rp.IdentityObject = this; // #endif } // This is passed out to the caller so that for single-call // case we can call Dispose when the incoming call is done obj = srvObj; // Create the object chain and return it return(_srvCtx.CreateServerObjectChain(srvObj)); } // } }
internal IMessageSink GetServerObjectChain(out MarshalByRefObject obj) { obj = null; // NOTE: Lifetime relies on the Identity flags for // SingleCall and Singleton being set by the time this getter // is called. if (!this.IsSingleCall()) { // This is the common case if (_serverObjectChain == null) { lock (this) { if (_serverObjectChain == null) { MarshalByRefObject srvObj = (MarshalByRefObject) this.TPOrObject; _serverObjectChain = _srvCtx.CreateServerObjectChain( srvObj); } } } BCLDebug.Assert(null != _serverObjectChain, "null != _serverObjectChain"); return(_serverObjectChain); } else { // ---------- SINGLE CALL WKO -------------- // In this case, we are expected to provide // a fresh server object for each dispatch. // Since the server object chain is object // specific, we must create a fresh chain too. // We must be in the correct context for this // to succeed. // NOTE: It may be useful to recycle the context too // but for V1 we will keep the context we setup for // the first object around and always dispatch the call // through that context ... when we are here we have // already been through the server sink chain. We will // only dispatch through the object sink chain of the // object we will create below ... if for some reason // the object creates its own context we will not go // through the server sink chain for that context again. // We should fix this in V-next and always create everything // from scratch for single-call wellKnown objects BCLDebug.Assert(Thread.CurrentContext == _srvCtx, "Bad context mismatch"); MarshalByRefObject srvObj = null; IMessageSink objChain = null; if (_tpOrObject != null && _firstCallDispatched == 0 && Interlocked.CompareExchange(ref _firstCallDispatched, 1, 0) == 0) { // use the instance of server object created to // set up the pipeline. srvObj = (MarshalByRefObject)_tpOrObject; objChain = _serverObjectChain; if (objChain == null) { objChain = _srvCtx.CreateServerObjectChain(srvObj); } } else { // For singleCall we create a fresh object & its chain // on each dispatch! srvObj = (MarshalByRefObject) Activator.CreateInstance((Type)_srvType, true); // make sure that object didn't Marshal itself. // (well known objects should live up to their promise // of exporting themselves through exactly one url) String tempUri = RemotingServices.GetObjectUri(srvObj); if (tempUri != null) { throw new RemotingException( String.Format( Environment.GetResourceString( "Remoting_WellKnown_CtorCantMarshal"), this.URI)); } // Set the identity depending on whether we have the server // or proxy if (!RemotingServices.IsTransparentProxy(srvObj)) { #if _DEBUG Identity idObj = srvObj.__RaceSetServerIdentity(this); #else srvObj.__RaceSetServerIdentity(this); #endif #if _DEBUG BCLDebug.Assert(idObj == this, "Bad ID state!"); BCLDebug.Assert(idObj == MarshalByRefObject.GetIdentity(srvObj), "Bad ID state!"); #endif } else { RealProxy rp = null; rp = RemotingServices.GetRealProxy(srvObj); BCLDebug.Assert(null != rp, "null != rp"); // #if _DEBUG // Identity idObj = (ServerIdentity) rp.SetIdentity(this); // #else rp.IdentityObject = this; // #endif #if _DEBUG // REVIEW: turn these on after adding a clean way to // reset identity-s on x-context proxies ... (id needs // to be set in the proxy && on the _serverObject in // the proxy) // BCLDebug.Assert(idObj == this, "Bad ID state!" ); // BCLDebug.Assert(idObj == rp.IdentityObject, "Bad ID state!" ); #endif } // Create the object chain and return it objChain = _srvCtx.CreateServerObjectChain(srvObj); } // This is passed out to the caller so that for single-call // case we can call Dispose when the incoming call is done obj = srvObj; return(objChain); } }
internal IMessageSink GetServerObjectChain(out MarshalByRefObject obj) { obj = null; if (!this.IsSingleCall()) { if (this._serverObjectChain == null) { bool flag = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref flag); if (this._serverObjectChain == null) { MarshalByRefObject tporObject = base.TPOrObject; this._serverObjectChain = this._srvCtx.CreateServerObjectChain(tporObject); } } finally { if (flag) { Monitor.Exit(this); } } } return(this._serverObjectChain); } MarshalByRefObject marshalByRefObject; IMessageSink messageSink; if (this._tpOrObject != null && this._firstCallDispatched == 0 && Interlocked.CompareExchange(ref this._firstCallDispatched, 1, 0) == 0) { marshalByRefObject = (MarshalByRefObject)this._tpOrObject; messageSink = this._serverObjectChain; if (messageSink == null) { messageSink = this._srvCtx.CreateServerObjectChain(marshalByRefObject); } } else { marshalByRefObject = (MarshalByRefObject)Activator.CreateInstance(this._srvType, true); string objectUri = RemotingServices.GetObjectUri(marshalByRefObject); if (objectUri != null) { throw new RemotingException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_WellKnown_CtorCantMarshal"), base.URI)); } if (!RemotingServices.IsTransparentProxy(marshalByRefObject)) { marshalByRefObject.__RaceSetServerIdentity(this); } else { RealProxy realProxy = RemotingServices.GetRealProxy(marshalByRefObject); realProxy.IdentityObject = this; } messageSink = this._srvCtx.CreateServerObjectChain(marshalByRefObject); } obj = marshalByRefObject; return(messageSink); }
internal void Init(object o, Identity idObj, RuntimeType requestedType) { this.uri = idObj.URI; MarshalByRefObject tpOrObject = idObj.TPOrObject; RuntimeType runtimeType1 = RemotingServices.IsTransparentProxy((object)tpOrObject) ? (RuntimeType)RemotingServices.GetRealProxy((object)tpOrObject).GetProxiedType() : (RuntimeType)tpOrObject.GetType(); RuntimeType runtimeType2 = (RuntimeType)null == requestedType ? runtimeType1 : requestedType; if ((RuntimeType)null != requestedType && !requestedType.IsAssignableFrom((System.Reflection.TypeInfo)runtimeType1) && !typeof(IMessageSink).IsAssignableFrom((Type)runtimeType1)) { throw new RemotingException(string.Format((IFormatProvider)CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_InvalidRequestedType"), (object)requestedType.ToString())); } this.TypeInfo = !runtimeType1.IsCOMObject ? (IRemotingTypeInfo)InternalRemotingServices.GetReflectionCachedData(runtimeType2).TypeInfo : (IRemotingTypeInfo) new DynamicTypeInfo(runtimeType2); if (!idObj.IsWellKnown()) { this.EnvoyInfo = System.Runtime.Remoting.EnvoyInfo.CreateEnvoyInfo(idObj as ServerIdentity); IChannelInfo channelInfo = (IChannelInfo) new System.Runtime.Remoting.ChannelInfo(); if (o is AppDomain) { object[] channelData = channelInfo.ChannelData; int length1 = channelData.Length; object[] objArray1 = new object[length1]; object[] objArray2 = objArray1; int length2 = length1; Array.Copy((Array)channelData, (Array)objArray2, length2); for (int index = 0; index < length1; ++index) { if (!(objArray1[index] is CrossAppDomainData)) { objArray1[index] = (object)null; } } channelInfo.ChannelData = objArray1; } this.ChannelInfo = channelInfo; if (runtimeType1.HasProxyAttribute) { this.SetHasProxyAttribute(); } } else { this.SetWellKnown(); } if (!ObjRef.ShouldUseUrlObjRef()) { return; } if (this.IsWellKnown()) { this.SetObjRefLite(); } else { string httpUrlForObject = ChannelServices.FindFirstHttpUrlForObject(this.URI); if (httpUrlForObject == null) { return; } this.URI = httpUrlForObject; this.SetObjRefLite(); } }
// // internal void Init(Identity idObj, Type requestedType) { Message.DebugOut("RemotingServices::FillObjRef: IN"); BCLDebug.Assert(idObj != null, "idObj != null"); // Set the URI of the object to be marshaled URI = idObj.URI; // Figure out the type MarshalByRefObject obj = idObj.TPOrObject; BCLDebug.Assert(null != obj, "Identity not setup correctly"); // Get the type of the object Type serverType = null; if (!RemotingServices.IsTransparentProxy(obj)) { serverType = obj.GetType(); } else { serverType = RemotingServices.GetRealProxy(obj).GetProxiedType(); } Type typeOfObj = (null == requestedType ? serverType : requestedType); // Make sure that the server and requested types are compatible // (except for objects that implement IMessageSink, since we // just hand off the message instead of invoking the proxy) if ((null != requestedType) && !requestedType.IsAssignableFrom(serverType) && (!typeof(IMessageSink).IsAssignableFrom(serverType))) { throw new RemotingException( String.Format( Environment.GetResourceString( "Remoting_InvalidRequestedType"), requestedType.ToString()));; } // Create the type info if (serverType.IsCOMObject) { // __ComObjects need dynamic TypeInfo DynamicTypeInfo dt = new DynamicTypeInfo(typeOfObj); TypeInfo = (IRemotingTypeInfo)dt; } else { RemotingTypeCachedData cache = (RemotingTypeCachedData) InternalRemotingServices.GetReflectionCachedData(typeOfObj); TypeInfo = (IRemotingTypeInfo)cache.TypeInfo; } if (!idObj.IsWellKnown()) { // Create the envoy info EnvoyInfo = System.Runtime.Remoting.EnvoyInfo.CreateEnvoyInfo(idObj as ServerIdentity); // Create the channel info ChannelInfo = (IChannelInfo) new ChannelInfo(); if (serverType.HasProxyAttribute) { SetHasProxyAttribute(); } } else { SetWellKnown(); } // See if we should and can use a url obj ref? if (ShouldUseUrlObjRef()) { if (IsWellKnown()) { // full uri already supplied. SetObjRefLite(); } else { String httpUri = ChannelServices.FindFirstHttpUrlForObject(URI); if (httpUri != null) { URI = httpUri; SetObjRefLite(); } } } } // Init
internal void Init(object o, Identity idObj, RuntimeType requestedType) { this.uri = idObj.URI; MarshalByRefObject tPOrObject = idObj.TPOrObject; RuntimeType c = null; if (!RemotingServices.IsTransparentProxy(tPOrObject)) { c = (RuntimeType)tPOrObject.GetType(); } else { c = (RuntimeType)RemotingServices.GetRealProxy(tPOrObject).GetProxiedType(); } RuntimeType typeOfObj = (null == requestedType) ? c : requestedType; if (((null != requestedType) && !requestedType.IsAssignableFrom(c)) && !typeof(IMessageSink).IsAssignableFrom(c)) { throw new RemotingException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_InvalidRequestedType"), new object[] { requestedType.ToString() })); } if (c.IsCOMObject) { DynamicTypeInfo info = new DynamicTypeInfo(typeOfObj); this.TypeInfo = info; } else { RemotingTypeCachedData reflectionCachedData = InternalRemotingServices.GetReflectionCachedData(typeOfObj); this.TypeInfo = reflectionCachedData.TypeInfo; } if (!idObj.IsWellKnown()) { this.EnvoyInfo = System.Runtime.Remoting.EnvoyInfo.CreateEnvoyInfo(idObj as ServerIdentity); IChannelInfo info2 = new System.Runtime.Remoting.ChannelInfo(); if (o is AppDomain) { object[] channelData = info2.ChannelData; int length = channelData.Length; object[] destinationArray = new object[length]; Array.Copy(channelData, destinationArray, length); for (int i = 0; i < length; i++) { if (!(destinationArray[i] is CrossAppDomainData)) { destinationArray[i] = null; } } info2.ChannelData = destinationArray; } this.ChannelInfo = info2; if (c.HasProxyAttribute) { this.SetHasProxyAttribute(); } } else { this.SetWellKnown(); } if (ShouldUseUrlObjRef()) { if (this.IsWellKnown()) { this.SetObjRefLite(); } else { string str = ChannelServices.FindFirstHttpUrlForObject(this.URI); if (str != null) { this.URI = str; this.SetObjRefLite(); } } } }