.NET Remoting and HttpContext.Current

We have a plug-in system in which the plug-in code runs on a separate AppDomain from the main process, using remote .NET for objects to communicate.

One class is similar to HttpContext.Current (which also suffers from a problem) (editing, actual implementation):

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

Then we have a communication object that inherits from MarshalByRefObject:

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

CommunicatingClass is created on the main AppDomain and works fine. Then there is a plugin class that is created on its AppDomain, and a CommunicatingClass instance is set:

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

, , CommunicatingClass appdomain ( Immediate), , MyClass.Instance HttpContext.Current, null. , MyClass.Instance - AppDomain, , .

, RemotingServices.Marshal, , , , . , CommunicatingClass , AppDomain?

Edit:

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? , , HttpContext.Current AppDomain, CommunicatingClass.DoSomething, MyClass.Instance AppDomain PluginClass ( ).

+5
2

, , , Reflector.

, HttpContext.Current null .

HttpContext.Current . , CallContext.HostContext. CallContext.

CallContext, , ILogicalThreadAffinitive.

  • , LogicalCallContext.
  • , IllogicalCallContext.

HttpContext a ILogicalThreadAffinitive, IllogicalCallContext.


.

, , , .

AppDomain , .

-, ExecutionContext (, HttpContext.Current), ExecutionContext.Capture ( ).

ExecutionContext, Capture, ExecutionContext.Run, :

Delegate myRemoteCall; //Assigned somewhere else in remoting
ExecutionContext.Run(ExecutionContext.Capture(), x => { myRemoteCall() }, null);

, , .

, HttpContext.Current ExecutionContext.Capture().

a IllogicalCallContext a LogicalCallContext.

Capture ExecutionContext, (, LogicalCallContext) . IllogicalCallContext.

, HttpContext ILogicalThreadAffinative, ExecutionContext.Capture.


?

HttpContext MarshalByRefObject [Serializable] (, ), AppDomain.

, ExecutionContext .

, AppDomain MarshalByRefObject, AppDomain, HttpContext.Current.

( ) :

private HttpContext _context;
private void SyncContext()
{
    if(HttpContext.Current == null)
        HttpContext.Current = _context;
}

. HttpContext.Current IllogicalCallContext ExecutionContext, , ASP.NET , , ExecutionContext.

( , )

+9

, MyClass MarshalByRefObject.

+1

All Articles