Ich kann keinen unsicheren Kanal verwenden, nachdem ein sicherer Kanal bereits registriert wurde. Der folgende Code funktioniert nur, wenn auf der Client-Seite der ungesicherte Kanal zuvor registriert wurde.Mischen von sicheren und unsicheren Kanälen
Ist es möglich, sichere und unsichere Kanäle ohne Einschränkung der Registrierungsreihenfolge zu mischen?
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: Keine Änderung mit .NET 4 und VS 2010
Sie sagen, dass es "nicht funktioniert"; Könntest du erklären, was es macht? –
@M.Babcock Ihr Kommentar ist auf eine sehr alte Frage, zu verwenden, wer seit ein paar Monaten nicht mehr war. Nur fyi –
Ich wusste, es war eine ziemlich alte Frage, aber dachte, dass es noch relevant ist, da die Moderatoren es noch nicht deaktiviert haben. Fühlen Sie sich frei, meine Antwort zu löschen, wenn Sie das Gefühl haben, dass es unnötig ist. –