我正在使用WCF在C#中进行一些wsdl和客户端优先开发(wsdl和客户端已经存在,我正在构建服务器端),而且我遇到了一个奇怪的问题。我使用wsdl.exe从我的.wsdl生成合同,我能够构建它并将WCF服务作为Windows服务托管。

但是,我从 http:// localhost / Service?wsdl 获取的wsdl公开私有字段而不是公共属性(例如:代替 OsType 我得到 m_OsTypeField ,这是与公共 OsType 属性相关联的私有变量。)

以下是其中一个有此问题的类的属性: [System.CodeDom.Compiler.GeneratedCodeAttribute(" wsdl"," 2.0.50727.3038")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute(QUOT;代码&QUOT)] [System.Xml.Serialization.XmlTypeAttribute(Namespace =" http://xxxxxxx.com/")]

我完全难倒,因为.NET XML序列化程序应该忽略任何私有成员。关于为什么会发生这种情况的任何想法?

有帮助吗?

解决方案

如果您正在使用WCF,则不应使用 wsdl.exe ,而应使用 svcutil.exe

此外,标准WCF DataContract序列化程序将很乐意序列化您使用[DataMember]属性标记的任何内容 - 实际上,.NET可见性设置与数据的SOA视图无关。

但是,从您的代码示例中看起来好像您使用的是Xml Serializer而不是DataContractSerializer - 可能是因为您使用了wsdl.exe而不是svcutil.exe。

您可以尝试使用svcutil.exe创建服务器端存根吗?你还看到同样的问题吗?

马克

其他提示

您的datacontracts正在使用XmlSerializer引擎,但您的OperationContract正在使用DataContractSerializer。

在操作合同中应用XmlSerializerFormatAttribute

来自MSDN http://msdn.microsoft的.com / EN-US /库/ ms732038(v = VS.90)的.aspx

有时,DataContractSerializer不足以序列化您的类型。 WCF支持备用序列化引擎XmlSerializer,您也可以使用它来序列化参数。 XmlSerializer允许您使用诸如XmlAttributeAttribute之类的属性对结果XML进行更多控制。要切换到将XmlSerializer用于特定操作或整个服务,请将XmlSerializerFormatAttribute属性应用于操作或服务。例如:

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

有关更多信息,请参阅使用XmlSerializer类。请记住,不建议手动切换到此处所示的XmlSerializer,除非您有特定的理由这样做,如该主题中所述。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top