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