Μπορεί μια εφαρμογή C# να επικοινωνήσει με τον κώδικα Node.js;

Μπορεί μια εφαρμογή C# να επικοινωνήσει με τον κώδικα Node.js;

Ναι, η επικοινωνία είναι δυνατή, όπως έχουν επισημάνει πολλά άτομα στα σχόλια της ερώτησής σας.

Αυτές είναι (μερικές) οι επιλογές:

  1. Η διαδικασία κόμβου σας εκτελεί έναν διακομιστή http και η εφαρμογή C# κάνει αιτήματα JSON Rest μέσω http
  2. Η διαδικασία του κόμβου σας εκτελεί μια υπηρεσία web SOAP χρησιμοποιώντας τη λειτουργική μονάδα node-soap/strong-soap
  3. Η εφαρμογή C# ξεκινά την εφαρμογή κόμβου σας και κάνετε IPC γράφοντας στη ροή εισόδου της διαδικασίας κόμβου και διαβάζοντας τη ροή εξόδου της.
  4. Η διαδικασία του κόμβου σας εκτελεί έναν διακομιστή υποδοχής και η εφαρμογή C# κάνει αιτήματα μέσω tcp.
  5. Χρησιμοποιείτε μια 3η διαδικασία/διακομιστή όπως το Redis ή μια ουρά μηνυμάτων
  6. Οτιδήποτε σας επιτρέπει να μοιράζεστε δεδομένα όπως αρχεία..

Θα σας συνιστούσα να χρησιμοποιήσετε την πρώτη επιλογή, καθώς δεν απαιτεί να ορίσετε ένα πρωτόκολλο γλώσσας για αποστολή μέσω "wire". Ο άλλος λόγος θα ήταν ότι υπάρχει πολλή τεκμηρίωση για να κάνετε Rest με C# και node.js.

Ως βιβλιοθήκη πελάτη στο C#, θα πρότεινα να ρίξετε μια ματιά στο Restsharp ως βιβλιοθήκη πελάτη, εάν δεν μπορείτε να χρησιμοποιήσετε την πιο πρόσφατη έκδοση του .NET (4.5). Εάν μπορείτε να χρησιμοποιήσετε την πιο πρόσφατη έκδοση, χρησιμοποιήστε το HttpClient για να καλέσετε το Node.js restservice. Για Node απλώς χρησιμοποιήστε το Express.

Η επιλογή 2 μπορεί να είναι γρήγορη καθώς υπάρχει καλή υποστήριξη στο VS για webservices, ωστόσο, έχω χρησιμοποιήσει μόνο node-soap ως πελάτη, οπότε δεν μπορώ να σχολιάσω πόσο καλά είναι οι υπηρεσίες web node-soap με τους πελάτες C#.


Η μη αυτόματη διαχείριση της επικοινωνίας μεταξύ των διεργασιών είναι χρονοβόρα και η παλιά εναλλακτική λύση, το Edge.js, δεν έχει ενημερωθεί από τα μέσα του 2017.

Ο οργανισμός μου διατηρεί μια βιβλιοθήκη, Jering.Javascript.NodeJS, η οποία σας επιτρέπει να κάνετε κλήση στο Node.js από C#.

Παράδειγμα χρήσης

string javascriptModule = @"
module.exports = (callback, x, y) => {  // Module must export a function that takes a callback as its first parameter
    var result = x + y; // Your javascript logic
    callback(null /* If an error occurred, provide an error object or message */, result); // Call the callback when you're done.
}";

// Invoke javascript in Node.js
int result = await StaticNodeJSService.InvokeFromStringAsync<int>(javascriptModule, args: new object[] { 3, 5 });

// result == 8
Assert.Equal(8, result);

Μπορείτε να καλέσετε οποιαδήποτε έγκυρη λειτουργική μονάδα Node.js, συμπεριλαμβανομένης μιας που εκτελεί εργασίες όπως αυτές που αναφέρονται στην ερώτηση:αναζήτηση μιας υπηρεσίας ιστού (POST), λήψη δεδομένων XML και χειρισμός αυτών των δεδομένων.

Καλύτερα

  • Υποστήριξη πολλαπλών πλατφορμών

    • Στοχεύει το .NET Standard 2.0 και το .NET Framework 4.6.1.
    • Δοκιμασμένο σε Windows, macOS και Linux.
  • Χαρακτηριστικά απόδοσης

    • Δεν ξεκινά μια νέα διαδικασία Node.js για κάθε επίκληση. Αντίθετα, στέλνει επικλήσεις σε μακροχρόνιες διαδικασίες μέσω επικοινωνίας μεταξύ των διεργασιών.
    • Προαιρετικά, εκτελεί επικλήσεις ταυτόχρονα σε ένα σύμπλεγμα διαδικασιών Node.js. Χειρίζεται την εξισορρόπηση φορτίου για το σύμπλεγμα.
    • Αποθηκεύει προσωρινά τη javascript μεταγλώττιση όπου είναι δυνατόν.
  • Μακροχρόνια υποστήριξη εφαρμογών

    • Επανεκκινεί τις διεργασίες Node.js εάν τερματιστούν απροσδόκητα.
    • Προαιρετικά, επανεκκινεί τις διαδικασίες Node.js κατά την αλλαγή αρχείου.
    • Σκοτώνει τις διεργασίες Node.js όταν η μητρική διαδικασία .Net πεθάνει.
  • Ευέλικτο API

    • Εκθέτει τόσο ένα στατικό API όσο και ένα API που βασίζεται σε ένεση εξάρτησης.
    • Υποστηρίζει την επίκληση javascript στο string φόρμα, Stream φόρμα ή από ένα αρχείο στο δίσκο.