在创建ServiceModel.Channels.Message

时间:2016-07-01 15:20:24

标签: c# xml serialization messages datacontractserializer

我正在编写一个与外部Web服务通信的应用程序,该服务通过IClientMessageInspector派生类传递所有请求和响应。为了测试它,我需要编写一个mock,它将获取一个被发送到Web服务方法的对象,将其转换为ServiceModel.Channels.Message,并传递给此inspector类。

Object是典型的WSLD自动生成类,如下所示:

public partial class CreditInquiry : object, System.ComponentModel.INotifyPropertyChanged {

    private InquiryHeader inquiryHeaderField;

    private IndividualInquirySubscriberCategory subscriberCategoryField;

    [...]
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
    public InquiryHeader inquiryHeader {
        get {
            return this.inquiryHeaderField;
        }
        set {
            this.inquiryHeaderField = value;
            this.RaisePropertyChanged("inquiryHeader");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
    public IndividualInquirySubscriberCategory subscriberCategory {
        get {
            return this.subscriberCategoryField;
        }
        set {
            this.subscriberCategoryField = value;
            this.RaisePropertyChanged("subscriberCategory");
        }
    }
    [...]
}

在我的mock类中,我正在生成这样的Message对象:

  var requestType = request.GetType();
  var knownRequestTypes = new HashSet<Type>();
  GetTypesInClass(ref knownRequestTypes, requestType);

  var requestMessage = Message.CreateMessage(MessageVersion.Default, "", request, new DataContractSerializer(requestType, knownRequestTypes));

GetTypesInClass()方法遍历请求类型,并添加其中使用的每个属性和字段的类型,request是要发送到WS方法的对象。

因此,当我在requestMessage对象上调用ToString()方法时,我得到以下表示:

<creditInquiry>
    <PropertyChanged xmlns:d5p1="http://schemas.datacontract.org/2004/07/System.ComponentModel" i:nil="true" />
    <inquiryHeaderField>
      [....]
    </inquiryHeaderField>
    <subscriberCategoryField i:nil="true" />        
</creditInquiry>

而不是

<creditInquiry>
    <inquiryHeader>
      [....]
    </inquiryHeader>
    <subscriberCategory i:nil="true" />        
</creditInquiry>

正如我所料。因此,CreateMessage实际上序列化了对象的私有字段,并忽略了它的公共属性。这可以以某种方式被规避吗?我不熟悉手动生成消息,可能还有一些额外的参数需要传递给CreateMessage才能获得所需的对象表示?

谢谢!

1 个答案:

答案 0 :(得分:0)

在元素的装饰中,您可以指定属性名称。为InquiryHeader

更改此声明
[System.Xml.Serialization.XmlElementAttribute("InquiryHeader", typeof(InquiryHeader), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]