Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Ενσωματώνοντας ένα remote object στο client...

Îåêßíçóå áðü ôï ìÝëïò smecht. Τελευταία δημοσίευση από το μέλος smecht στις 24-08-2006, 11:45. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  21-08-2006, 17:29 15725

    Ενσωματώνοντας ένα remote object στο client...

    Καλησπέρα και συγχαρητήρια για τη δουλειά σας. Εδώ και μερικές μέρες αντιμετωπίζω ένα πρόβλημα και μετά από πολύ και άκαρπη προσπάθεια αποφάσισα να ζητήσω τη βοήθεια σας.

     

    Σε μια εφαρμογή μου έχω χρησιμοποιήσει την τεχνολογία .Net Remoting. Το remote object επιστρέφει στον client σαν ένα MarshalByRefObject. Αυτό το MarshalByRefObject ανατίθεται σε ένα αντικείμενο αντίστοιχου interface και όλα παίζουν μια χαρά. Ο κώδικας (γραμμένος σε Delphi.Net) είναι ο παρακάτω...

     

    GetServerComponentObject := Activator.GetObject(pType, pURL) as MarshalByRefObject;

    tComp := GetServerComponentObject as IComp;

      

    Πρόσφατα προέκυψε η ανάγκη η εφαρμογή να λειτουργεί και αυτόνομα, εκτελώντας στον client και τις λειτουργίες που εκτελούνται στον server.

     

    Η πρώτη λύση που σκέφτηκα ήταν να φέρω στον client σαν ένα ανεξάρτητο dll το κομμάτι που εκτελείται στον server και να δημιουργήσω το object όχι με Activator.GetObject άλλα με Activator.CreateInstance. Το πρόβλημα που προκύπτει είναι ότι εφόσον το object δημιουργείται local τότε ο τύπος του δεν είναι MarshalByRefObject άλλα ο πραγματικός τύπος όπως ορίζεται στο dll. Εφόσον το interface έχει οριστεί και στο dll και στο exe, τότε γυρίζει λάθος “Specified Cast is not valid”. Ξέρω ότι μπορώ να ξεπεράσω το πρόβλημα είτε ενσωματώνοντας όλες τις λειτουργίες σε ένα assembly, είτε σπάζονταςτο interface σε ξεχωριστό assembly, άλλα δεν θα το ήθελα αφού η εφαρμογή όπως είναι ήδη παίζει και αυτές οι αλλαγές θα επηρέαζαν τον κανονικό τρόπο λειτουργίας.

     

    Επίσης, θα μπορούσα να ανοίξω ένα port στον client και να ακολουθήσω την ίδια δοκιμασμένη συνταγήάλλα ούτε αυτή θα ήταν αποδεκτή λύση, αφού το client θα πρέπει να έχει εγκατεστημένο και ενεργοποιημένο τον iis, πράγμα το οποίο δεν μπορώ να επιβάλλω.

     

    Στην ουσία αυτό που θέλω είναι ένας τρόπος να κάνω κάτι σαν Activator.GetObject χωρίς url… Δεν ξέρω, όμως,  αν κάτι τέτοιο είναι εφικτό.

     

    Περιμένω τη βοήθεια σας και σας ευχαριστώ εκ των προτέρων....

  •  21-08-2006, 18:02 15726 σε απάντηση της 15725

    Απ: Ενσωματώνοντας ένα remote object στο client...

     smecht wrote:

    κώδικας (γραμμένος σε Delphi.Net) ...

    Εντυπωσιακό. Είσαι ο πρώτος που βλέπω σε αυτό forum να γράφει σε Delphi!

     smecht wrote:

    Επίσης, θα μπορούσα να ανοίξω ένα port στον client και να ακολουθήσω την ίδια δοκιμασμένη συνταγήάλλα ούτε αυτή θα ήταν αποδεκτή λύση, αφού το client θα πρέπει να έχει εγκατεστημένο και ενεργοποιημένο τον iis, πράγμα το οποίο δεν μπορώ να επιβάλλω.

     

    Δεν είναι απαραίτητο να έχεις IIS για το .net remoting. Αρκεί κάποιο άλλο exe να παίζει το ρόλο του server.


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  22-08-2006, 09:13 15736 σε απάντηση της 15726

    Smile [:)] Απ: Ενσωματώνοντας ένα remote object στο client...

     papadi wrote:

    Εντυπωσιακό. Είσαι ο πρώτος που βλέπω σε αυτό forum να γράφει σε Delphi!

    Wink Μου έμεινε κουσούρι από πάλιά.

     

    Δεν ξέρω, όμως, αν θα συνεχίσω να γράφω σε Delphi.... Confused

     

     

     papadi wrote:

    Δεν είναι απαραίτητο να έχεις IIS για το .net remoting. Αρκεί κάποιο άλλο exe να παίζει το ρόλο του server.

     

    Πολύ ενδιαφέρον αυτό που λες.... Η Activator.GetObject, όμως, δέχεται σαν παράμετρο url. Εφόσον δεν έχω iis, φαντάζομαι ότι δεν θα παίζει εκεί το "tcp://localhost:... κλπ".

    Πως θα "ενεργοποιήσω" το remote object σε αυτή την περίπτωση?

     

    Υ.Γ. Απίστευτος χρόνος απόκρισης... Σε ευχαριστώ πολύ, papadi...

  •  22-08-2006, 10:10 15738 σε απάντηση της 15736

    Απ: Ενσωματώνοντας ένα remote object στο client...

    ακολούθησε αυτό τον οδηγό και θα βρεις ότι χρειάζεσαι:

    http://samples.gotdotnet.com/quickstart/howto/doc/Remoting/mainfeatures.aspx

    Υ.Γ. αν αποφασίσεις να κάνεις την αλλαγή από delphi, προτείνω C#. Αν και η σύνταξη της VB.NET είναι αρκετά πιο σύγχρονη και απλή, η C# είναι πιο αυστηρή και αποφεύγεις προφανή λάθη, ενώ είναι πάντα ένα βήμα μπροστά μια που η Microsoft πρώτη υλοποιεί κάτι σε αυτή και μετά στην VB.NET.
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  22-08-2006, 10:43 15742 σε απάντηση της 15738

    Απ: Ενσωματώνοντας ένα remote object στο client...

     papadi wrote:
    ακολούθησε αυτό τον οδηγό και θα βρεις ότι χρειάζεσαι:
    http://samples.gotdotnet.com/quickstart/howto/doc/Remoting/mainfeatures.aspx

    Θα μελετήσω το link, αν και με πρώτη ματιά δεν βρήκα κάτι που να με βοηθάει... Οι τρόποι ενεργοποίησης του remote object (όπως αναφέρονται στον οδηγό) είναι οι CreateInstance, new και GetObject. Οι δύο πρώτοι μου μου επιστρέφουν τον τύπο του αντικειμένου και όχι αόριστο MarshalByRefObject με αποτέλεσμα να μπερδεύει τα interfaces, ενώ η GetObject μου ζητάει url...

    Μπορώ να φτιάξω μόνος μου ένα proxy και να καλώ το Object από εκεί?

     papadi wrote:

    Υ.Γ. αν αποφασίσεις να κάνεις την αλλαγή από delphi, προτείνω C#. Αν και η σύνταξη της VB.NET είναι αρκετά πιο σύγχρονη και απλή, η C# είναι πιο αυστηρή και αποφεύγεις προφανή λάθη, ενώ είναι πάντα ένα βήμα μπροστά μια που η Microsoft πρώτη υλοποιεί κάτι σε αυτή και μετά στην VB.NET.

    Το λάθος μου όταν ήταν να επιλέξω περιβάλλον ανάπτυξης ήταν ότι περιορίστικα στη δοκιμή VB.Net και Delphi.Net... Εκ των υστέρων συνηδειτοποιώ ότι αν δοκίμαζα και τη λύση της C# ίσως ήταν διαφορετική η επιλογή μου.

    Όταν λέω ότι δεν ξέρω αν θα συνεχίσω να αναπτύσσω σε Delpi.Net, στην άκρη του μυαλού μου έχω τη C#.  

  •  22-08-2006, 17:13 15759 σε απάντηση της 15742

    Απ: Ενσωματώνοντας ένα remote object στο client...

    Η GetObject παίρνει όντως υποχρεωτικά URL, αλλά αν όντως έχεις ένα .exe που κάνει το "server", υπάρχει URL ( ανάλογο με το remoting channel που χρησιμοποιείς ) το οποίο θα κοιτάξει το server του δεύτερου exe σου.

    Μικρό παράδειγμα, που υποθέτει οτι έχεις ένα remoting object implementation ονόματι Hello:

    Πρώτα ο server ...

    public static void Main(string[] args) {

    TcpServerChannel channel = new TcpServerChannel(8086);

    ChannelServices.RegisterChannel(channel);

    RemotingConfiguration.RegisterWellKnownServiceType(

    typeof(Hello),

    "hello",

    WellKnownObjectMode.SingleCall);

    System.Console.ReadLine();

    }

    Αυτό λοιπόν κάνει activate ένα instance που "ακούει" στην πόρτα 8086 στο ocal μηχάνημα ... κι ο client ...

    public static void Main(string[] args){

    ChannelServices.RegisterChannel(new TcpClientChannel());

    Hello obj = (Hello)Activator.GetObject(

    typeof(Hello),

    "tcp://localhost:8086/hello");

    if(null==obj){

    Console.WriteLine("Δε βρηκα άκρη ... ");

    }else {

    obj.SayHello();

    }

    }

    Τώρα βέβαια, αυτό προυποθέτει ότι πρέπει να έχεις ένα δεύτερο exe ή service ή οτιδήποτε "stand-alone" το οποίο δημιουργεί το server object και "ακούει" για κλήσεις.

    Επίσης, ο κώδικας είναι απο μνήμης .. μπορεί και να μην είναι απόλυτα σωστός :P

    Ελπίζω να φάνηκε χρήσιμο το postaki ... :]
    Angel
    O:]
  •  24-08-2006, 11:45 15802 σε απάντηση της 15726

    Απ: Ενσωματώνοντας ένα remote object στο client...

     papadi wrote:

    Δεν είναι απαραίτητο να έχεις IIS για το .net remoting. Αρκεί κάποιο άλλο exe να παίζει το ρόλο του server.

    Έχεις δίκιο.... δεν είναι απαραίτητο να έχεις IIS για το .net remoting. Δεν ξέρω πως μου είχε κολήσει η εντύπωση ότι για να ενεργοποιηθεί το Object μέσω proxy χρειάζεται IIS...

    Διαβάζοντας και το post του angelinio, δοκίμασα τη λύση του "tcp://localhost:...". Παίζει μια χαρά Party!!!

    Μάλιστα το πήγα και ένα βήμα παρακάτω, ορίζοντας το Remote Object και ενεργοποιώντας το από το ίδιο exe... Δείχνει να μην έχει πρόβλημα... 

     anjelinio wrote:

    Ελπίζω να φάνηκε χρήσιμο το postaki ...

    Δεν μπορείς να φανταστείς πόσο anjelinio. Τρεις εβδομάδες πάλευα για να κάνω το αυτονόητο...

    papadi, anjelinio, σας ευχαριστώ πολύ για τη βοήθεια...

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems