Pregunta

Estoy haciendo un desarrollo de wsdl y cliente primero en C # con WCF (el wsdl y el cliente ya existen, estoy construyendo el lado del servidor) y tengo un problema extraño. Usé wsdl.exe para generar un contrato desde mi .wsdl, y puedo compilarlo y hospedar el servicio WCF como un servicio de Windows.

Sin embargo, el wsdl que recibo de http: // localhost / Service? wsdl expone campos privados en lugar de las propiedades públicas (por ejemplo: en lugar de OsType , obtengo m_OsTypeField , que es la variable privada asociada con la propiedad pública OsType .)

Aquí están los atributos para una de las clases que tienen este problema: [System.CodeDom.Compiler.GeneratedCodeAttribute (" wsdl " ;, " 2.0.50727.3038 ")] [System.SerializableAttribute ()] [System.Diagnostics.DebuggerStepThroughAttribute ()] [System.ComponentModel.DesignerCategoryAttribute (" código ")] [System.Xml.Serialization.XmlTypeAttribute (Namespace = " http: //xxxxxxx.com/")]

Estoy completamente perplejo, ya que se supone que el serializador .NET XML ignora a los miembros privados. ¿Alguna idea sobre por qué esto podría estar pasando?

¿Fue útil?

Solución

Si está usando WCF, no debería usar wsdl.exe sino svcutil.exe en su lugar.

Además, el serializador estándar WCF DataContract felizmente serializará todo lo que haya marcado con un atributo [DataMember]: la configuración de visibilidad de .NET no tiene relación con la vista SOA de sus datos, en realidad.

Sin embargo, de su ejemplo de código parecería que está utilizando el Xml Serializer y no el DataContractSerializer, probablemente porque usó wsdl.exe en lugar de svcutil.exe.

¿Puedes intentar crear los apéndices del lado del servidor usando svcutil.exe? ¿Sigues viendo el mismo problema?

Marc

Otros consejos

Sus contratos de datos están usando el motor XmlSerializer pero su OperationContract está usando DataContractSerializer.

Aplique XmlSerializerFormatAttribute en el contrato de operación

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

Ocasionalmente, el DataContractSerializer no es adecuado para serializar sus tipos. WCF es compatible con un motor de serialización alternativo, el XmlSerializer, que también puede utilizar para serializar parámetros. El XmlSerializer le permite usar más control sobre el XML resultante utilizando atributos como el XmlAttributeAttribute. Para cambiar al uso de XmlSerializer para una operación en particular o para todo el servicio, aplique el atributo XmlSerializerFormatAttribute a una operación o un servicio. Por ejemplo:

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

Para obtener más información, consulte Uso de la clase XmlSerializer. Recuerde que no se recomienda cambiar manualmente al XmlSerializer como se muestra aquí, a menos que tenga razones específicas para hacerlo según se detalla en ese tema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top