Sie sind hier: Wissen

Was ist edge.JS ?

edge.js ist eine Brückentechnik zwischen node.js und Microsoft .NET Framework, die es node.js-Programmen ermöglicht, in Form von .NET-Assemblies vorliegende DLLs zuzugreifen oder Quellcode in verschiedenen .NET-Sprachen (z.B. F#, Visual Basic .NET, Python und die Windows PowerShell) nach einer Ad-Hoc-Kompilierung im gleichen Prozess aufzurufen

Details zu edge.js

Wenn für eine node,js-Website die Daten aus einem bereits bestehenden System, das mit Microsoft .NET entwickelt ist, kommen, stellt sich die Frage der Integration. Der typische Weg ist, das .NET-Backend in einem eigenen Prozess zu hosten, den node.js über HTTP-basierte Webservices (SOAP oder REST) aufruft. In .NET würde man diese Webservices über die Windows Communication Foundation (SOAP und REST, HTTP und viele andere Protokolle) oder das ASP.NET Web API (nur HTTP/REST) bereitstellen. Allerdings muss man sich im Klaren sein, dass die zusätzliche Prozessgrenze erheblich Leistung frisst. Bei edge.js handelt es sich um eine node.js-Erweiterungsbibliothek, die es node.js-Programmen ermöglicht, in Form von .NET-Assemblies vorliegende DLLs zuzugreifen oder Quellcode in verschiedenen .NET-Sprachen (z.B. F#, Visual Basic .NET, Python und die Windows PowerShell) nach einer Ad-Hoc-Kompilierung im gleichen Prozess aufzurufen. Da die Integration asynchron erfolgt, ist .NET Framework 4.5 die Voraussetzung. Autor von edge.js ist Tomasz Janczuk, ein ehemaliger Development Manager bei Microsoft im Windows Azure Team.

Listing 1 und 2 zeigt eine auf edge.js basierende Integration zwischen JavaScript und C#. Der JavaScript-Code erzeugt mit edge.func() eine Proxy-Funktion für eine .NET-Methode. Dabei sind Assemblyname, Typname und Methodenname anzugeben. Diese im Bezeichner csFunktion abgelegte Funktion wird dann im Folgenden aufgerufen mit einem Nutzdatenobjekt, dass drei Attribute besitzt: Eine Zeichenkette, ein Array von JavaScript-Objekten und den Zeiger auf eine JavaScript-Funktion, die .NET zurückrufen kann. Als zweiten Parameter der csFunktion muss man in JavaScript beim Aufruf der .NET-Methode eine Callback-Funktion mit zwei Parametern (Fehlerobjekt und Ergebnis der Funktion) angeben. Wenn das Fehlerobjekt-Objekt den Wert null hat, ist kein Fehler aufgetreten.

Die C#-Seite empfängt das JavaScript-Nutzdatenobjekt als System.Dynamic.ExpandoObject mit Schnittstelle „Idictionary<string,object>“. In Listing 12 werden daher zuerst die drei Attribute „Aufrufer“, „Produktliste“ und „Callback“ aus dem Dictionary geholt. Anschließend erfolgt die Weiterverarbeitung. Die Produktliste wird als ein Array von ExpandoObject empfangen; daher müssen die C#-Produkt-Objekte in der Iteration über die Eingabemenge erst konstruiert werden. Die Console.WriteLine()-Arufrufe, die beim Debugging in dem node.js-Konsolenfenster landen, sind natürlich nur zu Testzwecken vorhanden. Wie das Beispiel anhand der Klasse Ergebnis zeigt, kann .NET auch komplexe Datentypen zurückgeben. Voraussetzung ist ihre Serialisierbarkeit mit JSON und das Fehlen zirkulärer Referenzen. Die Callback-Funktion empfängt C# als Typ Func<object,Task<object>>, der mit await aufgerufen werden kann. Wichtig zu beachten ist, dass in JavaScript die Callback-Funktion aktiv wieder C# aufrufen muss. Dafür empfängt sie im zweiten Parameter (hier „callbackEnde“ genannt) den Rücksprungpunkt.

Der JavaScript-Code erzeugt Produkt-Objekte, die an C# übergeben und dort ausgewertet werden. Während der Auswertung sendet C# den Status („Produkt x empfangen!“) an JavaScript zurück. JavaScript gibt diese Zwischenzustände und das Ergebnisobjekt in der HTML-Seite aus. Bei der Verwendung von edge.js in Visual Studio ist das Debugging inzwischen über die Technikgrenze hinweg möglich.

Listing 1: node.js-Server, der via edge auf Methode in einer .NET-Assembly zugreift

var http = require('http');
var url = require('url');
var edge = require('edge');

var anfrageBearbeiter = function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});

