2016-07-01 3 views
1

Я пишу приложение, которое общается с внешней веб-службой, которая передает все запросы и ответы через производный класс 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, чтобы получить желаемое представление объекта?

Спасибо!

ответ

0

В оформлении элемента вы можете указать имя атрибута. Изменить объявление как это для InquiryHeader

[System.Xml.Serialization.XmlElementAttribute("InquiryHeader", typeof(InquiryHeader), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)] 
+0

я не могу, потому что это автоматически генерируемый класс WSDL, я не хочу, чтобы изменить его. – user2551138

+0

Если вы не готовы вносить какие-либо изменения, то как бы вы ожидали изменения вывода? Вам придется жить с этим. –

+0

Как-то WCF сериализует объект XML только с открытыми свойствами при выполнении WS-метода с использованием автогенерируемого класса. Я просто хочу реплицировать эту логику вручную. – user2551138

Смежные вопросы