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(ISubs criber subscriber);
}
SERVER
public class MessagerImp : IMessager
{
ISubscriber m_subscriber;
public MessagerImp()
{
m_subscriber = null;
BinaryServerFor matterSinkProvi der provider
= new BinaryServerFor matterSinkProvi der();
provider.TypeFi lterLevel = TypeFilterLevel .Full;
TcpServerChanne l channel = new TcpServerChanne l
(
"TCP server channel with a binary formatter",
MessageClient.M essagerPort,
provider
);
ChannelServices .RegisterChanne l(channel, true);
RemotingConfigu ration.Register WellKnownServic eType
(
typeof(Messager Imp),
"tcp://MYMACHINE:1545/Messager.rpc",
WellKnownObject Mode.SingleCall
);
m_worker = new Thread(new ThreadStart(Wor kerThreadMethod ));
m_worker.Start( );
}
public void Subscribe(ISubs criber subscriber) {
m_subscriber = subscriber;
}
public void WorkerThreadMet hod()
{
while(true)
{
// This method hangs if it tries to invoke HandleMessage.
if(m_subscriber != null) m_subscriber.Ha ndleMessage();
}
}
}
CLIENT
public class MessagerClient : ISubscriber
{
public MessagerClient( )
{
ChannelServices .RegisterChanne l(new TcpChannel(0), true);
IMessager rpcSvc = (IMessager)
Activator.GetOb ject(typeof(IMe ssager),
"tcp://MYMACHINE:1545/Messager.rpc");
rpcSvc.Subscrib e(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(ISubs criber subscriber);
}
SERVER
public class MessagerImp : IMessager
{
ISubscriber m_subscriber;
public MessagerImp()
{
m_subscriber = null;
BinaryServerFor matterSinkProvi der provider
= new BinaryServerFor matterSinkProvi der();
provider.TypeFi lterLevel = TypeFilterLevel .Full;
TcpServerChanne l channel = new TcpServerChanne l
(
"TCP server channel with a binary formatter",
MessageClient.M essagerPort,
provider
);
ChannelServices .RegisterChanne l(channel, true);
RemotingConfigu ration.Register WellKnownServic eType
(
typeof(Messager Imp),
"tcp://MYMACHINE:1545/Messager.rpc",
WellKnownObject Mode.SingleCall
);
m_worker = new Thread(new ThreadStart(Wor kerThreadMethod ));
m_worker.Start( );
}
public void Subscribe(ISubs criber subscriber) {
m_subscriber = subscriber;
}
public void WorkerThreadMet hod()
{
while(true)
{
// This method hangs if it tries to invoke HandleMessage.
if(m_subscriber != null) m_subscriber.Ha ndleMessage();
}
}
}
CLIENT
public class MessagerClient : ISubscriber
{
public MessagerClient( )
{
ChannelServices .RegisterChanne l(new TcpChannel(0), true);
IMessager rpcSvc = (IMessager)
Activator.GetOb ject(typeof(IMe ssager),
"tcp://MYMACHINE:1545/Messager.rpc");
rpcSvc.Subscrib e(this);
}
public void HandleMessage()
{
// Method is never invoked.
}
}
Comment