4

既存のサンプルメッセージに対してクラスをテストしようとしています。サンプルメッセージファイルをクラス[MessageContract]のインスタンスに読み込んで、それがどのように機能するかを確認することで、開発を簡素化する方法を探しています([MessageContract]ここでは特に複雑な契約であり、WCF以外の起源のものです)。

[MessageContract]のクラスは次のようになります。

[MessageContract(IsWrapped = true, WrapperName = "wrapper", WrapperNamespace = "somens")]
public class RequestMessage
{
    [MessageHeader(Name = "HeaderElem", Namespace = "otherns")]
    public XElement CorrelationTimeToLive { get; set; }

    [MessageBodyMember(Name = "id", Namespace = "somens")]
    public XElement id { get; set; }
}

Message次のようなコードを使用して、ファイルをクラスのインスタンスに読み込むことができます。

var xr = XmlReader.Create("sample_message.xml");
var msg = Message.CreateMessage(xr, int.MaxValue, MessageVersion.Soap12);

[MessageContract]ただし、クラスをまったくテストできないため、特に役に立ちません。

WCFの内臓のどこかに、このMessageインスタンスを特定の[MessageContract]クラスのインスタンスに変換するためのシステムがありますが、それは何ですか?

4

2 に答える 2

5

先日、同僚と話をした後、これを行う方法を学びました。これがあなたが求めていたものだと思います。

namespace MessageContractTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string action = null;
            XmlReader bodyReader = XmlReader.Create(new StringReader("<Example xmlns=\"http://tempuri.org/\"><Gold>109</Gold><Message>StackOverflow</Message></Example>"));
            Message msg = Message.CreateMessage(MessageVersion.Default, action, bodyReader);
            TypedMessageConverter converter = TypedMessageConverter.Create(typeof(Example), "http://tempuri.org/IFoo/BarOperation");
            Example example = (Example)converter.FromMessage(msg);
        }
    }


    [MessageContract]
    public class Example
    {
        [MessageHeader]
        public string Hello;

        [MessageHeader]
        public double Value;

        [MessageBodyMember]
        public int Gold;

        [MessageBodyMember]
        public string Message;
    }
}
于 2010-11-10T00:27:46.467 に答える
-2

XMLをデータコントラクトのインスタンスに逆シリアル化する必要があります。これは、WCFが内部で行っていることです。

DataContractSerializerこれは、XMLを手動で呼び出す方法を示す簡単なチュートリアルです。

于 2010-09-30T15:54:16.610 に答える