0

我有一个通过 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>

我的问题是:为什么私有字段出现在请求中。为什么不是公共财产。我是否设置了一个属性来防止这种情况发生?我的模式有深层嵌套,所以我可以在根级别使用属性来防止这种情况发生吗?

4

2 回答 2

0

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

于 2012-08-14T11:32:20.257 回答
0

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

如果我的假设是正确的,那么您应该使用相关MessageBodyMember属性标记您的内部类。您的内部数据类没有标记MessageContractMessageBody属性;因此框架假设您正在尝试发布内部类的所有属性。

于 2012-08-14T11:34:33.463 回答