Client Activated Remoting - das hidden feature
Nachdem ich Google doch eine Zeit lang bemühen musste, um rauszukriegen was das ist:
Was sind Client Activated Remote Objects
Kurz gesagt - das ist für leute die nicht so gern ein Activator.GetObject() aufrufen um an ihr Remote-Object zu kommen.
Beispiel
Kurzes Calculator Sample. Einbetten des Codes kann jeder selbst machen
Server Code
Der Server-Code zu erzeugen des Bereitstellen des Remote-Objects ist ziemlich straight-forward. Einfach den Channel anlegen. Damit auch MarshalByRef - Objekte übergeben werden können.
var configTable = new Hashtable();
configTable["port"] = Configuration.Tcp.Port;
var formatProvider = new BinaryServerFormatterSinkProvider();
// this is needed, otherwise we cannot pass client-objects to the server.
formatProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
var tcpChannel = new TcpChannel(configTable, null, formatProvider);
using (var channelHelper = ChannelHelper.Create(tcpChannel)) {
RemotingConfiguration.ApplicationName = "ClientActivated";
RemotingConfiguration.RegisterActivatedServiceType(typeof(Calculator));
WaitForShutdown(); // this function waits for user input to terminate the server channel
}
Client Code
Die Besonderheit ist hier dass, nach voriger Registrierung eines Types, einfach mit dem New-Operator ein Proxy erzeugt und auf ein serverseitiges RemoteObject verwiesen wird.
var channel = new TcpChannel(0);
ChannelServices.RegisterChannel(channel, false);
var url = string.Format("tcp://{1}:{0}", Configuration.Tcp.Port, Environment.MachineName);
// Here is where the magic happens.
RemotingConfiguration.RegisterActivatedClientType(typeof(Calculator), url);
// the following new is actually Activating a Calculator Object on the server and returns
// a proxy to it.
var calculator = new Calculator();
Console.WriteLine("5 + 3 = {0}", calculator.Add(5, 3));
Console.WriteLine("5 - 3 = {0}", calculator.Substract(5, 3));
ChannelServices.UnregisterChannel(channel);
Was mich sehr erstaunt hat, dass diese art der Proxy-Erzeugung fast nie vorkommt - hab es sozusagen selbst erst vor 2 Wochen in der Realen Welt des produktiven Codes entdeckt.