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

 

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

Προσθήκη φίλτρου συμπίεσης σε web services

Îåêßíçóå áðü ôï ìÝëïò Χρήστος Γεωργακόπουλος. Τελευταία δημοσίευση από το μέλος Χρήστος Γεωργακόπουλος στις 31-01-2006, 11:15. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  30-01-2006, 21:23 9042

    Προσθήκη φίλτρου συμπίεσης σε web services

    Η επικοινωνία με τα web services παρουσιάζει πολλές φορές προβλήματα λόγου του όγκου των δεδομένων που ανταλλάσσονται. Όταν ένας client ζητά μια μεγάλη ποσότητα δεδομένων, σε πολλές περιπτώσεις η κοινή πρακτική είναι να επιστρέψουμε ένα dataset με τα δεδομένα που ζήτησε. Το dataset όμως γίνεται serialized σε xml και τα προβλήματα αρχίζουν, καθώς ο όγκος της xml που περιγράφει το dataset είναι πολλές φορές μεγάλος.

    Υπάρχουν τεχνικές συμπίεσης των δεδομένων σε επίπεδο web method. Ο client ζητά τα δεδομένα, τα παίρνουμε από τη βάση, τα συμπιέζουμε και επιστρέφουμε πίσω ένα array από bytes. Αυτό όμως απαιτεί αλλαγές στον κώδικα για κάθε web method, εξαφανίζει ουσιαστικά τον τύπο των δεδομένων (επιστρέφει πλέον bytes αντί του dataset ή typed dataset) (μιλάμε για .net 1.1), ενώ απαιτεί αλλαγές και στον κώδικα του client προκειμένου να αποσυμπιέσει τα bytes που παραλαμβάνει.

    Ο DaberElay στο άρθρο του "Adding a zip filter to web services", προσεγγίζει το θέμα από μια άλλη οπτική γωνία, χρησιμοποιώντας προς όφελός του τη δυνατότητα των WSE να περνάνε τα soap messages από φίλτρα πριν φτάσουν στον τελικό προορισμό τους.

    Η τεχνική που περιγράφει δημιουργεί στην ουσία ένα φίλτρο συμπίεσης και ένα αποσυμπίεσης, και ορίζει τη χρήση τους με μια απλή δήλωση μέσα στο configuration αρχεία του server και του client. Η ιδέα είναι πολύ καλή, ο κώδικας λίγος, ενώ αν αποφασίσετε να το χρησιμοποιήσετε θα κατανοήσετε καλύτερα πολλά θέματα γύρω από την επικοινωνία των web services και τα WSE.

    Αν έχετε απορίες ή προβλήματα στην υλοποίηση... εδώ είμαστε...

    http://www.codeproject.com/cs/webservices/WebServiceZipFilter.asp


    Χρήστος Γεωργακόπουλος
  •  31-01-2006, 10:21 9055 σε απάντηση της 9042

    Απ: Προσθήκη φίλτρου συμπίεσης σε web services

    Πολύ ενδιαφέρον Χρήστο! Εδώ και καιρό αναρωτιόμουν αν γινόταν αυτό, γιατί υπάρχουν όντως περιπτώσεις όπου το εξερχόμενο XML είναι τέρας. Πραγματικά πολύ χρήσιμο για τις εφαρμογές στις οποίες έχεις τη δυνατότητα να φτιάξεις και τον Server και τον Client.

    Το πρόβλημα όμως εξακολουθεί να υφίσταται στην περίπτωση όπου είσαι υπεύθυνος μόνο για το Server κομμάτι (τα Web Services δηλαδή). Τότε με αυτό τον τρόπο ψιλο-υποχρεώνεις τους client να φτιαχτούν σε .NET (εκτός κι αν το ψάξουν ΠΑΡΑ ΠΟΛΥ).

    Ξέρει όντως κανείς αν έχει βρεθεί καμιά λύση για αυτό με στόχο τη διαλειτουργικότητα; Ομολογώ ότι δεν κατέχω από WS-*, οπότε μπορεί να ορίζεται κάτι εκεί. Έστω κάτι που να μπορείς ένα μύνημα να το χωρίσεις σε περισσότερα (χωρίς βέβαια να το κάνεις manually);

    Και πάλι πάντως το post ήταν πολύ βοηθητικό και ελπίζω να το αξιοποιήσω κάπου :)!
    Στερνή μου γνώση να σε είχα πρώτα...
  •  31-01-2006, 11:15 9057 σε απάντηση της 9055

    Απ: Προσθήκη φίλτρου συμπίεσης σε web services

    Κοίτα, στην ουσία παίρνεις τα περιεχόμενα του SOAP (την xml με τα δεδομένα σου δηλαδή), τα συμπιέζεις με gzip και τα βάζεις σαν attachment. Ο client μπορεί να κάνει την αντίστροφη διαδικασία χωρίς να απαιτείται .net, έχει να παίζει μόνο με SOAP και gzip. Η διαδικασία είναι αρκετά απλή και εκτός .net.

    Επιπλέον, μπορείς να ορίσεις ότι αν ο client θέλει τα δεδομένα του συμπιεσμένα, να σου βάζει ένα header στο request. Έτσι, όποιος έχει υλοποιήσει την αποσυμπίεση μπορεί να ζητά συμπιεσμένα δεδομένα και όποιος δεν το έχει κάνει ακόμα μπορεί να συνεχίσει να δουλεύει όπως πριν. Οπότε μπορεί να προστεθεί ανώδυνα σε production περιβάλλον που βρίσκεται ήδη σε λειτουργία.


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