Tenemos un sistema de complemento donde el código del complemento se ejecuta en un dominio de aplicación separado del proceso principal, usando .NET remoto para que los objetos se comuniquen..NET Remoting y HttpContext.Current
Una clase es similar a HttpContext.Current (que también sufre del problema) (editar, la implementación real):
public class MyClass
{
public static MyClass Instance
{
get
{
if(HttpContext.Current != null)
return HttpContext.Current.Items["MyClassInstance"];
}
set
{
if(HttpContext.Current != null)
HttpContext.Current.Items["MyClassInstance"] = value;
}
}
}
Entonces, tenemos un objeto comunicativo que hereda de MarshalByRefObject:
public class CommunicatingClass : MarshalByRefObject, ICommunicatingClass
{
public void DoSomething()
{
MyClass.Instance.DoSomething();
}
}
CommunicatingClass se crea en el dominio de aplicación principal, y funciona bien. Luego, está la clase de complemento, que se crea en su dominio de aplicación, y se le dio una instancia de la CommunicatingClass:
public class PluginClass
{
public void DoSomething(ICommunicatingClass communicatingClass)
{
communicatingClass.DoSomething();
}
}
El problema es que, a pesar de que CommunicatingClass reside en el dominio de aplicación principal (verificado con la ventana Inmediato), todos los datos estáticos como MyClass.Instance y HttpContext.Current han desaparecido y son nulos. Tengo la sensación de que MyClass.Instance se recupera de alguna manera del plugin AppDomain, pero no estoy seguro de cómo resolverlo.
Vi otra pregunta que sugería RemotingServices.Marshal
, pero eso no pareció ayudar, o lo usé incorrectamente. ¿Hay alguna manera de que CommunicatingClass pueda acceder a todos los métodos y propiedades estáticos como cualquier otra clase en el dominio de aplicación principal?
Editar:
El PluginClass se da un ejemplo de esta manera:
public static PluginClass Create()
{
var appDomain = GetNewAppDomain();
var instance = (PluginClass)appDomain.CreateInstanceAndUnwrap(assembly, type);
instance.Communicator = new CommunicatingClass();
return instance;
}
Editar 2:
podría haber encontrado la fuente del problema. MyClass.Instance se almacena en HttpContext.Current.Items (ver edición anterior).
¿Hay alguna forma de que HttpContext.Current pueda acceder al HttpContext correcto? Todavía me pregunto por qué, aunque se está ejecutando en HttpContext.DownDomain de la versión actual, CommunicatingClass.DoSomething, cuando se llama a MyClass.Instance, recupera cosas del dominio de aplicación de PluginClass (si tiene sentido).
En caso de que no lo sabía: Remoting se ha desaprobado en favor de WCF. –
Podría ser útil incluir el código que utiliza para obtener una referencia a communicatingClass en el dominio de la aplicación PluginClass. – JohnOpincar
@ John Saunders, ¿Cómo funciona WCF con la comunicación cross-appdomain? Tiene sentido cuando el cliente y el servidor están separados, pero no parece que sea tan fácil como los proxys remotos transparentes en este caso. Sin embargo, nunca he trabajado con WCF, solo lo miré. – Snea