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

 

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

WCF problem.

Îåêßíçóå áðü ôï ìÝëïò Τάσκος Γιώργος. Τελευταία δημοσίευση από το μέλος Τάσκος Γιώργος στις 11-06-2009, 17:53. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  10-06-2009, 20:40 51527

    WCF problem.

    Καλησπέρα, συνεχίζοντας από το συγκεκριμένο post, και αφού όντως λύθηκε,
    και όντως δουλεύει, έχω ένα άλλο πρόβλημα τώρα.

    Δεν είχα επισημάνει ότι το object που θέλω να κάνω Equality check είναι επίσης και [DataContract].

    Και ο έλεγχος αυτός πρέπει να γίνεται στον Client που κάνει consume το WCF Service και τραβάει τέτοιου
    τύπου δεδομένα.

    Παρατήρησα όμως ότι στον Client γινότανε πάλι Equality check by Reference και όχι
    όπως δουλεύει στον "Server" αφου το δοκίμασα, και όντως λειτουργεί κανονικά.

    Βλέπω ότι τα Generated Proxy Classes δεν κάνουν όντως Implement το IEquatable<T>.
    Και πως να το κάνουν αφού στο Serializing καταλαβαίνω ότι δεν παίρνουν μέρος οι μεθόδοι.

    Μου διαφεύγει κάτι που δεν ξέρω?

    Ποια είναι η λύση που προτείνει το community σε μια τέτοια περίπτωση? Partial class?
    Implement μια ακόμα ίδια class και μπλέξιμο με copy κτλ?

    Ευχαριστώ.

  •  10-06-2009, 22:36 51536 σε απάντηση της 51527

    Απ: WCF problem.

    Αν και το service και ο client είναι υπό τον έλεγχό σου, το καλύτερο που έχεις να κάνεις είναι να ξεχωρίσεις τα data contracts και τα service contracts σου σε μια ξεχωριστή assembly που θα κάνουν reference και το service και ο (ή οι) client(s). Το μεν service θα υλοποιεί τα service interfaces και ο client θα τα καλεί χρησιμοποιώντας το ChannelFactory<T>. Με αυτό τον τρόπο:

    • Ο client ενημερώνεται αυτόματα για τις οποιεσδήποτε αλλαγές στο service interface χωρίς να κάνεις update το service referenec.
    • Μπορείς να εκμεταλλευτείς και από τον client την όποια λειτουργικότητα έχεις υλοποιήσει στις κλάσεις των data contracts (όπως ακριβώς είναι κι η περίπτωσή σου)

     


    Νατάσα Μανουσοπούλου
  •  10-06-2009, 22:41 51537 σε απάντηση της 51536

    Απ: WCF problem.

    και συνεχίζω από εκεί που το άφησε η Νατάσα...

    How to: Use the ChannelFactory: http://msdn.microsoft.com/en-us/library/ms734681.aspx


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  10-06-2009, 23:06 51539 σε απάντηση της 51537

    Απ: WCF problem.

    Ευχαριστώ, το ποιάνω τώρα να το αλλάξω.

    Η αλήθεια είναι ότι διάβασα το 70-503 MCTS και με έπεισε σαν
    best practise να ακολουθώ αυτό τον τρόπο consuming.

    Ίσως επειδή δεν είχε τόσο complex παραδείγματα. (Και πέρασα και την εξέταση! :P).

    Μόλις το στρώσω θα κλείσω και το θέμα. Το αφήνω μήπως έχει κάποιος να προσθέσει,
    ή αν συναντήσω κάποιο πρόβλημα.

    Ευχαριστώ.

  •  11-06-2009, 02:32 51547 σε απάντηση της 51539

    Απ: WCF problem.

    Έκανα την αλλαγή στο Architecture, και κάνω Host το WCF Service σε ένα Windows Service.
    Όλα φαίνονται να δουλεύουν αφου το Windows Service ξεκινάει κανονικά και βλέπω και
    τα metadata κανονικα απο Explorer. Στον Client τώρα, που είναι ένα διαφορετικό Solution,
    παρουσιάστηκε αυτό το περίεργο: [EDITED] Την στιγμή που πάει να τρέξει κάποια μέθοδο
    του WCF.

    SecurityNegotiationException:

    "Exception Secure channel cannot be opened because security negotiation with the remote endpoint has failed.
    This may be due to absent or incorrectly specified EndpointIdentity in the EndpointAddress used to create the channel.
    Please verify the EndpointIdentity specified or implied by the EndpointAddress correctly identifies the remote endpoint."

    Επίσης στο Solution όπου είναι το "Server" Solution έφτιαξα ένα console application για να το τεστάρω και κάνει το ίδιο!

    Έχω φτιάξει όμως το bindingConfiguration και δεν χρησιμοποιώ security από επιλογή. Τουλάχιστον για την ώρα.
    Η αλήθεια είναι ότι στο WCF έχω 4 Endpoints για το ίδιο contract, αλλά στον client χρησιμοποιώ με το ChannelFactory το WSHttpBinding,
    με τον constructor που έχω στην Proxy Class που έφτιαξα manual για clients. Δοκίμασα επίσης και χώρις την Proxy Class,
    δημιουργώντας ένα ChannelFactory<T> dynamicaly kαι επίσης παρουσιάζει το ίδιο πρόβλημα.

    [EDITED] Με basicHttpBinding δουλεύει κανονικά! Αλλά περίεργο που άλλαξε η συμπεριφορά στο Ws.

    Τα DataContracts, ServiceContracts, και το implementation του WCF είναι όλα ξεχωριστά Assemblies.

    Καμμιά ιδέα?

  •  11-06-2009, 10:37 51552 σε απάντηση της 51547

    Απ: WCF problem.

    Το καλό με το WCF είναι ότι έχει τόσο μεγάλα και περιγραφικά exceptions. Και συνήθως αν ακολουθήσεις αυτό ακριβώς που λένε το πρόβλημά σου λύνεται. Οπότε διόρθωσε αυτό ακριβώς που λέει "This may be due to absent or incorrectly specified EndpointIdentity in the EndpointAddress used to create the channel.".

    Πριν βεβαιώσου ότι χρησιμοποιείς το endpoint που θέλεις, μια που έχεις 4. π.χ. Πιο overload της CreateChannel χρησιμοποιείς; Λογικά αυτό που παίρνει (string endpointConfigurationName). Έχεις ορισει σωστά το Name attribute του EndPoint στο configuration;


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  11-06-2009, 11:13 51553 σε απάντηση της 51552

    Απ: WCF problem.

    Χρησιμοποιώ το overload (Binding, Endpoint). Τα attributes είναι σωστά από ότι βλέπω. Χρησιμοποίησα και το Svcutil
    για να δώ τι config μου βγάζει, και με αυτό το ίδιο. Δες και το config που κάνει export:

    <binding name="WSHttpBinding_IWcfService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
              <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                  maxBytesPerRead="4096" maxNameTableCharCount="16384" />
              <reliableSession ordered="true" inactivityTimeout="00:10:00"
                  enabled="true" />
              <security mode="None">
                <transport clientCredentialType="Windows" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="Windows" negotiateServiceCredential="true"
                    establishSecurityContext="true" />

    Και το Endpoint:

    <endpoint address="http://localhost:8880/WCF/" binding="wsHttpBinding"
                    bindingConfiguration="WSHttpBinding_IWcfService" contract="SvcUtilProxy.IWcfService"
                    name="WSHttpBinding_IWcfService">
                    <identity>
                        <dns value="localhost" />
                    </identity>
    </endpoint>

    Με το overload που λές και δίνοντας το όνομα του configuration όπως το βλέπεις και ποιο πάνω,
    χτυπάει άλλο Exception. InvalidArgumentException.

    Αν και δουλεύει με basic θα ήθελα να ξέρω γιατί μου την σπάει:P

  •  11-06-2009, 11:31 51554 σε απάντηση της 51553

    Απ: WCF problem.

    Ειπες εχεις φτιαξει ένα console application. Το τρέχεις μέσα από το visual Studio ή απλά τρέχεις το exe?
    Πιθανά το πρόβλημα είναι ότι ορίζεις

                <transport clientCredentialType="Windows" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="Windows" negotiateServiceCredential="true"
                    establishSecurityContext="true" />

    και εσύ  τρέχεις service και client με διαφορετικό χρήστη. Υποψη οτι το ίδιο condiguration θα πρέπει να βρίσκεται και στα 2 config

    Γιώργος Σακαλής
  •  11-06-2009, 11:34 51555 σε απάντηση της 51554

    Απ: WCF problem.

    Το Console App το τρέχω με Ctrl + F5 μέσα απο το Visual Studio.

    Αν προσέξεις όμως πάνω από τις γραμμές που έκανες Post έχει.

    <security mode="None">

    Και τα 3 Config είναι ίδια. WCF, Windows Service <= Host, Web Client <= Web.Config.

  •  11-06-2009, 11:40 51556 σε απάντηση της 51554

    Απ: WCF problem.

    Και κάτι επιπλέον. διαβάζοντας το παρακάτω url θα δεις γιατι σου παίζει με HttpBinding και όχι με WSHttpBinding

    http://geekswithblogs.net/claeyskurt/archive/2008/04/22/121508.aspx

    Γιώργος Σακαλής
  •  11-06-2009, 15:27 51568 σε απάντηση της 51556

    Απ: WCF problem.

    Αυτά τα γνωρίζω και ευχαριστώ πολύ. Ξέρω ότι υπάρχει για compatibility και interoperability σκοπούς το
    συγκεκριμένο Binding, είναι ξεκάθαρο. Επίσης ξέρω πως το WSHttpBinding by default χρησιμοποιεί message security.
    The point is που έχω κάνει κάτι και άλλαξε συμπεριφορά και γιατί.

    Ευχαριστώ όλους.

    Κλείνω το θέμα, και μόλις το λύσω θα δημοσιεύσω το λάθος.

  •  11-06-2009, 17:53 51575 σε απάντηση της 51556

    Απ: WCF problem.

    sakalis:
    Και κάτι επιπλέον. διαβάζοντας το παρακάτω url θα δεις γιατι σου παίζει με HttpBinding και όχι με WSHttpBinding

    http://geekswithblogs.net/claeyskurt/archive/2008/04/22/121508.aspx


    Το διάβασα όλο και βοήθησε στην επίλυση. Θέλει όταν δημιουργεις Binding programmaticaly
    για το ChannelFactory<T> να βάλεις parameters, new WSHttpBinding(SecurityMode."Choice", reliableSessions).
    Όπως το έχεις δηλώση στο Endpoint.

    Thanx dude!

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