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

-
Μέλος από τις 28-08-2005
-
Αθήνα
-
Δημοσιεύσεις 101
-
-
|
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
|
|
Απ: Web Services και Custom Objects
Τί εννοείς? Όταν προσθέτεις ένα web reference σε ένα project δημιουργούνται αυτόματα κλάσεις οι οποίες αντιστοιχούν στις μεθόδους του web service και στα αντικείμενα που επιστρέφουν. Συνεπώς, δεν χρειάζεται εσύ να φτιάξεις τις κλάσεις στον client.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
12-12-2007, 02:01
|
-
JohnL
-
-

-
Μέλος από τις 28-08-2005
-
Αθήνα
-
Δημοσιεύσεις 101
-
-
|
Απ: Web Services και Custom Objects
Ναι, εγώ ξεκίνησα ανάποδα... Πρώτα έγραψα τον κώδικα του client, και έφτιαξα ένα πρόγραμμα που διαχειρίζεται πχ. βιβλία τοπικά. Μετά αποφάσισα να τα στέλνω σε μια βάση online. Οπότε αντέγραψα τις κλάσεις μου στο Web Service, τις χρησιμοποίησα εκεί για να υλοποιήσω τις διάφορες μεθόδους, και μετά όταν προσέθεσα το web reference στο project του client, συνειδητοποίησα ότι πρέπει να χρησιμοποιώ κλάσεις μεσω αυτού. Όμως όλο το τοπικό project βασίζεται στις ίδιες κλάσεις σε όλες τις λειτουργίες του και όχι μόνο στην επικοινωνία με το web service. Άρα θα πρέπει οπουδήποτε χρησιμοποιώ αυτές τις κλάσεις τοπικά να αναφέρομαι στο localhost web service? Μου φαίνεται περιέργο αυτό, και αναρωτιέμαι αν υπάρχει άλλη λύση... Ελπίζω τώρα να έγινα περισσότερο κατανοητός...
|
|
-
12-12-2007, 08:40
|
|
Απ: 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
|
-
JohnL
-
-

-
Μέλος από τις 28-08-2005
-
Αθήνα
-
Δημοσιεύσεις 101
-
-
|
Απ: 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
|
-
JohnL
-
-

-
Μέλος από τις 28-08-2005
-
Αθήνα
-
Δημοσιεύσεις 101
-
-
|
Απ: Web Services και Custom Objects
Καμιά απάντηση?  Μήπως δεν έχω εξηγήσει καλά αυτό που θέλω?
|
|
-
14-12-2007, 13:21
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: 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
|
-
JohnL
-
-

-
Μέλος από τις 28-08-2005
-
Αθήνα
-
Δημοσιεύσεις 101
-
-
|
Απ: 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. Δεν καταλαβαίνω όμως γιατί... Μπορεί κάποιος να μου εξηγήσει? Άκυρο, το έλυσα μόνος μου 
Δεν καταλαβαίνω όμως αν μπορεί τελικά η συγκεκριμένη λύση να με βοηθήσει σε αυτό που θέλω... Μπορείτε να με βοηθήσετε?
|
|
-
15-12-2007, 01:28
|
-
15-12-2007, 02:42
|
-
JohnL
-
-

-
Μέλος από τις 28-08-2005
-
Αθήνα
-
Δημοσιεύσεις 101
-
-
|
Απ: 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, αλλά δείχνει ότι δεν περιέχει τους μισούς μου τύπους  ... Τι γίνεται? Ξέρετε πώς να το χρησιμοποιήσω?
|
|
-
15-12-2007, 09:40
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: 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
|
-
JohnL
-
-

-
Μέλος από τις 28-08-2005
-
Αθήνα
-
Δημοσιεύσεις 101
-
-
|
Απ: Web Services και Custom Objects
Λοιπόν, μετά από άπειρες δοκιμές και ότι μπακάλικο μπορούσα να φανταστώ τα κατάφερα!  Το αρχείο που έφτιαχνε το wsdl.exe, περιείχε και αυτό μερικές μόνο από τις κλάσεις μου (κάτι που υποθέτω δε θα έπρεπε να γίνεται)... Πάντως το άνοιξα και χειροκίνητα τις έσβησα, οπότε πλέον λειτουργεί απροβλημάτιστα (προς το παρόν).. Μου φαίνεται πολύ περίεργος ο συγκεκριμένος τρόπος, αλλά έχω κουραστεί να ασχολούμαι με το συγκεκριμένο οπότε δε θα το ψάξω παραπέρα.. Αν έχετε καμιά ιδέα πάντως πολύ θα ήθελα να μάθω.. Ευχαριστώ για τη βοήθεια!
|
|
-
17-12-2007, 00:34
|
|
Απ: 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
|
-
JohnL
-
-

-
Μέλος από τις 28-08-2005
-
Αθήνα
-
Δημοσιεύσεις 101
-
-
|
Απ: Web Services και Custom Objects
Και τότε γιατί συζητάμε για type sharing, αν δεν ήταν κάτι που υπάρχει και γίνεται? Για να το κάνει και το VS 2008 ως νέο feature, προφανώς δεν είμαι ο μόνος που το κάνει...
Δεν αντιλέγω ότι ίσως να μην είμαι 100% έγκυρος με τις προδιαγραφές των web services, αλλά αυτή τη στιγμή με ενδιαφέρει περισσότερο να έχω μια λειτουργική λύση, παρά να φροντίσω για τη συμβατότητα της εφαρμογής μου.
|
|
-
17-12-2007, 16:09
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: Web Services και Custom Objects
Άλλο πράγμα αν υπάρχει και γίνεται και άλλο πράγμα αν θα πρέπει να γίνεται Δεν κουβεντιάσαμε για τον σωστό τρόπο, έτσι δεν είναι; Και στο Visual Studio 2008 μπήκε ως feature ακριβώς γιατί πολλοί developers θέλουν να "βολευτούν" εύκολα και γρήγορα μη λαμβάνοντας υπόψην την ευρύτερη αρχιτεκτονική που διέπει τα web services. Είναι καλό ή κακό αυτό; Ο χρόνος θα δείξει. Είναι σπουδαίο πράγμα η ευκολία που αναφέραμε, αυτή όμως αποδεικνύεται καλή μόνο όσο υπάρχει συναίσθηση του τι έχεις κάνει (και τι δεν μπορείς να κάνεις από την στιγμή που θα πάρεις αυτόν τον δρόμο). Αν έχεις φτιάξει εν γνώσει σου ένα "distributed" σύστημα που όμως ουσιαστικά αυτό-περιορίζεται έχει καλώς, ξέρεις ότι στο μέλλον αν σου ζητήσουν να έχει πρόσβαση ένας μη-.NET client θα πρέπει να ξαναγράψεις πολλά τμήματα του κώδικα. Φαντάσου όμως να μην το ξέρεις. Φαντάσου να λες "Τι θέλετε; Java client; Φυσικά, σε έναν μήνα θα είναι έτοιμο, έχω χρησιμοποιήσει web services και δεν μασάω". Θα είναι πολύ mythical αυτός ο μήνας...
Vir prudens non contra ventum mingit
|
|
|
|
|