我有一个通过HTTP托管的WCF服务。该服务具有以下操作:
[OperationContract]
MyResponse ProcessRequest(MyRequest request);
和消息合同:
[MessageContract]
public class MyRequest
{
[MessageBodyMember(Namespace = "http://company.com/schema/myobjectschema/2", Name = "RequestPayLoad")]
public RequestPayLoadType RequestPayLoad{ get; set; }
}
RequestPayLoadType对象是使用xsd.exe从模式文件生成的,并具有所有相应的名称空间。
现在,当我从SOAP UI调用此服务操作时,我发现ProcessRequest操作的soap UI请求在请求中存在RequestPayLoadType中的所有私有字段。这实际上不符合架构,因此消耗它的java客户端正在破坏。
例如,我的requestpayloadtype的结构如下:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://company.com/schema/myobjectschema/2")]
[System.Xml.Serialization.XmlRootAttribute("EventHeader", Namespace = "http://company.com/schema/myobjectschema/2",
IsNullable = false)]
public class RequestPayLoadType
{
private string messageIDField;
public string MessageID
{
get
{
return this.messageIDField;
}
set
{
this.messageIDField = value;
}
}
}
当我向服务发送请求时,请求形成如下:
<ns:TimeSeriesPayload>
<messageIDField >?</messageIDField >
</ns:TimeSeriesPayload>
我的问题是:为什么请求中出现私有字段。为什么不是公共财产。我设置了一个属性来防止这种情况发生吗?我的架构有深层嵌套,所以我可以在根级别使用attrbute来防止这种情况发生吗?
答案 0 :(得分:0)
对于WCF,通常将参数对象定义为Data Contract s。您的RequestPayLoadType
将使用[DataContract]
属性进行定义,您的公共属性MessageID
将使用[DataMember]
属性进行定义。这可能会使序列化程序使用您的公共财产。
答案 1 :(得分:0)
我假设您故意使用MessageContract
属性,而不是使用DataContract
属性。
如果我的假设是正确的,那么你应该用相关的MessageBodyMember
属性标记你的内部类。您的内部数据类未标记MessageContract
和MessageBody
属性;因此框架假设您正在尝试发布内部类的所有属性。