J'ai deux services de WCF. Net 3.5 Construction avec VS2008.
J'ai deux clients de la WCF à Silverlight pour consommer ces services. Les clients sont générés avec la «référence de service ajout». J'utilise Silverlight 4. P>
L'un des proxies est généré avec des propriétés code> spécifiées code> pour chaque propriété. Il s'agit d'une classe "Message-in 'pour ma méthode de service: p> Messer maintenant mon autre service (toujours avec un client Silverlight) ne génère pas Maintenant, je m'en fiche des "principes de bonne soa". Je veux juste me débarrasser de ces fichus propriétés parce que dans le contexte de ce que je fais, je les déteste absolument. P> Il doit y avoir une différence entre les deux services - mais je ne veux pas doivent les déchirer complètement pour découvrir la différence. P> A Question similaire avant d'avoir la réponse ' Vous ne pouvez pas le faire '- qui n'est certainement pas vrai parce que je l'ai, je ne sais tout simplement pas ce que j'ai fait différemment. P> Edit: Je suis maintenant dans une situation où je régénère mon proxy Silverlight 4 à mon service de 3,5 WCF (tous sur le même lieu localhost Machine) que parfois je reçois des propriétés "spécifiées" et parfois je ne le fais pas. Je ne pense plus (comme je soupçonnais à l'origine) que cela est dû uniquement à une configuration ou du niveau de service de fin d'extrémité [Attribut]. Il existe certains déclencheurs dans le message lui-même que la cause spécifiée doit être générée (ou non). Il peut y avoir de nombreux facteurs impliqués ou cela peut être quelque chose de très simple. P> p> spécifié code > Propriétés. P>
5 Réponses :
Essayez ceci dans votre service WCF où la propriété est déclarée isrequired = true code> annulera la nécessité de la propriété TESTENVFieldSpécifiée P> P> P> P> P> P> P> >
Qu'en est-il de la faire globalement? Maintenant, mon service créant des propriétés spécifiées vient de cesser de les créer par magie. Je viens d'ajouter une deuxième opération de fonctionnement avec un message très similaire - alors je suis toujours coincé à savoir ce qui déclenche ce comportement mondial
La seule raison pour laquelle je pouvais voir pourquoi 2 procurations généreraient avec spécifiéField et non, est que .N3.5 Les applications client n'ont pas besoin de la propriété "isrequiitée", elles le supposent être true par défaut, où des applications .net2.0 ont besoin de la Attribut, ils lisent la WSDL différemment. Sont les deux applications SL4?
@Neil c'est la même application unique! Je suis maintenant arrivé à un point où après avoir recompilé mon application 3.5 et à régénérer un proxy pour mon client SL4 que je serai parfois «spécifié» et parfois. c'est vraiment frustrant! quelque chose dans le Datamodel provoque ce comportement
Lorsque vous utilisez SL4, n'ajoutez pas la référence dans Visual Studio, des fichiers du programme Goto / Microsoft SDKS / Silverlight 4 ... Vous trouverez SLSVCutil, utilisez-le pour générer le proxy, vous pouvez le personnaliser beaucoup plus avec précision et obtenir le même type. de comportement à chaque fois
SLSVCUTIL MYSERVER: 8081 / MYWCFSFSERVICE /PRESHProxy.cs / EnableAbinding /N:*, "MyNamesPace.Proxy " /ct:cthsyst.Collections.ObjectModel.observablecollection`1 / r: "% Programmes% \ Assemblages de référence \ Microsoft \ Framework \ Silverlight \ v3.0 \ System.windo ws.dll" Essayez ça
OK J'ai trouvé une chose jusqu'à présent qui provoquera généré code> spécifié code>:
xtypedelement code> dans le message. li>
ul> Ceux-ci sont utilisés par LINQ2XSD. Je retournais un élément d'un modèle LINQ2XSD. P>
Ce déclenché spécifié code> Propriétés à produire dans toutes mes classes: P> public XElement Foo { get; set; }
J'obtiens soudainement un problème similaire dans un service Web qui fonctionnait comme écrit, bien que je n'utilise pas xtypedelement ou LINQ2XSD, et j'utilise .NET 4.0
Ces propriétés spécifiées supplémentaires sont générées pour des types de valeur spécifiés comme facultatifs dans le contrat ou le balisage d'attribut. P>
Alors que les types de valeur ont une valeur par défaut, les indicateurs d'extra afin d'empêcher que ces drapeaux sont générés pour des types de valeur, vous devez modifier le contrat pour rendre ces propriétés de type de valeur obligatoires, au lieu de facultatif. P>
espoir que cela a du sens. p> spécifiés code> sont ajoutés pour ces propriétés pour permettre au client (et au serveur) de distinguer quelque chose explicitement non spécifié ou explicitement spécifié - qui peut bien être réglé sur la valeur par défaut. Sans cela, les entiers finiraient toujours par être 0 (et être sérialisé) même si vous ne les définissez pas (en raison de la mappage vers INT) de votre code client. Donc, lorsque vous faites, vous devez également vous assurer de définir le drapeau code> spécifié code> sur true, sinon ces propriétés ne seront pas sérialisées. P>
Droit qui fait un sens parfait, sauf que je ne les reçois pas toujours générés même pour des types de valeur. Actuellement, tous mes booléens (même non nullables) et «INTS» ne génèrent pas ces propriétés, mais je change de temps en temps quelque chose de manière involontaire dans le contrat qui les provoque de générer (et je ne suis définitivement pas ajouté accidentellement [Datamember (Isrequired = TRUE) ]). J'aimerais vraiment savoir comment les désactiver définitivement afin qu'ils se comportent comme des objets «normaux».
Les types non nullables doivent être corrects, ce sont les types de valeur facultatif i> uniquement, cela aura ceci.
C'est l'inverse. Ses champs non nullables nécessitant les propriétés spécifiées, car sinon, vous ne savez pas si la valeur par défaut (FALSE ou 0) est ce que l'utilisateur souhaitait réellement. Les options facultatives n'existeront tout simplement pas, mais le fait qu'ils sont facultatifs indiquent que c'est OK. Dans les deux cas, toutes mes propriétés finissent par obtenir des propriétés spécifiées qui vivent essentiellement tout mon code. Il doit y avoir un ensemble de règles qui détermine quand ils sont générés et quand ils ne sont pas. ce n'est pas aussi simple que la nullababophisme malheureux (ou heureusement selon la façon dont vous le regardez)
Non nullable pour les types de valeur est ok. Maintenant, si votre booléen serait nullable, vous ne sauriez pas la différence si la valeur par défaut de 0 entière était destinée ou non. D'où l'introduction du drapeau spécifié code>. Cela dit, il s'agit davantage d'être requis / obligatoire que la nullabilité.
Note: Je réalise que c'est une ancienne question. J'ajoute cela ici parce que cette question se présente comme un résultat supérieur sur Google, et c'est des informations utiles pour quiconque vient à la recherche.
Essayez d'ajouter cette ligne dans votre déclaration de contrat d'exploitation:
de
[xmlSerializerformat] code>
Il devrait ressembler à quelque chose comme ceci: p>
Notez que cela modifie complètement le moteur de sérialisation XML utilisé pour le service Web. (Changer de DatacontractSérialiseur à XMLSerializer). Le moteur différent utilise un ensemble différent d'attributs permettant de contrôler la sortie de sérialisation, présente des limites de compatibilité différentes et des caractéristiques de performance différentes. Ce n'est pas un changement mineur.
J'ai trouvé que si je mettais un jeu de données dans un DataContract de service, le client généré utilisera XML Serializer et générera ainsi les éléments * IssPecified. P>
En fait, j'ai 3 services qui ne créent pas de propriétés spécifiées. Seul le quatrième fait!
Ajouter
[xmlserializerformat] code> aux attributs de votre service: Vérifiez à ce Répondre