.net 注册两个远程http对象会在使用默认通道时引发异常

.net 注册两个远程http对象会在使用默认通道时引发异常,.net,remoting,.net,Remoting,我有一个服务器\客户端应用程序,需要通过激活器请求两个不同的远程代理 我遇到了这样一种情况:如果您通过Activator.GetObject请求远程对象而不创建通道,然后创建通道并尝试获取单独的对象,那么第二个对象将失败。让我展示一个示例应用程序来演示该问题: 以下是两个远程对象: namespace HelloRemoteObject { public class FirstObject : MarshalByRefObject { public String

我有一个服务器\客户端应用程序,需要通过激活器请求两个不同的远程代理

我遇到了这样一种情况:如果您通过Activator.GetObject请求远程对象而不创建通道,然后创建通道并尝试获取单独的对象,那么第二个对象将失败。让我展示一个示例应用程序来演示该问题:

以下是两个远程对象:

namespace HelloRemoteObject
{
    public class FirstObject : MarshalByRefObject
    {
        public String FirstObjectMethod()
        {
            return "FirstObjectMethod";
        }
    }

    public class SecondaryObject : MarshalByRefObject
    {
        public String SecondObjectMethod()
        {
            return "Secondary object method return string";
        }
    }
}
以下是服务器,它只是在特定端口上注册http服务器通道,然后等待:

public static int Main(string[] args)
{
    // register the channel
    IDictionary properties = new Hashtable
                                    {
                                        {"timeout", 1000},
                                        {"port", 9099}
                                    };

    var serverChannel = new HttpServerChannel(properties, new BinaryServerFormatterSinkProvider());
    ChannelServices.RegisterChannel(serverChannel, false);

    // register two known types
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(FirstObject), "FirstObjectUri", WellKnownObjectMode.Singleton);
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(SecondaryObject), "SecondaryObjectUri", WellKnownObjectMode.Singleton);

    Console.WriteLine("Hit <enter> to exit...");
    Console.ReadLine();
    return 0;
}
如果在激活之前先注册一个频道,那么一切正常

先让激活器运行,然后再获取第二个对象,就会得到一个异常

如果您不尝试激活两个对象,而只是让激活器获得一个对象,那么这也会起作用。我很好奇为什么会这样

我很好奇,因为假设我不关心通道属性,那么我可以同样轻松地创建一个通道并完成它,但是,如果一个对象需要在通道上使用超时,而另一个对象不需要,那么我需要创建两个单独的通道。那么有没有办法将对象绑定到通道


我也知道远程处理已经走上了wcf的道路,但这不是我现在的选择。

所以我认为这里的解决方案就是始终注册一个频道名。当我注册一个频道名称时,输出看起来像这个频道名称是ChannelServices的输出

如果我在activator运行后注册通道,它看起来已经创建了自己的内部默认通道

Letting Activator.GetObject register an http client channel by default
http client, ChannelName

Unhandled Exception: System.Runtime.Remoting.RemotingException: System.ArgumentNullException: No message was deserialized prior to calling the DispatchChannelSink.
Parameter name: requestMsg
at System.Runtime.Remoting.Channels.DispatchChannelSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.Http.HttpServerTransportSink.ServiceRequest(Object state)
at System.Runtime.Remoting.Channels.SocketHandler.ProcessRequestNow()


Server stack trace:


Exception rethrown at [0]:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at HelloRemoteObject.FirstObject.FirstObjectMethod()
   at HelloClient.HelloClient.Main(String[] args) in 
因此,有两个注册的http通道会让人感到困惑。我本想浏览一下.net源代码,但我是

Registering channel first
ChannelName
FirstObjectMethod
Secondary object method return string
Letting Activator.GetObject register an http client channel by default
http client, ChannelName

Unhandled Exception: System.Runtime.Remoting.RemotingException: System.ArgumentNullException: No message was deserialized prior to calling the DispatchChannelSink.
Parameter name: requestMsg
at System.Runtime.Remoting.Channels.DispatchChannelSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.Http.HttpServerTransportSink.ServiceRequest(Object state)
at System.Runtime.Remoting.Channels.SocketHandler.ProcessRequestNow()


Server stack trace:


Exception rethrown at [0]:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at HelloRemoteObject.FirstObject.FirstObjectMethod()
   at HelloClient.HelloClient.Main(String[] args) in