2009-07-16 12 views
4

は私がWCFでのメッセージコントラクトとして使用し、次のタイプがあります。WCF DataContractSerializerはコントラクトアトリビュートを選択しません。なぜそうではありませんか?

[MessageContract(IsWrapped = true, 
       WrapperNamespace = "http://example.com/services", 
       WrapperName = "EchoRequest")] 
public class EchoRequest 
{ 
    public EchoRequest() { } 
    public EchoRequest(String value) 
    { 
     Value = value; 
    } 

    [MessageBodyMember(Name = "Value", 
         Namespace = "http://example.com/services", 
         Order = 0)] 
    public String Value { get; set; } 
} 

私はsvcutil.exeを使用して、このタイプのプロキシを生成するとき、私はと通信することが可能であるクライアントを取得それをホストするサービスであり、要素上のXML名前空間はメッセージ契約の属性に従って正しいものです。

インスタンスにMessage.CreateMessage(...)を使用すると、名前空間はデフォルト(http://schemas.datacontract.org/2004/07/..)に戻ります。 DataContractSerializerのインスタンスを使用すると、同じことが起こります。私はDataContractSerializerコンストラクタに名前空間を渡すためにしようと、そして唯一のラッパーは、名前空間に含まれます:この時

var requestMessage = new EchoRequest("hello, world!"); 
var serializer = new DataContractSerializer(typeof(EchoRequest), 
              "EchoRequest", 
              "http://example.com/services"); 
var stream = new MemoryStream(); 
serializer.WriteObject(stream, requestMessage); 
var data = Encoding.UTF8.GetString(stream.ToArray()); 

、「データ」である:

<EchoRequest xmlns="http://example.com/services" 
      xmlns:a="http://schemas.datacontract.org/2004/07/TestClient" 
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <a:Value>hello, world!</a:Value> 
</EchoRequest> 

なぜDataContractSerializerを無視するように見えるんMessageContract属性? svcutilこの作品を入手しましょうか?

+1

ありがとうございます。私はちょうどこの正確な問題に遭遇し、すぐにあなたの質問を見つけました。 – shambulator

答えて

4

メッセージコントラクトはデータコントラクトではないため、データコントラクトは異なる属性を使用してクラスをマークするためです。型付きのメッセージコンバータを使用してみてください。

EchoRequest echoRequest = new EchoRequest{ value = "Hello" }; 

TypedMessageConverter echoMessageConverter = TypedMessageConverter.Create(
       typeof(echoRequest), 
       "YourActionNameHere", 
       "http://example.com/services"); 
Message request = echoMessageConverter.ToMessage(
    echoRequest,MessageVersion.Soap11); 

メッセージはすべて準備ができており、必要に応じてリクエストボディを引き出すことができます。

+0

はい、これです!書籍や文書は、メッセージ契約を処理する方法が非常に分かれているように見えますが、これはTypedMessageConverterの最初の話です。ありがとう! – codekaizen

+1

メッセージコントラクトのメンバがDataContractのものではなくXmlSerialization属性を使用する場合(DataContractSerializerが表すことができないWSDL/XSDから生成される可能性があります)、 'XmlSerializerFormatAttribute'を受け入れる' TypedMessageConverter.Create'のオーバーロードを使用します代わりにXmlSerializationを使用するように指示します。 – shambulator

+0

EchoRequestのタイプを使用して代理クラスを作成する方が簡単ではありません。このクラスにEchoRequestという名前を付けて、元のMessageContractとして定義することができます。これはdatacontractです。それは二重定義ですが、それは私のためにうまく動作します。 – batmaci

関連する問題