Laden...

Komponenten kommunikation

Erstellt von luciluke vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.111 Views
L
luciluke Themenstarter:in
45 Beiträge seit 2006
vor 13 Jahren
Komponenten kommunikation

Hallo Rainbird,

irgendwie hänge ich fest, bei dem Versuch meine Anwendung die im Moment auf Basis von Deinem .NET Applikationsserver aufgebaut ist auf Zyan umzustellen.

  1. Eine Authentifizierung habe ich mit einem eigenen AuthenticationProvider in zyan hinbekommen
    wobei ich hierbei leider nicht wahlweise ipc benutzen kann, da dort dann über ServerSession.CurrentSession.Identity.Name nichts zurückgegeben wird.
    die Clientanwendung die auch auf dem server läuft würde ich eigentlich gerne über ipc laufen lassen, bräuchte dann aber trotzdem den Anmeldenamen dieses Clienten.

  2. Dann habe ich auch das mit dem PermissionManager aus Rainbird Zyan: Exception versucht, aber hier kommt mein eigentliches Problem.
    Wie können sich zwei Serverkomponenten untereinander unterhalten. Die Serverkomponente A möchte gerne von der Serverkomponente B wissen ob ServerSession.CurrentSession.Identity.Name Daten ändern darf. Muß dann jede Serverkomponente eine eigene zyanconnection haben mit Anmeldung, um einen proxy für die jeweilige Komponente zu erstellen?
    Bei Deinem .NET Applikationsserver konnte man das ja über die ApplicationServer Klasse machen (ApplicationServer.IsInRole("")) usw.
    Das gleiche gilt für eine weitere benötigte Serverkomponente Locking.
    Gibt es einen Weg, dass sich zwei Komponenten direkt über ipc unterhalten können?

  3. Was muß ich machen, das eine Komponente von unterschiedlichen Clienten wahlweise über ipc tcp oder Http erreichbar sind?
    Muß bzw. kann ich eine Komponente in drei hosts registrieren als Singelton.
    in etwa so:

TcpCustomServerProtocolSetup protocol1 = new TcpCustomServerProtocolSetup(9003, new ElCashAuthProvider());
HttpCustomServerProtocolSetup protocol2 = new HttpCustomServerProtocolSetup(8000, new ElCashAuthProvider(), true);
IpcBinaryServerProtocolSetup protocol3 = new IpcBinaryServerProtocolSetup("IPCElCashPrintServer");

ZyanComponentHost host1 = new ZyanComponentHost("ElCashPrintServer", protocol1);
ZyanComponentHost host2 = new ZyanComponentHost("ElCashPrintServer", protocol2);
ZyanComponentHost host3 = new ZyanComponentHost("ElCashPrintServer", protocol3);

PrintServer _printServer = new PrintServer();
host1.RegisterComponent<IPrintServer, PrintServer>(_printServer);
host2.RegisterComponent<IPrintServer, PrintServer>(_printServer);
host3.RegisterComponent<IPrintServer, PrintServer>(_printServer);

wobei in PrintServer eine SyncQueue läuft die von mehreren Clients über unterschiedliche protokolle s.o. Daten empfangen und auch einige Daten (DataTables) halten muß.

ps: Ich habe jetzt einmal versucht von KomponenteA mit einer neuen zyanConnection(tcp mit eigenem AuthProvider) auf KomponenteB zuzugreifen.
Das funktioniert auch, nur wenn der host in einer WindowsForm erstellt wird bekomme ich beim erstellen der zyanConnection in der KomponenteA eine CryptoRemotingException "Der Server benötigt eine verschlüsselte Verbindung für diesen Client" (SecureTransactionStage.Uninitialized). Die erste zyanConnection vom entfernten Client selber funktioniert. Mich würde interessieren, wo da der Unterschied ist (host in WindowsForm oder nicht).

3.728 Beiträge seit 2005
vor 13 Jahren
Hosting Optionen

Hallo luciluke,

