18 votos

La mezcla segura y no segura canales

Yo soy incapaz de usar un canal no seguro una vez que un canal seguro ya ha sido registrado. El siguiente código sólo funciona si en el lado del cliente, la garantía canal es registrado antes.

Es posible mezclar seguros y no seguros de los canales sin ningún tipo de restricción en el orden de registro ?

using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

public class SampleObject : MarshalByRefObject
{
    public DateTime GetTest() { return DateTime.Now; }
}
public class SampleObject2 : MarshalByRefObject
{
    public DateTime GetTest2() { return DateTime.Now; }
}
static class ProgramClient
{
    private static TcpClientChannel RegisterChannel(bool secure, string name, int priority)
    {
        IDictionary properties = new Hashtable();
        properties.Add("secure", secure);
        properties.Add("name", name);
        properties.Add("priority", priority);
        var clientChannel = new TcpClientChannel(properties, null);
        ChannelServices.RegisterChannel(clientChannel, false);
        return clientChannel;
    }
    private static void Secure()
    {
        RegisterChannel(true, "clientSecure", 2);
        var testSecure = (SampleObject2)Activator.GetObject(typeof(SampleObject2), "tcp://127.0.0.1:8081/Secured.rem");
        Console.WriteLine("secure: " + testSecure.GetTest2().ToLongTimeString());
    }
    private static void Unsecure()
    {
        RegisterChannel(false, "clientUnsecure", 1);
        var test = (SampleObject)Activator.GetObject(typeof(SampleObject), "tcp://127.0.0.1:8080/Unsecured.rem");
        Console.WriteLine("unsecure: " + test.GetTest().ToLongTimeString());
    }
    internal static void MainClient()
    {
        Console.Write("Press Enter to start.");
        Console.ReadLine();
        // Works only in this order
        Unsecure();
        Secure();
        Console.WriteLine("Press ENTER to end");
        Console.ReadLine();
    }
}
static class ProgramServer
{
    private static TcpServerChannel RegisterChannel(int port, bool secure, string name)
    {
        IDictionary properties = new Hashtable();
        properties.Add("port", port);
        properties.Add("secure", secure);
        properties.Add("name", name);
        //properties.Add("impersonate", false);
        var serverChannel = new TcpServerChannel(properties, null);
        ChannelServices.RegisterChannel(serverChannel, secure);
        return serverChannel;
    }
    private static void StartUnsecure()
    {
        RegisterChannel(8080, false, "unsecure");
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject), "Unsecured.rem", WellKnownObjectMode.Singleton);
    }
    private static void StartSecure()
    {
        RegisterChannel(8081, true, "secure");
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject2), "Secured.rem", WellKnownObjectMode.Singleton);
    }
    internal static void MainServer()
    {
        StartUnsecure();
        StartSecure();
        Console.WriteLine("Unsecure: 8080\n Secure: 8081");
        Console.WriteLine("Press the enter key to exit...");
        Console.ReadLine();
    }
}
class Program
{
    static void Main(string[] args)
    {
        if (args.Length == 1 && args[0] == "server")
            ProgramServer.MainServer();
        else
            ProgramClient.MainClient();
    }
}

Edit: No hay cambio .NET 4 y VS 2010.

1voto

zmilojko Puntos 1245

Esta es la época interesante pregunta, he pasado una semana tratando de solucionar este problema, y se tenía que implementar una solución. Pero aquí es lo que he descubierto: la respuesta es más probable: NO, NO puedes.

Explicación: .NET remoting no dejar que elija el cliente de canal a utilizar al crear un objeto. En el lado del servidor, se podría utilizar el canal de escucha del puerto en cuestión, obviamente, pero en el lado del cliente que acaba de utilizar cualquier disposición o incluso crear uno nuevo - aunque yo siempre registrar mi propia.

Por lo que parece (yo no podía encontrar en cualquier lugar en la documentación) que si no es un cliente seguro de canales disponibles, que uno se acostumbra. Así, en el ejemplo en la pregunta, el objeto remoto se crea contra el canal seguro, pero espera vacilante - de manera que se produce un error. En el caso de la creación de una conexión insegura primer - esto funciona porque en el momento en que el objeto remoto se crea que no hay seguro de los clientes del canal, por lo que la inseguridad de los canales de cliente se utiliza.

SOLUCIÓN:

  1. Crear un dominio de aplicación para, por ejemplo, de un canal seguro.
  2. En ese dominio de aplicación, cree un objeto de cliente que se conecta al seguro.
  3. Su uso por defecto de dominio de aplicación para todos los canales inseguros.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: