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.