2017-07-05 7 views
0

WCFサービスの要求ヘッダーからリストのキー値を回復しようとしています。私は1つのプロパティを回復することができますが、リストを回復する方法を見つけることができません。WCFサービス - 要求ヘッダーからリストを取得する

これは私の呼び出しです:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> 
    <soapenv:Header> 
    <tem:header1>Header 1</tem:header1> 
    <tem:Properties> 
     <tem:property> 
     <key>KEY.ONE</key> 
     <value>value1</value> 
     </tem:property> 
     <tem:property> 
     <key>KEY.TWO</key> 
     <value>value2</value> 
     </tem:property> 
    </tem:Properties> 
    </soapenv:Header> 
    <soapenv:Body> 
    <tem:function1> 
     <tem:param1>100</tem:param1> 
    </tem:function1> 
    </soapenv:Body> 
</soapenv:Envelope> 

そして、これは私が "HEADER1" を回復する方法です:

MessageHeaders headers = OperationContext.Current.IncomingMessageHeaders; 
string header1 = headers.GetHeader<string>("header1", "http://tempuri.org/"); 

私は私のようなものを使用できると考えた:

IDictionary<string, string> properties = headers.GetHeader<Dictionary<string, string>>("Properties", "http://tempuri.org/"); 

をしかし、 プロパティは常にnullです。

答えて

1

GetHeader<T>(string, string)メソッドは、DataContractSerializerによってシリアル化されたヘッダーを返すことしかできないため、propertyオブジェクトは.NETタイプとして存在する必要があります。

代わりに、GetHeader<T>(string, string, XmlObjectSerializer)を使用してシリアライザを使用して、ヘッダー値の内容を逆シリアル化して返すことができます。

このため、コンテンツを読み込んで辞書を返す独自のシリアライザを実装する必要があります。私はそれがうまくいくと思います(keyvalueが厳密にこの順番になっているか、スワップ可能かどうかによります)。また、私は名前空間で何が起こるのかを確認しませんでした。

public class MySerializer : XmlObjectSerializer 
{ 

    public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName) 
    { 
    reader.ReadFullStartElement(); 
    Dictionary<string, string> r = new Dictionary<string, string>(); 
    while (reader.IsStartElement("property")) 
    { 
     reader.ReadFullStartElement("property"); 
     reader.ReadFullStartElement("key"); 
     string key = reader.ReadContentAsString(); 
     reader.ReadEndElement(); 
     reader.ReadFullStartElement("value"); 
     string value = reader.ReadContentAsString(); 
     reader.ReadEndElement(); 
     r.Add(key, value); 

     reader.ReadEndElement(); 
     reader.MoveToContent(); 
    } 
    return r; 
    } 

    public override void WriteStartObject(XmlDictionaryWriter writer, object graph) 
    { 
    throw new NotImplementedException(); 
    } 

    public override void WriteObjectContent(XmlDictionaryWriter writer, object graph) 
    { 
    throw new NotImplementedException(); 
    } 

    public override void WriteEndObject(XmlDictionaryWriter writer) 
    { 
    throw new NotImplementedException(); 
    } 

    public override bool IsStartObject(XmlDictionaryReader reader) 
    { 
    throw new NotImplementedException(); 
    } 
} 
+0

答えをいただきありがとうございます。私は** WCF **の新機能です。使用例を教えてください。私はデ** XmlObjectSerializer **を実装する必要があることを読んだが、これを実装する方法を静かではない。 –

+0

コード –

+0

で私の答えを更新してくれてありがとう! –

関連する問題