res.write("<html>");
res.write("<body><h1>Kopplung node.JS und .NET via edge</h1>");

// Aufzurufende C#-Methode festlegen
var csFunktion = edge.func(
{
assemblyFile: dirname + "/DOTNETAssembly.dll",
typeName: 'edgeJSDemos.Produktmanager',
methodName: 'Invoke' // Func<object,Task<object>>
});

// Test-Produkte generieren
var Produkte = [];
for(var i = 0; i<= 10; i++)
{
var Produkt = {
Name: 'Produkt ' + i,
Preis: 0.99+i*i
};
Produkte.push(Produkt);
}

// C# aufrufen
csFunktion( { // Nutzdaten
Aufrufer: "Beispiel 6a",
Produktliste: Produkte,
Callback: function(daten, callbackEnde) { res.write("."); callbackEnde(null, null); } },
// Ergebnismethode
function (error, result) {
// Ergebnis von C# auswerten
if (error) {
res.write("Fehler: " + error);
}
else {
res.write("Summe: " + result.Summe + "<br>");
res.write("Durchschnitt: " + result.Durchschnitt + "<br>");
res.write("</body>");
res.write("</html>");
res.end();
}
});

};


// Server starten
var server = http.createServer(anfrageBearbeiter);

server.listen(1337, function() {
console.log("Server aufrufen mit http://localhost:1337?name=<Name einsetzen>");
});

Listing 2: C#-Programmcode zu Listing 1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace edgeJSDemos
{
public class ProduktManager
{
class Produkt
{
public string Name { get; set; }
public double Preis { get; set; }
}

class Ergebnis
{
public double Summe { get; set; }
public double Durchschnitt { get; set; }
}

public async Task<object> Invoke(System.Dynamic.ExpandoObject input)
{
Console.WriteLine("C# beginnt…");

var liste = new List<Produkt>();

Console.WriteLine("Empfangener Datentyp: " + input.GetType().FullName);

// zugriff auf die Eigenschaften des Nutzdatenobjekts
var NutzDaten = (Idictionary<string, object>)input;
var Aufrufer = (string)NutzDaten["Aufrufer"];
var Produktliste = (object[])NutzDaten["Produktliste"];
var Callback = (Func<object, Task<object>>)NutzDaten["Callback"];

Console.WriteLine("Aufrufer {0} lieferte {1} Produkte.", Aufrufer, Produktliste.Length);

// Iteration über alle Produkte
foreach (var obj in Produktliste)
{
Idictionary<string, object> payload = (Idictionary<string, object>)obj;
Console.WriteLine("Empfangener Datentyp: " + payload);
// Produktobjekte erzeugen
var p = new Produkt()
{
Name = (string)payload["Name"],
Preis = (double)payload["Preis"]
};
liste.Add(p);
// Nur Testausgabe
Console.WriteLine("C#: " + p.Name + " kostet " + p.Preis);

await Callback("Produkt " + p.Name + " empfangen!");
}

// Auswertung erstellen
var e = new Ergebnis()
{
Summe = Math.Round(liste.Sum(x => x.Preis), 2),
Durchschnitt = Math.Round(liste.Average(x => x.Preis), 2)
};

Console.WriteLine("C# ist fertig!");

return e;
}
}
}

Beratung & Support

Schulungen zu diesem Thema

 Anfrage für eine individuelle Schulung zum Thema edge.JS  Gesamter Schulungsthemenkatalog

Bücher zu diesem Thema

  Blazor 9.0: Moderne Webanwendungen und hybride Cross-Platform-Apps mit .NET 9.0, C# 13.0 und Visual Studio 2022
  C# 13.0 Crashkurs
  Moderne Datenzugriffslösungen mit Entity Framework Core 9.0
  .NET 9.0 Update: Die Neuerungen in .NET 9.0 gegenüber .NET 8.0
  PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch
  .NET 8.0 Update: Die Neuerungen in .NET 8.0 gegenüber .NET 7.0
  Blazor 8.0: Moderne Webanwendungen und hybride Cross-Platform-Apps mit .NET 8.0, C# 12.0 und Visual Studio 2022
  Moderne Datenzugriffslösungen mit Entity Framework Core 8.0
  C# 12.0 Crashkurs
  Cross-Plattform-Apps mit .NET MAUI entwickeln
  Blazor 7.0: Blazor WebAssembly, Blazor Server und Blazor Hybrid
  C# 11.0 Crashkurs
  Moderne Datenzugriffslösungen mit Entity Framework Core 7.0
  PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch
  App Engineering: SwiftUI, Jetpack Compose, .NET MAUI und Flutter
  Vue.js 3 Crashkurs
  Moderne Datenzugriffslösungen mit Entity Framework Core 6.0
  Blazor 6.0: Blazor WebAssembly, Blazor Server und Blazor Desktop
  C# 10.0 Crashkurs
  Cross-Plattform-Apps mit Xamarin.Forms entwickeln
  Developing Web Components with TypeScript: Native Web Development Using Thin Libraries
  PowerShell – kurz & gut
  C# 9.0 Crashkurs: Die Syntax der Programmiersprache C# für die Softwareentwicklung in .NET 5.0, .NET Core und Xamarin
  ASP.NET Core Blazor 5.0: Blazor WebAssembly und Blazor Server - Moderne Single-Page-Web-Applications
  Windows PowerShell 5 und PowerShell 7: Das Praxisbuch
  Moderne Datenzugriffslösungen mit Entity Framework Core 5.0
  ASP.NET Core Blazor 3.1/3.2: Blazor Server und Blazor Webassembly - Moderne Single-Page-Web-Applications mit .NET, C# und Visual Studio
  ASP.NET Core Blazor 3.0/3.1: Blazor Server und Blazor Webassembly - Moderne Single-Page-Web-Applications mit .NET, C# und Visual Studio
  Moderne Datenzugriffslösungen mit Entity Framework Core 3.1
  C# 8.0 Crashkurs: Die Syntax der Programmiersprache C# für die Softwareentwicklung in .NET Framework, .NET Core und Xamarin
  Moderne Datenzugriffslösungen mit Entity Framework Core 3.0
  Windows PowerShell 5.1 und PowerShell Core 6.1 - Das Praxishandbuch
  Moderne Datenzugriffslösungen mit Entity Framework Core 2.1/2.2
  Moderne Webanwendungen für .NET-Entwickler: Server-Anwendungen, Web APIs, SPAs & HTML-Cross-Platform-Anwendungen mit ASP.NET, ASP.NET Core, JavaScript
  C# 7.3 Crashkurs: Die Syntax der Programmiersprache C# für die Softwareentwicklung in .NET Framework, .NET Core und Xamarin
  Modern Data Access with Entity Framework Core: Database Programming Using .NET, .NET Core, UWP, and Xamarin with C#
  Windows PowerShell und PowerShell Core - Der schnelle Einstieg: Skriptbasierte Systemadministration für Windows, Linux und macOS
  Programmierung in Python
  C# 7.2 Crashkurs: Die Syntax der Programmiersprache C# für die Softwareentwicklung in .NET Framework, .NET Core und Xamarin
  Moderne Datenzugriffslösungen mit Entity Framework Core 2.0/2.1
  Effizienter Datenzugriff mit Entity Framework Core: Datenbankprogrammierung mit C# für .NET Framework, .NET Core und Xamarin
  Moderne Datenzugriffslösungen mit Entity Framework Core 2.0
  Windows PowerShell 5 und PowerShell Core 6 - Das Praxishandbuch
  Angular - Das Praxisbuch zu Grundlagen und Best Practices
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.0, 1,1 und 2.0
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.0, 1,1 und 2.0
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.1 und 2.0-Preview2
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.x und 2.0
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.x und 2.0
  Introducing Regular Expressions: JavaScript and TypeScript
  Introducing Web Development
  Introducing Bootstrap 4
  Programming Web Applications with Node, Express and Pug
  Einführung in TypeScript: Grundlagen der Sprache TypeScript 2
  Pug – Die Template-Engine für node.js
  Web-Programmierung mit Node, Express und Pug
  Windows PowerShell 5 – kurz & gut
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.1
  Windows PowerShell 5.0 - Das Praxishandbuch
  PHP 7 und MySQL: Von den Grundlagen bis zur professionellen Programmierung
  Windows Scripting Lernen
  .NET Praxis - Tipps und Tricks für .NET und Visual Studio
  Grundlagen für Web-Entwickler: Protokolle, HTML und CSS
  Bootstrap 3 - Stile und Komponenten
  Bootstrap 4 - Stile und Komponenten
  Einführung in JavaScript: ECMAScript 5
  Einführung in node.js
  express – Middleware für node.js
  JADE – Die Template Engine für node.js
  Reguläre Ausdrücke in JavaScript
  Moderne Datenzugriffslösungen mit Entity Framework 6
  C++ Standardbibliothek
  AngularJS: Moderne Webanwendungen und Single Page Applications mit JavaScript
  Microsoft SharePoint Server 2013 und SharePoint Foundation: Das umfassende Handbuch
  SQL Server 2014 für Professionals: Hochverfügbarkeit, Cloud-Szenarien, Backup/Restore, Monitoring & Performance
  Moderne Webanwendungen mit ASP.NET MVC und JavaScript
  Windows PowerShell 4.0 - Das Praxishandbuch
  JavaScript: Das umfassende Handbuch, inkl. HTML5, JavaScript-Frameworks, jQuery, OOP
  C++11 für Programmierer
  C++ kurz und gut
  Microsoft ASP.NET 4.5 - Entwicklerbuch
  Moderne Webanwendungen mit ASP.NET MVC
  Verteilte Systeme und Services mit .NET 4.5
  Scripting mit Windows PowerShell 3.0 - Der Workshop: Skript-Programmierung mit Windows PowerShell 3.0 vom Einsteiger bis zum Profi
  Windows 8 für Administratoren
  Windows 8.1 - Das Handbuch (27. November 2013)
  Windows Store Apps entwickeln mit C# und XAML - Crashkurs
  .NET 4.5 Update
  Windows Scripting Lernen
  WPF 4.5 und XAML
  Datenbankprogrammierung mit .NET 4.5
  C++11: Der Leitfaden für Programmierer zum neuen Standard
  Verteilte Systeme und Services mit .NET 4.0
  Microsoft ASP.NET 4.0 mit C# 2010 - Entwicklerbuch
  Agile Software Engineering with Visual Studio
  Datenbankprogrammierung mit .NET 4.0. Mit Visual Studio 2010 und SQL Server 2008 R2
  Microsoft SharePoint Server 2010 und SharePoint Foundation 2010
  Microsoft SQL Server 2008 R2 - Das Entwicklerbuch
  Microsoft Viusal C# 2010
  Office 2010 Programmierung mit VSTO und .NET 4.0: Word, Excel und Outlook erweitern und anpassen
  Programmieren mit dem ADO.NET Entity Framework
  .NET 4.0 Crashkurs
  Visual Basic 2010: Grundlagen, ADO.NET, Windows Presentation Foundation
  .NET 4.0 Update
  Windows PowerShell 2.0 - Das Praxishandbuch
  Windows 7 im Unternehmen
  Agile Muster und Methoden
  Ajax
  ASP.NET 4.0
  ASP.NET 4.0 mit Visual C# 2010
  JavaScript
  PHP 5-Migration
  Scripting mit Windows PowerShell 2.0 - Der Einsteiger-Workshop
  SQL Server 2008 R2: Das Programmierhandbuch. Inkl. ADO.NET 3.5, LINQ to Entities und LINQ to SQL
  Visual Basic 2010
  Windows PowerShell 2.0 - Crashkurs
  Windows Server 2008 R2
  Windows Scripting
  Windows Scripting Lernen
  Data Mining mit Microsoft SQL Server
  Windows 7 für Administratoren
  Microsoft ASP.NET 3.5 mit Visual Basic 2008 - Entwicklerbuch
  .NET 3.5
  Essential PowerShell
  .NET 3.5 Crashkurs
  Webanwendungen mit ASP.NET 3.5 und AJAX Crashkurs
 Alle unsere aktuellen Fachbücher  E-Book-Abo für ab 99 Euro im Jahr