2016-07-01 5 views
1

私はIClientMessageInspector派生クラスを介してすべての要求と応答を渡す外部Webサービスと通信するアプリケーションを作成しています。これをテストするには、疑問文を書く必要があります。これは、Webサービスメソッドに送信されているオブジェクトを取得し、それを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"); 
     } 
    } 
    [...] 
} 

、私はこのような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メソッドに送信されるオブジェクトです。

結果Iは要求メッセージオブジェクトに対してtoString()メソッドを呼び出すときに、私は、次の表現を取得:私はそれを期待するよう代わり

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

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

を。 CreateMessageは実際にオブジェクトのプライベートフィールドをシリアル化し、パブリックプロパティを無視します。これは何とか回避できますか?残念ながら、手動でメッセージを生成するのは初めてです。希望のオブジェクト表現を取得するために、CreateMessageに渡す必要があるいくつかの追加パラメータがありますか?

ありがとうございます!

答えて

0

要素の装飾では、属性名を指定できます。それが自動生成されたWSDLクラスですので、私はそれを変更したくない、InquiryHeader

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

私はできないため、このようなあなたの宣言を変更します。 – user2551138

+0

変更を行う準備ができていない場合は、出力がどのように変化すると思いますか?あなたはそれで生きなければなりません。 –

+0

どうやらWCFは、自動生成されたクラスを使ってWSメソッドを実行すると、publicプロパティのみでXMLオブジェクトをシリアル化します。私はこのロジックを手動で複製したいだけです。 – user2551138

関連する問題