Servizio WCF generato da wsdl.exe che espone campi privati ??in wsdl
Domanda
Sto realizzando alcuni sviluppi wsdl e client in C # con WCF (il wsdl e il client esistono già, sto costruendo il lato server) e sto riscontrando un problema strano. Ho usato wsdl.exe per generare un contratto dal mio .wsdl e sono in grado di crearlo e ospitare il servizio WCF come servizio di Windows.
Tuttavia, il wsdl che ottengo da http: // localhost / Service? wsdl espone campi privati ??anziché le proprietà pubbliche (es. invece di OsType
ottengo m_OsTypeField
, che è la variabile privata associata alla proprietà pubblica OsType
.)
Ecco gli attributi di una delle classi con questo problema:
[System.CodeDom.Compiler.GeneratedCodeAttribute (" wsdl " ;, " 2.0.50727.3038 ")]
[System.SerializableAttribute ()]
[System.Diagnostics.DebuggerStepThroughAttribute ()]
[System.ComponentModel.DesignerCategoryAttribute (" codice ")]
[System.Xml.Serialization.XmlTypeAttribute (Namespace = " http: //xxxxxxx.com/")]
Sono completamente sconcertato, poiché il serializzatore .NET XML dovrebbe ignorare qualsiasi membro privato. Qualche idea sul perché ciò potrebbe accadere?
Soluzione
Se stai usando WCF, non dovresti usare wsdl.exe
ma svcutil.exe
invece.
Inoltre, il serializzatore standard WCF DataContract serializzerà felicemente tutto ciò che è stato contrassegnato con un attributo [DataMember] - l'impostazione di visibilità .NET non ha alcun impatto sulla vista SOA dei tuoi dati, davvero.
Tuttavia, dal tuo esempio di codice sembrerebbe che tu stia usando il serializzatore Xml e non il DataContractSerializer - probabilmente perché hai usato wsdl.exe invece di svcutil.exe.
Puoi provare a creare gli stub lato server usando svcutil.exe? Vedi ancora lo stesso problema?
Marc
Altri suggerimenti
I tuoi contratti dati utilizzano il motore XmlSerializer ma OperationContract utilizza DataContractSerializer.
Applica XmlSerializerFormatAttribute al contratto operativo
Da MSDN http://msdn.microsoft .com / it-it / library / ms732038 (v = VS.90) aspx
Occasionalmente, DataContractSerializer non è adeguato per serializzare i tuoi tipi. WCF supporta un motore di serializzazione alternativo, XmlSerializer, che è anche possibile utilizzare per serializzare i parametri. XmlSerializer ti consente di utilizzare un maggiore controllo sull'XML risultante utilizzando attributi come XmlAttributeAttribute. Per passare a utilizzare XmlSerializer per una particolare operazione o per l'intero servizio, applicare l'attributo XmlSerializerFormatAttribute a un'operazione o un servizio. Ad esempio:
[ServiceContract]
public interface IAirfareQuoteService
{
[OperationContract]
[XmlSerializerFormat]
float GetAirfare(Itinerary itinerary, DateTime date);
}
Per ulteriori informazioni, consultare Uso della classe XmlSerializer. Ricorda che non è consigliabile passare manualmente a XmlSerializer come mostrato qui a meno che tu non abbia motivi specifici per farlo, come dettagliato in quell'argomento.