2012-08-14 109 views
0

我有一个通过HTTP托管的WCF服务。服务有一个opertation如下所示:肥皂反序列化问题

[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

对于WCF,通常将参数对象定义为Data Contract s。你的RequestPayLoadType将被定义为[DataContract]属性,你的公共属性MessageID将被定义为[DataMember]属性。这可能会使序列化程序使用您的公共属性。

0

我假设你故意使用MessageContract属性而不是使用DataContract属性。

如果我的假设是真实的,那么你应该用相关的MessageBodyMember属性标记你的内部类。您的内部数据类别未标有MessageContractMessageBody属性;因此框架假定您正试图发布内部类的所有属性。