WCFでは、デフォルトではDataConrtractSerializerが使われるようですが、このままだと XmlAttribute などの属性が正しく反映されず、XMLでAttributeにすべき項目がElementとして出力されてしまうようで…
XmlSerializerを使うには、サービス定義に XmlSerializerFormat 属性を追加します。(※メッセージのほうではなくて、サービス定義のほうに指定する必要があるらしい。)
[ServiceContract, XmlSerializerFormat]
public interface IService1
{
/// <remarks/>
[OperationContract, XmlSerializerFormat]
void OTA_PingRS(PingRSRequestMessage pingRSMsg);
}
メッセージBodyは上記の方法でOK。
一方、メッセージHeaderについては、MessageHeader.CreateHeader() のパラメータでSerializerが指定できそうなので楽だろうと思いきや、
このパラメータでは System.Runtime.Serialization.を継承するクラスしかしていできず、System.Xml.Serialization.XmlSerializer は使えないらしく…
いろいろ試行錯誤した後、ヘッダーの値を保持するクラスに IXmlSerializable を実装させて、WriteXml() メソッドの中で、Serializeの方法を記述する方法を試したら希望通りのメッセージになりました。面倒ですが、とりあえずはこれで何とかなりそう…
コメントを残す