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

 

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

.ΝΕΤ Services and FLEX

Îåêßíçóå áðü ôï ìÝëïò Oldgeorge. Τελευταία δημοσίευση από το μέλος Oldgeorge στις 03-04-2008, 13:25. Υπάρχουν 0 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  03-04-2008, 13:25 41283

    .ΝΕΤ Services and FLEX

    Καλημέρα σε όλους,  πρόσφατα (βλ. χθες αρκετά μετά τα μαύρα μεσάνυχτα) έπεσα σε πάνω σε μια αρκετά παράξενη συμπεριφορά των .Net Services και αναρωτίεμαι αν κανείς μπορεί να μου δώσει κάποια καλύτερη εξήγηση από το "αφού δουλεύει μην σε νοιάζει, πήγαινε για ύπνο :)"

    Το σενάριο είναι το εξής: υπάρχουν κάποιες asp.net εφαρμογές (2.0) που δουλεύουν μια χαρά εδώ και καιρό και αποφασίστηκε ότι ένα από τα επόμενα βήματα είναι να φτιαχτεί ένα dashboard που να συγκεντρώνει πληροφορίες από διάφορα σημεία και να τις παρουσιάζει με όμορφα χρωματάκια και λοιπά χαρωπά.  Για λόγους που δεν ενδιαφέρουν (βλ. ο γράφων έκανε τον ασιάτη όταν τέθηκε το ερώτημα ποιος θα το κάνει) αποφασίστηκε να χτιστεί σε Flex 2.0, όποτε κλήθηκα να λύσω το θέμα τις μεταφοράς των δεδομένων εκεί.

    Η πρώτη quick & dirty λύση του να κάνω serialize τα object instances που χρειάζεται η εφαρμογή και να τα κάνω serve μέσα από ένα .ashx δεν στέφθηκε με ιδιαίτερη επιτυχία, γιατί όπως αποκάλυψε το documentation της Adobe και το googling υπάρχει κάποιο θέμα στον τρόπο που γίνεται το default xml serialization του .net και σε αυτά που καταλαβαίνει ο Flex dataprovider. Ευτυχώς, υπάρχουν διάφορες λύσεις σε αυτό, οι περισσότερες εκ των οποίων περιλαμβάνουν αρκετό actionscript, όπως βέβαια και το σενάριο να φτιάξει κανείς τον δικό του xml serializer για να βγαίνει σε μια μορφή που να είναι συμβατή με αυτά που καταλαβαίνει το Flex.  Ακολουθώντας αυτή την οδό, το .ashx κατέληξε να παράγει ένα xml document με το εξής schema:

    <root>
             <Report>
                           <Day value="xx">
                                  <Point ID="xx>
                                            <Property 1>
                                            <Property 2>

    κ.ο.κ

    και κάνοντας χρήση ενός HTTP service declaration στο FLEX σαν αυτό:

                <mx:HTTPService

                    id="statsRequestHTTP"

                    url="http://hell.org/tracker/export.ashx"

                    useProxy="false">

                </mx:HTTPService>

     

    μπορούσα να κάνω access τα δεδομένα με την παρακάτω δήλωση dataProvider="{statsRequestHTTP.lastResult.root.Report.Day.Point}" και όλα μια χαρά.

     

    Βέβαια λόγο του όγκου και της πιθανής μεταβολής των αντικειμένων των εφαρμογών που παρέχουν τα δεδομένα, η λύση του custom xml serializer δεν είναι πολύ κάλή, οπότε αφού έγινε το πρώτο βήμα προχωρήσαμε στην ιδέα της χρήσης webservices που κάνουν expose κάποια ενδοιάμεσα αντικείμενα με τελική μορφή παρεμφερή με αυτή του .ashx με τις προβλεπόμενες διαφοροποιήσεις (βασικά, η μοναδική διαφορά είναι ότι αντί για <root>  έχουμε <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org">. Κατά τα άλλα τα ίδια.

     

    Στο FLEX το service δηλώνεται ως εξής:

     

                <mx:WebService id="statsRequestWS"

                    wsdl="http://hell.org/tracker/bulkexport.asmx?wsdl"

                    useProxy="false">

                            <mx:operation name="Export2">

                                        <mx:request>

                                                    <parameter1>dsfjksdjs</parameter>

                                        </mx:request>

               </mx:operation>

     

    Βάση του documentation και του προηγουμένου παραδείγματος περίμενα να μπορώ να κάνω access τα δεδομένα με dataProvider="{statsRequestWS.lastResult.root.Report.Day.Point}" ή έστω στην χειρότερη dataProvider="{statsRequestWS.lastResult}" και να κάνω fully qualify τα fieldnames (π.χ. αντί για <mx:DataGridColumn headerText="Property1" dataField="Property1"/> το <mx:DataGridColumn headerText="Property1" dataField="Report.Day.Point.Property1"/>). Δυστυχώς, τίποτα από τα δυο δεν έφερε αποτέλεσμα. Το άκρως παράξενο είναι ότι λίγο πριν τα παρατήσω και κάνω αυτό που προτείνει το documentation (μεταφορά των .Net proxy objects σε Flex Arraylists πριν  περάσουν από τον dataProvider) από κάποια τυχαία συγκυρία ανακάλυψα ότι το dataProvider="{statsRequestWS.lastResult.Day}" δουλεύει μια χαρά χωρίς κανένα πρόβλημα. Αυτό που δεν μπορώ να καταλάβω είναι αφ'ενός γιατί δουλεύει (το documentation υποστηρίζει ότι κάτι τέτοιο δεν είναι εφικτό στο Flex 2.0 μόνο στο 3.0 beta) και γιατί ad hoc χρειάζεται αναφορά στο συγκεκριμένο node.  Άλλος συνάδελφος που έχει αρκετή εμπειρία σε Flex/Java εφαρμογές ισχυρίζεται ότι η πηγή του προβλήματος είναι το WSDL definition που κάνει το .Net το οποίο δεν είναι συμβατό με τα στάνταρ και γι'αυτό έχουμε αυτό το non-deterministic behavior στους consumers.

    Έχει κανείς πιο σοφός και διαβασμένος από μένα καμιά ιδέα γιατί συμβαίνει αυτό;

    Και μια και διαβάσατε μέχρι εδώ, έχει κανείς δουλέψει επιτυχώς με Flex και .Net Web Services σε περιβάλλον παραγωγής; Υπάρχει καμιά άποψη σχετικά με την χρηστικότητα του WebOrb?

     


    The people of the straight land have really got it made, a warm friendly sleep from the craddle to the grave
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems