在创建ServiceModel.Channels.Message时只序列化公共属性
本文关键字:序列化 属性 创建 ServiceModel Channels Message | 更新日期: 2023-09-27 17:54:04
我正在编写一个与外部web服务通信的应用程序,该应用程序通过IClientMessageInspector派生类传递所有请求和响应。为了测试它,我需要编写一个mock,它将接受一个被发送到web服务方法的对象,并将其转换为ServiceModel.Channels。消息,并传递给此检查器类。
对象是典型的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");
}
}
[...]
}
在我的模拟类中,我像这样生成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));
gettypeclass()方法遍历请求类型,并添加其中使用的每个属性和字段的类型,并且请求是被发送到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,以获得所需的对象表示?
谢谢!
可以在元素的装饰中指定属性名。像这样更改InquiryHeader
[System.Xml.Serialization.XmlElementAttribute("InquiryHeader", typeof(InquiryHeader), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]