Remote-Objekt Zugriff funktioniert nicht



  • Guten Morgen,

    ich bin dabei mich mit Remoting auseinander zu setzen und habe ein Microsoft-Beispiel gefunden, das recht simpel erklärt ist. Mit wenigen Zeilen bekommt man hier Server, Objekt und Client hin.
    http://support.microsoft.com/kb/307445/DE/
    http://support.microsoft.com/kb/307739/de#appliesto

    Aber der Client kann das Objekt nur lesen, nicht aber in die Instanz schreiben.

    Wo ist mein Fehler?

    ObjektKlasse

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ServerClass
    {
        public class myRemoteClass : MarshalByRefObject
        {
    
            public string MyString = "der String ist leer";
    
            public myRemoteClass()
            {
                // 
                // AUFGABE: Konstruktorlogik hier hinzufügen
                // 
            }
    
            public bool SetString(String sTemp)
            {
                try
                {
                    Console.WriteLine("This string '{0}' has a length of {1}", sTemp, sTemp.Length);
                    return sTemp != "";
                }
                catch
                {
                    return false;
                }
            }
    
            public string GetMyString()
            {
                return this.MyString;
            }
    
            public string SetMyString(string tmp)
            {
                try
                {
                    this.MyString = tmp;
                    return "OK";
                }
                catch(Exception ex)
                {
                    return ex.ToString();
                }
            }
        }
    }
    

    RemoteServer(als Konsole)

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    
    namespace RemoteServer
    {
        class RemoteServer
        {
            static void Main(string[] args)
            {
                TcpChannel chan = new TcpChannel(8085);
                ChannelServices.RegisterChannel(chan,false);
                RemotingConfiguration.RegisterWellKnownServiceType(
                System.Type.GetType("ServerClass.myRemoteClass, ServerClass"),"RemoteTest",WellKnownObjectMode.SingleCall);
    
                System.Console.WriteLine("Zum Beenden <EINGABETASTE> drücken...");
                System.Console.ReadLine();
            }
        }
    }
    

    Client-Anwendung(als Konsole)

    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    using ServerClass;
    
    namespace ClientApp
    {
        class ClientApp
        {
            static void Main(string[] args)
            {
                try
                {
                    TcpChannel chan = new TcpChannel();
                    ChannelServices.RegisterChannel(chan, false);
    
                    myRemoteClass obj = (myRemoteClass)Activator.GetObject(typeof(myRemoteClass),
         "tcp://localhost:8085/RemoteTest");
                    if (obj == null)
                        System.Console.WriteLine("Server wurde nicht gefunden.");
                    else
                        if (obj.SetString("Zeichenfolge wird an Server gesendet."))
                            System.Console.WriteLine("Erfolg: Überprüfen der anderen Konsole zu Bestätigungszwecken.");
                        else
                            System.Console.WriteLine("Senden der Testzeichenfolge ist fehlgeschlagen.");
    
                    Console.WriteLine(obj.SetMyString("das ist ein Test"));
                    Console.WriteLine(obj.GetMyString()); // hier sollte nun das ist ein Test ausgegeben werden, tatsächlich bekomme ich aber "Der String ist leer""
    
                    System.Console.WriteLine("Zum Beenden EINGABETASTE drücken...");
                    System.Console.ReadLine();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    System.Console.WriteLine("Zum Beenden EINGABETASTE drücken...");
                    System.Console.ReadLine();
                }
            }
        }
    }
    


  • War nur ein Fehler, der Aufruf SingleCall erzeugt jedesmal eine neue Distanz, Singleton hingegen nimmt die existierende Instanz!


Anmelden zum Antworten