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#appliestoAber 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!