<< Click to Display Table of Contents >> Navigation: Server Side Programming > Server Side Programming in individuellen Masken |
Mit Server Side Programming (nachfolgend SSP genannt) in individuellen Masken wird ermöglicht, dass die Maskenlogik auf dem Server (auf dem der CMDB-Core läuft) statt im Browser ausgeführt wird.
Der Code wird über den Reiter "Server-Side Code" verwaltet.
Ziel
Das Ziel ist, die Maskenlogik aus dem Browser auf den Server zu verschieben.
Vorteile
Die Logik wird in C# programmiert, d.h. alle Möglichkeiten des .NET-Frameworks stehen zur Verfügung (zur Erinnerung: der Code läuft auf dem Server, nicht auf dem Client).
Im Unterschied zu JavaScript wird C# kompiliert, dadurch werden viele Fehler schon während des Designs (in der Management Console) entdeckt. Es handelt sich um Fehler wie falsche Syntax, nicht vorhandene Variablen oder Funktionen (Tippfehler), falsche Anzahl von Parametern, falscher Parametertyp etc.
Die Logik ist vor dem Webbenutzer verborgen.
Da der Code auf dem Server läuft, können bestehende Masken-Elemente um Methoden/Ereignisse erweitert werden, die bisher aus Sicherheits- oder technischen Gründen nicht möglich waren. So gibt z.B. beim Attachment-Element die Methode GetCurrentTempDir() den temporären Pfad zurück.
Nachteile
Keine direkte Interaktion mit dem Webbenutzer, d.h. keine alert-, prompt- und confirm-Funktionen.
Änderungen
Die Runtime-Fehler in JavaScript werden nur im Browser angezeigt und nicht gelogged. Die Quellen für den Servercode werden archiviert und bei Runtime-Fehlern in C# wird die Fehlermeldung inkl. Verweis auf die archivierte Quelle gelogged (cmdbcore.log, Statistik). Dies ermöglicht auch eine spätere Fehleranalyse.
Anstatt globaler SQL-API und Funktionen gibt es bei SSP sog. „Managed Classes“. Jede Managed Class kann SQL-API, Funktionen und Attribute enthalten und nach der Zuordnung zu einer individuellen Maske kann diese Maske die SQL-API, Funktionen und Attribute benutzen.
C# ist eine stark typisierte Sprache, dadurch ist die Programmierung sicherer.
Alle Maskenelemente, Funktionen, SQL-APIs usw. sind auf gleicher Ebene, d.h. keine Namespaces wie _sqlapi, _customer, …
Ablauf im Hintergrund
Im Hintergrund wird für jede individuelle Maske eine Klasse einmal generiert und „on-the-fly“ in eine DLL kompiliert (nicht auf der Festplatte gespeichert). Die Kompilierung wird erst beim ersten Aufruf der Maske aus dem Client-Browser durchgeführt. Eine Probe-Kompilierung kann in der Management Console ausgeführt werden, aber die DLL wird dadurch nicht genutzt.
Für jede Maske, die im Browser geöffnet wird, wird aus der entsprechenden DLL eine neue Instanz der Klasse erstellt. Der CMDB-Core kommuniziert mit der Klasseninstanz über die Interface-Funktion __main_dispatch .
Beispiel (Ausschnitt):
using System; using System.Collections; using System.Text;
public class MainClass : rimacon.cmdb.web.UFCodeBehind.IMainClass { PostJSList PostJS = null; rimacon.cmdb.scripting.IDBConnection db = null; rimacon.cmdb.IPublicCMDB cmdb = null; public MainClass() {} ~MainClass(){} void __custom_dispose_94c11b8d023342ffa4a99757f2d5f82c(){ }
PrivateMainForm MainForm = null; ILabel label1 = null; ITextBox VCOL_SN = null; ILabel label3 = null; ISelectENUM VCOL_IsON = null; ISelectFK VCOL_STAT_ID = null; IStandardButton btSave = null;
public object __main_dispatch(...) { ... event_MainForm_AfterFormInit_24a8baa6a12f46a4a97b78c20c8649fb(); ... event_MainForm_CustomValidator_e1c6ce76df24459aa300f7c3be02630f(); ... event_MainForm_AfterSave_3b32a261d98f447ea7e8131a81cca0fc(); ... event_btSave_OnPress_ce48ca6db232432490a1b35764ae90b3(); ... }
void event_MainForm_AfterFormInit_24a8baa6a12f46a4a97b78c20c8649fb() { this.TextBox1.Value = get_new_id(); }
bool event_MainForm_CustomValidator_e1c6ce76df24459aa300f7c3be02630f() ... void event_MainForm_AfterSave_3b32a261d98f447ea7e8131a81cca0fc() ... bool event_btSave_OnPress_ce48ca6db232432490a1b35764ae90b3() ...
string get_new_id() { string __errmsg = ""; return get_new_id(out __errmsg); }
string get_new_id(out string __errmsg) { __errmsg = ""; ... object __result = ... return (string)__result; }
int plus(int p1, int p2) { return p1 + p2; } }
|
Für die Maskenelemente werden entsprechende Serverattribute erstellt (z.Zt. nicht für alle Maskenelemente), auf die aus dem Servercode zugegriffen werden kann. Die Attribute und Methoden aus JavaScript werden teilweise bei den Server-Elementen implementiert. Die Werte werden automatisch synchronisiert.
Beispiel:
Text über JavaScript setzen:
RU.TextBox1.setValue("hallo#1");
|
Text auf der Serverseite ändern (z.B. über Serverereignis Button.OnPress)
TextBox1.Value += "#2";
|
Ergebnis: hallo#1#2