Question

Je fais quelques développements wsdl et client en C # avec WCF (le wsdl et le client existent déjà, je suis en train de construire côté serveur) et j'ai un problème étrange. J'ai utilisé wsdl.exe pour générer un contrat à partir de mon fichier .wsdl. Je peux le créer et héberger le service WCF en tant que service Windows.

Cependant, le message que je reçois de http: // localhost / Service? wsdl expose des champs privés au lieu de les propriétés publiques (par exemple: au lieu de OsType , j'obtiens m_OsTypeField , qui est la variable privée associée à la propriété public OsType .)

Voici les attributs d'une des classes ayant ce problème: [System.CodeDom.Compiler.GeneratedCodeAttribute ("wsdl", "2.0.50727.3038")] [System.SerializableAttribute ()] [System.Diagnostics.DebuggerStepThroughAttribute ()] [System.ComponentModel.DesignerCategoryAttribute (" code ")] [System.Xml.Serialization.XmlTypeAttribute (Namespace = "http: //xxxxxxx.com/")]

Je suis complètement bloqué, car le sérialiseur XML .NET est censé ignorer tous les membres privés. Des idées sur les raisons pour lesquelles cela pourrait se produire?

Était-ce utile?

La solution

Si vous utilisez WCF, vous ne devriez pas utiliser wsdl.exe , mais svcutil.exe à la place.

En outre, le sérialiseur WCF DataContract standard sérialisera tout ce que vous avez marqué avec un attribut [DataMember] - le paramètre de visibilité .NET n’a aucune incidence sur la vue SOA de vos données.

Toutefois, à partir de votre exemple de code, il semblerait que vous utilisiez le sérialiseur XML et non le DataContractSerializer, probablement parce que vous avez utilisé wsdl.exe à la place de svcutil.exe.

Pouvez-vous essayer de créer les stubs côté serveur en utilisant svcutil.exe? Voyez-vous toujours le même problème?

Marc

Autres conseils

Vos contrats de données utilisent le moteur XmlSerializer mais votre OperationContract utilise DataContractSerializer.

Appliquer le XmlSerializerFormatAttribute au contrat d'opération

De MSDN http://msdn.microsoft .com / fr-us / library / ms732038 (v = VS.90) .aspx

Parfois, DataContractSerializer ne permet pas de sérialiser vos types. WCF prend en charge un autre moteur de sérialisation, XmlSerializer, que vous pouvez également utiliser pour sérialiser des paramètres. XmlSerializer vous permet d’exercer davantage de contrôle sur le XML résultant à l’aide d’attributs tels que XmlAttributeAttribute. Pour passer à l'utilisation de XmlSerializer pour une opération particulière ou pour l'ensemble du service, appliquez l'attribut XmlSerializerFormatAttribute à une opération ou à un service. Par exemple:

[ServiceContract] 
public interface IAirfareQuoteService
{
    [OperationContract]
    [XmlSerializerFormat]
    float GetAirfare(Itinerary itinerary, DateTime date);
}

Pour plus d'informations, voir Utilisation de la classe XmlSerializer. N'oubliez pas qu'il est déconseillé de basculer manuellement vers XmlSerializer comme indiqué ci-dessous, sauf si vous avez des raisons précises de le faire, comme indiqué dans cette rubrique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top