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

 

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

Web Services και Custom Objects

Îåêßíçóå áðü ôï ìÝëïò JohnL. Τελευταία δημοσίευση από το μέλος KelMan στις 17-12-2007, 16:09. Υπάρχουν 14 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-12-2007, 01:41 38235

    Web Services και Custom Objects

    Θέλω να φτιάξω ένα webservice method το οποίο να επιστρέφει ένα custom object.

    Το custom αυτό object δηλώνεται με κλάσεις τόσο στο project του web service, όσο και στο project του client που θα το διαβάσει, και είναι το ίδιο και στις δυο περιπτώσεις.

    Όμως το Visual Studio δεν το ξέρει ότι είναι ίδια, και συνεπώς, πρέπει να αντιγράφω ένα ένα τα fields του ενός στο άλλο, π.χ.: 

    Public
    BookCollection As New List(Of Book)
    -----------------

    Dim dbs As New localhost.DBService
    Dim bk1 As New localhost.Book
    bk1 = dbs.GetBook("κάτι")
    Dim bk2 As New Book (αυτό είναι Client.Book)
    bk2.Title = bk1.Title
    bk2.Author = bk1.Author
    ...
    BookCollection.Add(bk2)


    , ή αναγκαστικά να χρησιμοποιήσω παντού στον client κλάσεις του στυλ localhost.κλάση μέσω του reference, κατι το οποίο μου προκαλεί κάποια δυσφορία, και δεν ξέρω αν προτείνεται...

    Public BookCollection As New List(Of localhost.Book)
    -----------------

    Dim dbs As New localhost.DBService
    Dim bk As New localhost.Book
    bk = dbs.GetBook("κάτι")
    BookCollection.Add(bk)


    Γενικά, σε τέτοιες περιπτώσεις τι συνηθίζεται να κάνουμε?
  •  12-12-2007, 01:48 38236 σε απάντηση της 38235

    Απ: Web Services και Custom Objects

    Τί εννοείς? Όταν προσθέτεις ένα web reference σε ένα project δημιουργούνται αυτόματα κλάσεις οι οποίες αντιστοιχούν στις μεθόδους του web service και στα αντικείμενα που επιστρέφουν. Συνεπώς, δεν χρειάζεται εσύ να φτιάξεις τις κλάσεις στον client.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  12-12-2007, 02:01 38237 σε απάντηση της 38236

    Απ: Web Services και Custom Objects

    Ναι, εγώ ξεκίνησα ανάποδα...

    Πρώτα έγραψα τον κώδικα του client, και έφτιαξα ένα πρόγραμμα που διαχειρίζεται πχ. βιβλία τοπικά.

    Μετά αποφάσισα να τα στέλνω σε μια βάση online. Οπότε αντέγραψα τις κλάσεις μου στο Web Service, τις χρησιμοποίησα εκεί για να υλοποιήσω τις διάφορες μεθόδους, και μετά όταν προσέθεσα το web reference στο project του client, συνειδητοποίησα ότι πρέπει να χρησιμοποιώ κλάσεις μεσω αυτού.

    Όμως όλο το τοπικό project βασίζεται στις ίδιες κλάσεις σε όλες τις λειτουργίες του και όχι μόνο στην επικοινωνία με το web service. Άρα θα πρέπει οπουδήποτε χρησιμοποιώ αυτές τις κλάσεις τοπικά να αναφέρομαι στο localhost web service? Μου φαίνεται περιέργο αυτό, και αναρωτιέμαι αν υπάρχει άλλη λύση...

    Ελπίζω τώρα να έγινα περισσότερο κατανοητός... Stick out tongue
  •  12-12-2007, 08:40 38239 σε απάντηση της 38237

    Απ: Web Services και Custom Objects

    Κλασσική απάντηση: Το documentation το κοίταξες?

    Συγκεκριμένα: Αν κοιτάξεις τα properties του web reference θα δεις ότι περιλαμβάνει και τη διεύθυνση του web service καθώς και αν είναι static ή dynamic. Αν βάλεις dynamic η διεύθυνση θα αποθηκευτεί στο app.config. Έτσι θα μπορείς να την αλλάξεις όποτε θέλεις


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  12-12-2007, 15:55 38284 σε απάντηση της 38239

    Απ: Web Services και Custom Objects

    Όχι, δεν εννοούσα ότι μπορεί να θέλω να μεταφέρω αλλού το web service ή να το μετονομάσω.. Σε γενικές γραμμές θέλω να το εξαφανίσω εντελώς...

    Ξεκίνησα ένα τοπικό project το οποίο σε ένα αρχείο Class1.vb ορίζει τις διαφορες κλάσεις που χρησιμοποιεί για την επεξεργασία των δεδομένων.

    Όταν αποφάσισα να φτιάξω και webservice, σκέφτηκα να χρησιμοποιεί για είσοδο-έξοδο και αυτό τα ίδια αντικείμενα. Οπότε πάτησα Add Existing Item... και αντέγραψα το Class1.vb.

    Έφτιαξα ένα function στο web service το οποίο επιστρέφει ας πούμε τύπο Book. Μετά όταν πάω στον client για να λάβω το αποτέλεσμα του client πρέπει να χρησιμοποιήσω το πρόθεμα localhost, ώστε να δει το VS, ότι πρόκειται για τον ίδιο τύπο. Όμως όταν πάω να προσθέσω αυτό στην τοπική συλλογή δεν προστίθεται επειδή η συλλογή είναι List (Of Book) ενώ αυτό που πήρα από το service, και πάω να προσθέσω είναι localhost.Book και δεν προστίθεται προφανώς.

    Άρα πρέπει αναγκαστικά παντού στο τοπικό να χρησιμοποιώ τύπους που έχουν αναφορά στο web service? Γιατί έχω απειρες αναφορές τοπικά που μέχρι τώρα χρησιμοποιούσαν τις κλάσεις τοπικά.
  •  14-12-2007, 12:15 38351 σε απάντηση της 38284

    Απ: Web Services και Custom Objects

    Καμιά απάντηση? Sad

    Μήπως δεν έχω εξηγήσει καλά αυτό που θέλω?
  •  14-12-2007, 13:21 38358 σε απάντηση της 38351

    Απ: Web Services και Custom Objects

    Λοιπόν, όταν δουλεύεις με ένα web service το οποίο σου επιστρέφει data πέραν των strings, integers, κλπ για να απλουστευτεί ο τρόπος που γράφεις τον κώδικά σου χρησιμοποιείς proxies. Μέσω των proxies καμουφλάρουμε την message-based χρήση των services σε ΟΟ-like χρήση και έχουμε πρόσβαση στους τύπους που ορίζονται στα services, με τη διαφορά ότι δεν πρόκειται για τους ίδιους ακριβώς τύπους που έχουμε τοπικά. Ουσιαστικά μέσω του proxy, το service μας επιστρέφει έναν τύπο που μοιάζει με τον τοπικό αλλά έχει μόνο properties, δεν έχει methods γιατί το μόνο που μπορεί να περάσει πάνω από το σύρμα είναι το state του object (αυτό που γίνεται serialize), άρα δεν έχει νόημα να μας περάσει ένα object που έχει methods. Και αυτό είναι κατανοητό αν σκεφτείς ότι αυτό που διακινούν τα web services είναι XML. Τώρα, η τυπική υλοποίηση των web services δεν λαμβάνει υπόψην ότι μπορεί αυτός που καλεί το service να γνωρίζει τον τύπο ενός object που ζητά και αυτό είναι συνεπές με την SOA αρχιτεκτονική που λέει ότι δεν θα πρέπει να υπάρχει depedency μεταξύ web service και web service client. Αν ανακαλύψεις ότι έχεις την ανάγκη για κάτι τέτοιο, τότε η σχεδίαση της εφαρμογής σου φωνάζει ότι είναι προτιμότερο να χρησιμοποιήσεις remoting, ότι δεν χρειάζεσαι πραγματικά web service.

    Tο πρόβλημα είναι ότι τα web services είναι εύκολα στο να τα φτιάξεις και στο να τα κάνεις deploy, οπότε μπορείς να πεις "ναι ρε φίλε, εγώ δεν θέλω να είμαι SOA compliant, θέλω το web service για δικό μου λογαριασμό γιατί με βολεύει" οπότε τότε αντιμετωπίζεις το πρόβλημα που αναφέρεις. Για να το λύσεις πρέπει να ψάξεις για "web service type sharing". Δεν είναι κάτι που γίνεται απλά (καθώς o proxy generator μέσα από το Visual Studio UI δεν είχε σχεδιαστεί να κάνει type sharing) αλλά γίνεται αν ξεχάσεις το κλίκι-κλίκι και δουλέεις από το Visual Studio command line prompt. Όμως, αν παίξεις με Visual Studio 2008 και WCF υπάρχει ένα μαγικό checkbox που ενεργοποιείς το type sharing και επιλέγεις ποιοί τύποι είναι κοινοί.


    Vir prudens non contra ventum mingit
  •  14-12-2007, 16:16 38363 σε απάντηση της 38358

    Απ: Web Services και Custom Objects

    Μάλιστα! Τώρα κατάλαβα! Ψάχνοντας, βρήκα αυτό το sample το οποίο αν κατάλαβα καλά λύνει το πρόβλημα?

    http://blogs.msdn.com/rjacobs/archive/2006/09/03/738142.aspx

    Γράφω όμως τον κώδικα και μου προκύπτει πρόβλημα:
    Class 'CustomerDataContract' must implement 'Property Name() As String' for interface 'ICustomerDataContract'. Implementing property must have matching 'ReadOnly' or 'WriteOnly' specifiers. Δεν καταλαβαίνω όμως γιατί... Μπορεί κάποιος να μου εξηγήσει?  
    Άκυρο, το έλυσα μόνος μου Smile

    Δεν καταλαβαίνω όμως αν μπορεί τελικά η συγκεκριμένη λύση να με βοηθήσει σε αυτό που θέλω... Μπορείτε να με βοηθήσετε?

  •  15-12-2007, 01:28 38369 σε απάντηση της 38363

    Απ: Web Services και Custom Objects

    Mmmmm... Έψαξες για "web service share types" και βρήκες το παραπάνω; Κοίτα αυτά που τα βρήκα με μια απλή αναζήτηση:

    http://dotnetjunkies.com/QuickStartv20/webservices/doc/TypeSharing.aspx

    http://weblogs.asp.net/israelio/archive/2005/01/04/346337.aspx

     


    Vir prudens non contra ventum mingit
  •  15-12-2007, 02:42 38373 σε απάντηση της 38369

    Απ: Web Services και Custom Objects

    Συγκεκριμένα βρήκα αυτό το θέμα το οποίο αναφέρει το λινκ που έδωσα...  http://www.dotnetzone.gr/cs/forums/2/16737/ShowThread.aspx
     
    Τη λύση μέσω κονσόλας την είχα δει, απλά κοίταξα μήπως υπάρχει και δυνατότητα να γίνει από το UI... Πάντως δεν κατάλαβα εντελώς το wsdl.exe... Έδωσα

    WSDL /l:VB /sharetypes http://localhost:2778/Service1.asmx?wsdl "file://D:\Visual Studio 2005\Projects\Client\Client\Web References\localhost\Service1.wsdl"

    και μου εβγαλε ένα αρχείο DBService.vb (το όνομα του service μου). Αυτό απότι είδα είναι αντίστοιχο του localhost/Reference.vb...

    Το έβαλα στη θέση του localhost/Reference.vb, αλλά δείχνει ότι δεν περιέχει τους μισούς μου τύπους Tongue Tied... Τι γίνεται?

    Ξέρετε πώς να το χρησιμοποιήσω?

  •  15-12-2007, 09:40 38374 σε απάντηση της 38373

    Απ: Web Services και Custom Objects

    Όχι, το link που αναφέρεις είναι μεν σχετικό αλλά δεν είναι αυτό που χρειάζεσαι. Για το τι κάνει το WSDL.EXE και την σύνταξη του, κοίτα στο MSDN. Από εκεί και πέρα, όταν λες ότι δεν περιέχει τους τύπους σου, μην εκπλήσσεσαι, αφού αυτό ακριβώς θες, να μην περιέχονται. Το DBService.vb είναι σωστό, ωστόσο θα πρέπει να μετακινήσεις τους τύπους σου σε ένα νέο assembly που θα το κάνουν reference τόσο το web service όσο και ο client και φυσικά θα συπεριλαμβάνεται αντίστοιχα στο deployment του web service και του client.


    Vir prudens non contra ventum mingit
  •  15-12-2007, 15:01 38377 σε απάντηση της 38374

    Απ: Web Services και Custom Objects

    Λοιπόν, μετά από άπειρες δοκιμές και ότι μπακάλικο μπορούσα να φανταστώ τα κατάφερα! Stick out tongue

    Το αρχείο που έφτιαχνε το wsdl.exe, περιείχε και αυτό μερικές μόνο από τις κλάσεις μου (κάτι που υποθέτω δε θα έπρεπε να γίνεται)... Πάντως το άνοιξα και χειροκίνητα τις έσβησα, οπότε πλέον λειτουργεί απροβλημάτιστα (προς το παρόν)..

    Μου φαίνεται πολύ περίεργος ο συγκεκριμένος τρόπος, αλλά έχω κουραστεί να ασχολούμαι με το συγκεκριμένο οπότε δε θα το ψάξω παραπέρα.. Αν έχετε καμιά ιδέα πάντως πολύ θα ήθελα να μάθω..

    Ευχαριστώ για τη βοήθεια!
  •  17-12-2007, 00:34 38419 σε απάντηση της 38377

    Απ: Web Services και Custom Objects

    Το πρόβλημα σου είναι ότι επιμένεις να κάνεις τα web services να δουλέψουν με τον τρόπο που νομίζεις ότι δοουλεύουν, όχι όπως δουλεύουν πραγματικά. Είναι σαν να επιμένεις να οδηγήσεις τραίνο όπως οδηγείς αυτοκίνητο. Αν επιμείνεις να χρησιμοποιείς τα web services με αυτό τον τρόπο, θα αντιμετωπίσεις πολλές δυσκολίες και στο μέλλον. Θα πρέπει να καταλάβεις πρώτα πως λειτουργούν τα web services γενικά, όχι μόνο στο .NET. Ο Kelman σου έδωσε μία αρκετά καλή περιγραφή για το πως το .NET σου επιτρέπει να κάνεις τις κλήσεις και για τα proxies. Κοίτα και τα άρθρα του MSDN για να καταλάβεις καλύτερα πως δουλεύουν τα web services αλλά και πως μπορείς να επηρεάσεις τα proxies χωρίς να καταφύγεις σε επικίνδυνες επεμβάσεις με το χέρι. Έχε υπόψη επίσης ότι τα web services είναι φτιαγμένα για να επικοινωνούν διαφορετικά λειτουργικά συστήματα και γλώσσες μεταξύ τους. Δεν είναι δυνατόν να χρησιμοποιήσεις τον ίδιο τύπο και στον server και στον client. Ο τύπος που θα χρησιμοποιήσεις στον καθένα θα είναι εξ ορισμού διαφορετικός.

    Ίσως να μπερδεύεσαι επειδή έχεις υπόψη τον τρόπο που δούλευε το COM+ ή το .NET Remoting, όπου φαινόταν ότι είχες τον ίδιο τύπο και στον client και στον server. Λέω φαίνεται, γιατί σε πολλές περιπτώσεις αυτό που έβλεπε ο client ήταν proxies τα οποία σε έκαναν να νομίζεις ότι είχες τον ίδιο τύπο και στον client και στο server.
    Στα web services ΔΕΝ ΥΠΑΡΧΟΥΝ κοινοί τύποι. Αυτό δεν είναι έλλειψη, αλλά η διαπίστωση ότι οι παλαιότερες τεχνολογίες είχαν σοβαρά προβλήματα συνεργασίας μεταξύ των διαφόρων εφαρμογών. Επίσης, μία καλή σχεδίαση API για ένα server σπάνια είναι και καλή σχεδίαση API για client. Με άλλα λόγια, σπάνια χρησιμοποιεί κανείς τους τύπους του sever στον client όπως είναι.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-12-2007, 13:44 38426 σε απάντηση της 38419

    Απ: Web Services και Custom Objects

    Και τότε γιατί συζητάμε για type sharing, αν δεν ήταν κάτι που υπάρχει και γίνεται? Για να το κάνει και το VS 2008 ως νέο feature, προφανώς δεν είμαι ο μόνος που το κάνει...

    Δεν αντιλέγω ότι ίσως να μην είμαι 100% έγκυρος με τις προδιαγραφές των web services, αλλά αυτή τη στιγμή με ενδιαφέρει περισσότερο να έχω μια λειτουργική λύση, παρά να φροντίσω για τη συμβατότητα της εφαρμογής μου.
  •  17-12-2007, 16:09 38435 σε απάντηση της 38426

    Απ: Web Services και Custom Objects

    Άλλο πράγμα αν υπάρχει και γίνεται και άλλο πράγμα αν θα πρέπει να γίνεται Smile Δεν κουβεντιάσαμε για τον σωστό τρόπο, έτσι δεν είναι; Και στο Visual Studio 2008 μπήκε ως feature ακριβώς γιατί πολλοί developers θέλουν να "βολευτούν" εύκολα και γρήγορα μη λαμβάνοντας υπόψην την ευρύτερη αρχιτεκτονική που διέπει τα web services. Είναι καλό ή κακό αυτό; Ο χρόνος θα δείξει. Είναι σπουδαίο πράγμα η ευκολία που αναφέραμε, αυτή όμως αποδεικνύεται καλή μόνο όσο υπάρχει συναίσθηση του τι έχεις κάνει (και τι δεν μπορείς να κάνεις από την στιγμή που θα πάρεις αυτόν τον δρόμο). Αν έχεις φτιάξει εν γνώσει σου ένα "distributed" σύστημα που όμως ουσιαστικά αυτό-περιορίζεται έχει καλώς, ξέρεις ότι στο μέλλον αν σου ζητήσουν να έχει πρόσβαση ένας μη-.NET client θα πρέπει να ξαναγράψεις πολλά τμήματα του κώδικα. Φαντάσου όμως να μην το ξέρεις. Φαντάσου να λες "Τι θέλετε; Java client; Φυσικά, σε έναν μήνα θα είναι έτοιμο, έχω χρησιμοποιήσει web services και δεν μασάω". Θα είναι πολύ mythical αυτός ο μήνας...


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