我正在编写一个与外部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才能获得所需的对象表示?
谢谢!
答案 0 :(得分:0)
在元素的装饰中,您可以指定属性名称。为InquiryHeader
[System.Xml.Serialization.XmlElementAttribute("InquiryHeader", typeof(InquiryHeader), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]