Du brauchst keinen IPC-Kanal mehr, um andere Komponenten auf dem Server aufzurufen. Zyan-Komponentenkataloge lassen sich auch direkt verwenden. Ein Komponentenkatalog verwaltet eine Gruppe von Komponenten. Wenn nicht anders angegeben erzeugt jeder ZyanComponentHost seinen eigenen Komponentenkatalog. Du kannst den zu hostenden Komponentenkatalog aber auch per Konstruktor übergben. So kannst Du die selbe Gruppe von Komponenten mit verschiedenen Hosts hosten. Das ist z.B. dann sinnvoll, wenn Du verschiedene Protokolle gleichzeitig unterstützen willst/musst.

So erstellst Du manuell einen Komponentenkatalog und hostest in zwei verschiedenen Hosts:


// Komponentenkatalog erzeugen
ComponentCatalog catalog = new ComponentCatalog();

// Singleton-Komponente erzeugen
PrintServer _printServer = new PrintServer();

// Komponente registrieren
catalog.RegisterComponent<IPrintServer, PrintServer>(_printServer);

// Protokolleinstellungen erzeugen
TcpCustomServerProtocolSetup protocol1 = new TcpCustomServerProtocolSetup(9003, new ElCashAuthProvider());
HttpCustomServerProtocolSetup protocol2 = new HttpCustomServerProtocolSetup(8000, new ElCashAuthProvider(), true);

// Vorhandenen Komponentenkatalog über verschiedene Protokolle veröffentlichen
ZyanComponentHost host1 = new ZyanComponentHost("ElCashPrintServerTcp", protocol1, catalog);
ZyanComponentHost host2 = new ZyanComponentHost("ElCashPrintServerHttp", protocol2, catalog);

Du kannst übrigens beliebig viele Komponentenkataloge haben.

Nun aber zu Deinem eigentlichen Problem. Die Komponente PrintServer soll die Komponente PermissionManager aufrufen, welche auf dem selben Server lebt. Statt das über einen IPC-Kanal zu machen, musst Du nur dafür sorgen, dass die PrintServer-Klasse Zugriff auf den Komponentenkatalog haben, in dem PermissionManager registriert ist. Dafür könntest Du z.B. eine statische Klasse anlegen, die einen zentralen Komponentenkatalog zur Verfügung stellt:


/// <summary>
/// Stellt einen zentralen Komponentenkatalog zur Verfügung.
/// </summary>
public static class Kernel
{
    // Komponentenkatalog
    private static volatile ComponentCatalog _catalog = null;

    // Objekt für Threadsychnronisierung bei Erstellung der Singleon-Instanz
    private static object _lockObject = new object();

    /// <summary>
    /// Gibt den zentralen Komponentenkatalog zurück.
    /// </summary>
    public static ComponentCatalog Components
    {
        get
        {
            // Wenn der Komponentenkatalog noch nicht erzeugt wurde ...
            if (_catalog == null)
            {
                lock (_lockObject)
                {
                    // Wenn der Komponentenkatalog nict inzwischen durch einen anderen Thread erzeugt wurde
                    if (_catalog == null)
                        // Komponentenkatalog erzeugen
                        _catalog = new ComponentCatalog();
                }
            }
            // Komponentenkatalog zurückgeben
            return _catalog;
        }
    }
}

Deine Komponenten PrintServer und PermissionManager würdest Du dann bei diesem zentralen Komponentenkatalog registrieren (Kernel.Components.RegisterComponent ...). Bei Deinen Hosts würdest Du im Konstruktor Kernel.Components als Komponentenkatalog übergeben.
Innerhalb Deiner PrintServer-Komponente, könntest dann den PermissionManager folgendermaßen aufrufen:


// Instanz von PermissionManager abrufen
IPermissionManager permisionManager = Kernel.Components.GetComponent<IPermissionManager>();

Es gibt viele Möglichkeiten, Komponenten und deren Kommunikation zu organisieren. Deshalb gibt Zyan das nicht fest vor.

Du könntest z.B. auch einen separaten Komponentenkatalog für interne Komponenten pflegen, die gar nicht übers Netzwerk aufrufbar sind.
Natürlich könntest Du Deine Komponenten auch als EBCs entwerfen. In diesem Fall hättest Du eine serverseitige Platine, die PrintServer und PermissionManager miteinander verdrahten würde.