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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top