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

 

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

Web Service - Customization της proxy class που δημιουργεί το VS

Îåêßíçóå áðü ôï ìÝëïò Dimitris Papadimitriou. Τελευταία δημοσίευση από το μέλος Dimitris Papadimitriou στις 12-03-2007, 13:25. Υπάρχουν 20 απαντήσεις.
Σελίδα 2 από 2 (21 εγγραφές)   < 1 2
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  26-09-2006, 11:22 17221 σε απάντηση της 17214

    Απ: Web Service - Customization της proxy class που δημιουργεί το VS

     papadi wrote:

    Όχι ακριβώς. Το VS δεν δημιουργεί proxy class για το dataset. Και αυτή είναι η αποροία μου. Με πιο κριτήριο δεν τη δημιουργεί, ενώ δημιουργεί proxy class για το δικό μου class. Έψαξα τα attributes του dataset (reflector) αλλά δεν βρήκα κάτι. Ως αποτέλεσμα το dataset παραμένει System.Data.DataSet ενώ η δική μου class από MyAssembly.MyClass γίνεται ProxyWebServiceName.MyClass.

    Ελπίζω να είναι κατανοητό τώρα...



    Επειδή η ερώτησή σου είναι πολύ ενδιαφέρουσα, και επειδή ήταν άλλη μια ευκαιρία να σκαλίσω τα internals του .NET με το Reflector, παράτησα τη δουλειά μου και το έψαξα λίγο...
    Από όλα όσα είδα, κατέληξα ότι αυτό που κάνει τη διαφορά είναι ότι το DataSet υλοποιεί το IXmlSerializable. Αν δείς το WSDL για μια Web method που έχει παράμετρο τύπου DataSet, αυτή καταλήγει σε ένα <s:element ref="s:schema"/>.
    Βέβαια αυτό είναι ένα "διαισθητικό" συμπέρασμα, αλλά έχω καλή διαίσθηση Smile.


    Νατάσα Μανουσοπούλου
  •  26-09-2006, 15:13 17235 σε απάντηση της 17221

    Απ: Web Service - Customization της proxy class που δημιουργεί το VS

    μμμ... ευχαριστώ καταρχήν για την βοήθεια...
    Σίγουρα κάτι παίζει με το IXmlSerializable. Όταν προσπάθησα να το υλοποιήσω αφήνοντας την getschema να επιστρέφει null (nothing στην VB) το αποτέλεσμα ήταν να θεωρείσει την custom κλάση μου DataSet!!! Οπότε η proxy class που δημιουργήθηκε επέστρεφε DataSet!
    Public Class MyObject
        Implements IXmlSerializable

        Public Text As String

        Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema
            Return Nothing
        End Function

        Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml
            '
        End Sub

        Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml
            '
        End Sub

    End Class

    Και στο documentation, για την IXmlSerializable.GetSchema αναφέρει:

    When serializing or deserializing an object, the XmlSerializer class does not do XML validation. For this purpose, it is safe to provide a trivial implementation of this method, for example by returning a null reference (Nothing in Visual Basic).

    This method is called by the WebServiceUtil.exe utility when generating a proxy for your class to be consumed by a Web service client. For this purpose, it is essential that the method return an accurate XML schema that describes the XML representation of your object generated by the WriteXml method.

    Τώρα τι στο καλό πρέπει να βάλω εκεί μέσα για να καταφέρει το custom object μου να μείνει ως έχει από το webserviceutil... άλλο θέμα!


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

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

    Απ: Web Service - Customization της proxy class που δημιουργεί το VS

    Α, πολύ ωραία, έτσι εξηγείται, εγώ δοκίμαζα με typed dataset...

    Πάντως, απ'ότι φαίνεται, απλά με το implementation του IXmlSerializable δεν το γλυτώνεις το πείραγμα του Reference.vb με το χέρι καθώς το wsdl.exe παίρνει την πρωτοβουλία και στο proxy class αλλάζει το signature του web method ώστε να επιστρέφει DataSet! Στην αρχή νόμιζα ότι αυτό οφείλονταν σε κάποιο είδος custom λογικής με την οποία δουλεύει το tool, κάτι του τύπου "αν ο τύπος υποστηρίζει IXmlSerializble είναι DataSet". Ωστόσο ψάχνοντας, βρήκα ότι τελικά δεν συμβαίνει κάτι τέτοιο και η μαγική φράση είναι "Schema Import Extensions"!

    Στο .NET 2.0 όταν παράγεται ένα web service proxy (με οποιαδήποτε μέθοδο - wsdl.exe, "Add web reference", κλπ) η δουλειά γίνεται από τα λεγόμενα "Schema Import Extensions" τα οποία ουσιαστικά παράγουν το source του proxy (Reference.vb/Reference.cs). Μάλιστα, πρόκειται για έναν plug-in μηχανισμό που ελέγχεται μέσω του Machine.Config, ενώ υπάρχουν τρεις υλοποιήσεις της base class οι (surprise-surprise) System.Data.DataSetSchemaImporterExtension, System.Data.Design.TypedDataSetSchemaImporterExtension και System.Data.SqlTypes.SqlTypesSchemaImporterExtensionHelper Wink Μπορείς λοιπόν να γράψεις τον δικό σου Schema Importer ο οποίος να συμπεριφέρεται όπως πρέπει στις κλάσεις σου. Ρίξε μια ματιά εδώ: http://msdn2.microsoft.com/en-us/library/system.xml.serialization.advanced.schemaimporterextension.aspx, τα εξηγεί όλα και στο τέλος έχει και technology sample.

     


    Vir prudens non contra ventum mingit
  •  26-09-2006, 23:58 17272 σε απάντηση της 17256

    Απ: Web Service - Customization της proxy class που δημιουργεί το VS

    ! Φαίνεται πως αυτή είναι η λύση ! Κατέβασα και το technology sample. Κάνει αυτό ακριβώς με το wsdl.exe

    Μένει να το προσπαθήσω σε πραγματικό web service! Θα σας πω το αποτέλεσμα!


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  12-03-2007, 12:16 26325 σε απάντηση της 17272

    Απ: Web Service - Customization της proxy class που δημιουργεί το VS

    Δημήτρη τι έκανες με το θέμα ;

    Έπαιξε ;


    Πάνος Αβραμίδης
  •  12-03-2007, 13:25 26329 σε απάντηση της 26325

    Απ: Web Service - Customization της proxy class που δημιουργεί το VS

    Η λύση φαίνεται πως βρίσκεται στο παραπάνω post του kelman. Φαίνεται πως η MS δεν έκανε πολύ καλή δουλειά σε αυτό το σημείο και κατέληξα στο ότι δεν αξίζει να προσπαθήσω να το λύσω με αυτή την μέθοδο. Προς το παρόν κάνω μόνος μου serialization/deserialization των παραμέτρων μου από/προς byte array και περνάω πάντα αυτό ως όρισμα. Ήθελα να το δοκιμάσω και σε WCF για να δω πως λειτουργεί αυτό σε αυτό το θέμα αλλά δεν πρόλαβα ακόμα. Ας ελπίσουμε ότι εκεί έχει γίνει καλύτερη δουλειά!
     


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
Σελίδα 2 από 2 (21 εγγραφές)   < 1 2
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems