Laden...

Remoting und Events

Erstellt von C# Fritze vor 13 Jahren Letzter Beitrag vor 13 Jahren 6.878 Views
C
C# Fritze Themenstarter:in
25 Beiträge seit 2010
vor 13 Jahren
Remoting und Events

Hallo Leute,

ich probiere seit zwei Tagen einem Remoting objekt einen Eventlistener anzuhängen. Klingt ganz unspektakulär macht mir aber diverse Probleme.

Die erste Instanz spielt den Server jeder weitere ist ein Client. Ich würde gerne beim Server dem Objekt einen Eventlistener anhängen um das Event weiter auszuwerten.

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
using System.Threading;

namespace KillMe123 {
    class Program {
        static void Main(string[] args) {
            Mutex mutex;
            bool first = false;
            try {
                mutex = Mutex.OpenExisting("Local\\BeispielMutex");
            } catch(WaitHandleCannotBeOpenedException) {
                mutex = new Mutex(false, "Local\\BeispielMutex");
                first = true;
            }
            if(first) {
                Console.WriteLine("Ich bin Server!");
                IpcChannel ipc = new IpcChannel("BeispielPipe");
                ChannelServices.RegisterChannel(ipc, false);

                RemotingConfiguration.RegisterWellKnownServiceType(
                    typeof(Dummy),
                    "BspObj",
                    WellKnownObjectMode.Singleton);

                Dummy d = (Dummy)RemotingServices.Connect(typeof(Dummy), "ipc://BeispielPipe/BspObj");
                
                Console.WriteLine(ah.init);
                d.attach(null);
                //d.attach(new EventHandler(logging));
                d.log("server");
                Console.ReadKey();
            } else {
                Console.WriteLine("Ich bin Client!");
                IpcChannel ipc = new IpcChannel();

                Dummy d= (Dummy)RemotingServices.Connect(typeof(Dummy), "ipc://BeispielPipe/BspObj");
                d.log("Client " + DateTime.Now.ToString("H:mm:ss"));
            }
        }
    }
}

Und noch meine Dummy Klasse:

using System;

namespace KillMe123 {
    class Dummy : MarshalByRefObject {
        public event EventHandler logging;

        public DateTime init;
        public string info;
        public Dummy() {
            init = DateTime.Now;
            info = "";
        }

        public void log(string str) {
            info += str + "; ";
            Console.WriteLine("Instanz von {0}: {1}", init.ToString("H:mm:ss"), str);
            if(logging != null)
                logging(this, new EventArgs());
        }

        public void attach(EventHandler e) {
            Console.WriteLine("Try to Attach...");
            logging += e;
        }
    }
}

Kurz noch zu erklärung das init benutze ich nur um zu testen ob ich immer die selbe instanz habe. Hatte damit vorher auch so meine Problemchen.

Wenn ich die auskommentierte Zeile reinhole kracht es immer mit einer System.Security.SecurityException.

Der Typ System.DelegateSerializationHolder und die davon abgeleiteten Typen (z.B. System.DelegateSerializationHolder) dürfen in dieser Sicherheitsebene nicht deserialisiert werden.

Kann mir jemand verraten was ich falsch mache?

Edit: Tippfehler korrigiert und Exception reineditiert.

Gelöschter Account
vor 13 Jahren

zu remoting und events gibt es auf codeproject ein schönes tutorial.

Wenn ich die auskommentierte Zeile reinhole kracht es immer zur Laufzeit.

bei sowas immer die fehlermeldung posten.

C
C# Fritze Themenstarter:in
25 Beiträge seit 2010
vor 13 Jahren

Verzeihung habe das glatt vergessen:

System.Security.SecurityException wurde nicht behandelt.
Der Typ System.DelegateSerializationHolder und die davon abgeleiteten Typen (z.B. System.DelegateSerializationHolder) dürfen in dieser Sicherheitsebene nicht deserialisiert werden.

Bei Codeproject habe ich so ziemlich als erstes nachgeguckt konnte für mein Problem aber da keine lösung finden.

Gelöschter Account
vor 13 Jahren

typefilterlevel auf Full setzen.

C
C# Fritze Themenstarter:in
25 Beiträge seit 2010
vor 13 Jahren

Kannst du mir dazu nen codeschnipsel geben?
Und sorry für die Editiererei es ist so warm da vergesse ich die hälfte 😭

2.891 Beiträge seit 2004
vor 13 Jahren

Kannst du mir dazu nen codeschnipsel geben? Remoting-Helfer

C
C# Fritze Themenstarter:in
25 Beiträge seit 2010
vor 13 Jahren

Danke für den link dN!3L!

Nach einer genaueren Suche in der MSDN habe ich die Lösung dank JAck30lena gefunden.
Ich habe nur das:

IpcChannel ipc = new IpcChannel("BeispielPipe");

Durch das hier ersetzt:

BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();
props["portName"] = "BeispielPipe";

IpcChannel ipc = new IpcChannel(props, null, provider);
L
667 Beiträge seit 2004
vor 13 Jahren

Wird aber vermutlich wieder krachen, wenn es über das Internet gehen soll.

"It is not wise to be wise" - Sun Tzu

C
C# Fritze Themenstarter:in
25 Beiträge seit 2010
vor 13 Jahren

IPC ist ja auch wenn ich es richtig verstehe nur für den lokalen Rechner. Von daher habe ich da nichts mit Netzwerk oder gar Internet =)

Weiß eigentlich jemand zufällig ob das IpcChannel Rechnerglobal oder Benutzerlokal ist?

3.728 Beiträge seit 2005
vor 13 Jahren
Ipc

Weiß eigentlich jemand zufällig ob das IpcChannel Rechnerglobal oder Benutzerlokal ist?

Rechnerglobal!