.NET Remoting и HttpContext. Current

У нас есть система подключаемых модулей, в которой код подключаемого модуля выполняется в отдельном домене приложений от основного процесса, используя удаленное взаимодействие .NET для взаимодействия объектов.

Один класс - это похож на HttpContext.Current (который также страдает от проблемы) (отредактируйте, фактическая реализация):

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;
        }
    }
}

Затем у нас есть объект связи, который наследуется от MarshalByRefObject:

public class CommunicatingClass : MarshalByRefObject, ICommunicatingClass
{
    public void DoSomething()
    {
        MyClass.Instance.DoSomething();
    }
}

Класс CommunicatingClass создается в основном домене приложения и работает Хорошо. Затем есть класс подключаемого модуля, который создается в его AppDomain и получает экземпляр класса CommunicatingClass:

public class PluginClass
{
    public void DoSomething(ICommunicatingClass communicatingClass)
    {
        communicatingClass.DoSomething();
    }
}

Проблема в том, что хотя CommunicatingClass находится в основном домене приложения (проверяется с помощью Immediate Window), все статические данные, такие как MyClass.Instance и HttpContext.Current, исчезли и имеют значение null. У меня есть ощущение, что MyClass.Instance каким-то образом извлекается из подключаемого домена AppDomain, но я не уверен, как это решить.

Я видел другой вопрос, предлагавший RemotingServices.Marshal , но это не похоже help, или я неправильно воспользовался. Есть ли способ, которым CommunicatingClass может получить доступ ко всем статическим методам и свойствам, как и любой другой класс в основном домене приложения?

Изменить:

PluginClass получает экземпляр, подобный этому:

public static PluginClass Create()
{
    var appDomain = GetNewAppDomain();
    var instance = (PluginClass)appDomain.CreateInstanceAndUnwrap(assembly, type);
    instance.Communicator = new CommunicatingClass();
    return instance;
}

Редактировать 2:

Возможно нашли источник проблемы. MyClass.Instance хранится в HttpContext.Current.Items (см. Правку выше).

Есть ли вообще какой-либо способ этого HttpContext. Current может получить доступ к правильному HttpContext? Мне все еще интересно, почему, несмотря на то, что он запущен в AppDomain HttpContext.Current, CommunicatingClass.DoSomething при вызове MyClass.Instance извлекает данные из AppDomain PluginClass (если это имеет смысл).

5
задан Snea 3 February 2011 в 17:50
поделиться