wsdl.exe生成的WCF服务公开wsdl中的私有字段
题
我正在使用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,除非您有特定的理由这样做,如该主题中所述。