D
dvestal
I'm new to .NET remoting, and I'm having trouble getting a callback to
work from a server. I've been through a dozen webpages and the
references available to me, but I'm still missing something.
I'm trying to have a client pass a callback function to a server, and
the server call it. The callback signature is determined by public
interfaces referenced by both client and server. I've worked through
about three problems on my own, but now I'm stuck.
A supersimplified example of my code is below. What happens is that
the client can subscribe, but when the server attempts to call the
HandleMessage method on the client, the method is never invoked. The
server appears to hang just before invoking the method. What am I
doing wrong?
SHARED LIBRARY
public interface ISubscriber {
void HandleMessage();
}
public interface IMessager {
Subscribe(ISubscriber subscriber);
}
SERVER
public class MessagerImp : IMessager
{
ISubscriber m_subscriber;
public MessagerImp()
{
m_subscriber = null;
BinaryServerFormatterSinkProvider provider
= new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
TcpServerChannel channel = new TcpServerChannel
(
"TCP server channel with a binary formatter",
MessageClient.MessagerPort,
provider
);
ChannelServices.RegisterChannel(channel, true);
RemotingConfiguration.RegisterWellKnownServiceType
(
typeof(MessagerImp),
"tcp://MYMACHINE:1545/Messager.rpc",
WellKnownObjectMode.SingleCall
);
m_worker = new Thread(new ThreadStart(WorkerThreadMethod));
m_worker.Start();
}
public void Subscribe(ISubscriber subscriber) {
m_subscriber = subscriber;
}
public void WorkerThreadMethod()
{
while(true)
{
// This method hangs if it tries to invoke HandleMessage.
if(m_subscriber != null) m_subscriber.HandleMessage();
}
}
}
CLIENT
public class MessagerClient : ISubscriber
{
public MessagerClient()
{
ChannelServices.RegisterChannel(new TcpChannel(0), true);
IMessager rpcSvc = (IMessager)
Activator.GetObject(typeof(IMessager),
"tcp://MYMACHINE:1545/Messager.rpc");
rpcSvc.Subscribe(this);
}
public void HandleMessage()
{
// Method is never invoked.
}
}
work from a server. I've been through a dozen webpages and the
references available to me, but I'm still missing something.
I'm trying to have a client pass a callback function to a server, and
the server call it. The callback signature is determined by public
interfaces referenced by both client and server. I've worked through
about three problems on my own, but now I'm stuck.
A supersimplified example of my code is below. What happens is that
the client can subscribe, but when the server attempts to call the
HandleMessage method on the client, the method is never invoked. The
server appears to hang just before invoking the method. What am I
doing wrong?
SHARED LIBRARY
public interface ISubscriber {
void HandleMessage();
}
public interface IMessager {
Subscribe(ISubscriber subscriber);
}
SERVER
public class MessagerImp : IMessager
{
ISubscriber m_subscriber;
public MessagerImp()
{
m_subscriber = null;
BinaryServerFormatterSinkProvider provider
= new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
TcpServerChannel channel = new TcpServerChannel
(
"TCP server channel with a binary formatter",
MessageClient.MessagerPort,
provider
);
ChannelServices.RegisterChannel(channel, true);
RemotingConfiguration.RegisterWellKnownServiceType
(
typeof(MessagerImp),
"tcp://MYMACHINE:1545/Messager.rpc",
WellKnownObjectMode.SingleCall
);
m_worker = new Thread(new ThreadStart(WorkerThreadMethod));
m_worker.Start();
}
public void Subscribe(ISubscriber subscriber) {
m_subscriber = subscriber;
}
public void WorkerThreadMethod()
{
while(true)
{
// This method hangs if it tries to invoke HandleMessage.
if(m_subscriber != null) m_subscriber.HandleMessage();
}
}
}
CLIENT
public class MessagerClient : ISubscriber
{
public MessagerClient()
{
ChannelServices.RegisterChannel(new TcpChannel(0), true);
IMessager rpcSvc = (IMessager)
Activator.GetObject(typeof(IMessager),
"tcp://MYMACHINE:1545/Messager.rpc");
rpcSvc.Subscribe(this);
}
public void HandleMessage()
{
// Method is never invoked.
}
}