Entwickler-Ecke

Verteilte Systeme - WinForms App als Remoting Server - Wie Ausgabe auf dem Form?


Ares - Do 15.01.09 17:34
Titel: WinForms App als Remoting Server - Wie Ausgabe auf dem Form?
Hallo!

Ich mache gerade meine ersten Schritt mit .NET Remoting und versuche mich an einer ersten Testanwendung. Das Projekt besteht aus einem Server und einem Client, beides Windows Forms Anwendungen.

Im Client wird ein Objekt erzeugt, dass im Server instantiiert ist und ruft Methoden dieses Objektes auf. Mein Ziel ist es nun, dass durch diese Methoden etwas auf dem Form des Servers geändert wird (z.B. Text in TextBox ausgeben).

Der Server sieht so aus:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
// Interface des Service
namespace Interfaces {
    public interface IMyService {
        string func1();
        string func2();
    }
}
// ------

// Implementierung des Service
namespace Server {
    public class MyService: MarshalByRefObject, IMyService {
        private string randValue;

        public MyService() {
            Random rand = new Random();
            randValue = rand.Next(9999).ToString();
        }        
        
        public string func1() {
            // Einfache Textrückgabe an den Client damit diese dort ausgegeben werden kann 
            return "Im Server " + randValue + " wurde Funktion 1 aufgerufen\r\n";
        }

        public string func2() {
            // Hier soll etwas auf dem Serverform ausgeben werden
            MachWasMitServerForm();
        }
    }
}
// -----


// Das Eigentlich Serverprogramm
namespace Server {
    static class ServerApp {
        [STAThread]
        static void Main() {
            RemotingConfiguration.Configure("Server.exe.config"false);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new ServerForm());
        }
    }
}





C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
// Das Client-Form
namespace Client {
    public partial class ClientForm : Form {
        private IMyService myService;
        
        public ClientForm() {
            InitializeComponent();

            myService = Activator.GetObject(typeof(IMyService), "tcp://localhost:12345/MyServiceUri"as IMyService;
        }

        private void button1_Click(object sender, EventArgs e) {
            Application.Exit();
        }

        private void button2_Click(object sender, EventArgs e) {
            textBox1.Text += myService.func1();
        }

        private void button3_Click(object sender, EventArgs e) {
            myService.func2();
        }
    }
}



Das Problem ist nun die Stelle MachWasMitServerForm(); weil das Objekt das Server-Form ja gar nicht kennt. Das Objekt wird zwar im Server instanziiert aber von der Logik her befindet es sich im Client und dort ist ja nichts weiter über den Server bekannt.

Kann MyService also überhaupt irgendwas im Server machen? Kann MyService mit irgendwelchen Teilen des Serverprogramms in Kontakt treten um dort z.B. Daten abzufragen oder eben etwas in einem Form auszugeben?

Eigentlich soll ein Objekt ja nur auf solche Objekte zugreifen die es selbst direkt oder indirekt erstellt hat. Insofern ist MyService ja gänzlich gelöst vom Server und kann nicht auf diesen zugreifen. Oder verstehe ich das falsch?

Ich habe zwar zahlreiche Beispiele zum Thema Remoting gefunden aber die arbeiten alle mit einer Konsolenanwendung als Server. Der Server kann dort über Console... also ganz einfach etwas ausgeben. Aber wie soll das bei einer WinForms Anwendung funktionieren?

Besten Dank
Ares


Kha - Do 15.01.09 20:31

Zum Problem kann ich nichts sagen, nur ein kurzer Hinweis, falls du nicht an 2.0 gebunden bist: Mit 3.0 hat WCF .NET-Remoting abgelöst.


Ares - Fr 16.01.09 09:21

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Zum Problem kann ich nichts sagen, nur ein kurzer Hinweis, falls du nicht an 2.0 gebunden bist: Mit 3.0 hat WCF .NET-Remoting abgelöst.


Bevor ich mich an Remoting versucht habe, habe ich mich zunächst mit WCF beschäftigt. Soweit ich weiß kann die WCF derzeit nur unter XP, Vista und Windows Server verwendet werden, das Programm sollte aber möglichst allgemein einsetzbar sein.

Wenn ich das richtig verstanden habe lassen sich mit der WCF nur zustandslose Services erstellen. Ich möchte aber gerne erreichen, dass ein Client permanent Daten von einem Server abfragen und an diesen senden kann. Der Zustand des Servers soll also durch den Client verändert werden können. Ist die WCF dafür geeignet? Bzw. zu meiner ursprünglichen Frage: Ist Remoting hierfür geeignet?


Kha - Mo 19.01.09 18:34

Zumindest bei WCF habe ich gerade gesehen, dass es auch einen ServiceHost-Konstruktor gibt, der ein Objekt des Contract-Interfaces entgegennimmt; damit sollte es also funktionieren.