Я пишу приложение, которое общается с внешней веб-службой, которая передает все запросы и ответы через производный класс IClientMessageInspector. Чтобы проверить его, мне нужно написать макет, который возьмет объект, который отправляется методу веб-службы, преобразует его в ServiceModel.Channels.Message и переходит к этому классу инспектора.Сериализовать только общедоступные свойства при создании ServiceModel.Channels.Message
Объект типичен 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");
}
}
[...]
}
В моем макете классе, я генерации объекта сообщения, как это:
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() метод проходит через тип запроса и добавляет тип каждого свойства и поля, которые используются в нем, а запрос - это объект, который отправляется методу 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, чтобы получить желаемое представление объекта?
Спасибо!
я не могу, потому что это автоматически генерируемый класс WSDL, я не хочу, чтобы изменить его. – user2551138
Если вы не готовы вносить какие-либо изменения, то как бы вы ожидали изменения вывода? Вам придется жить с этим. –
Как-то WCF сериализует объект XML только с открытыми свойствами при выполнении WS-метода с использованием автогенерируемого класса. Я просто хочу реплицировать эту логику вручную. – user2551138