0

WCF で SOAP ベースの Web サービスを開発しています。

私のクライアントは、次の SOAP 要求 xml を使用して WCF サービスに要求を送信します。

<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/" e:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <e:Header>
        <me:RequestHead xmlns:me="http://www.my-namespace.org/header/abc" >
            <ID>0</ID>
            <Green>
                <a>101</a>
                <b>0</b>
            </Green>
            <Time>1</Tim>
        </me:RequestHead>
    </e:Header>
    <e:Body>
        <m:RequestBody xmlns:m="http://www.my-namespace.org/service/abc">
            <Time>
                <hh>23</hh>
                <mm>59</mm>
                <ss>59</ss>
            </Time>            
        </m:RequestBody>
    </e:Body>
</e:Envelope>

MessageContractクライアントに値を渡すか、クライアントから値を取得するクラスを作成しました。

MessageContractクラスには複数の属性MessageHeaderプロパティがありますが、リクエストがサーバーに送信されると、属性を持つプロパティは逆シリアルMessageHeader化されず、常にnullです。

RequestHeadタグには prefix があり、meWCF サービスでオブジェクトへの XML 要求を逆シリアル化するために問題が発生すると思います

ただし、RequestBodyタグにはプレフィックスもありますmが、正常に逆シリアル化されます。

タグmeからプレフィックスを削除すると、正常に機能しました。属性プロパティRequestHeadの値を取得しました。MessageHeader

<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/" e:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <e:Header>
        <RequestHead xmlns="http://www.my-namespace.org/header/abc" >
            <ID>0</ID>
            <Green>
                <a>101</a>
                <b>0</b>
            </Green>
            <Time>1</Tim>
        </RequestHead>
    </e:Header>
    <e:Body>
        <m:RequestBody xmlns:m="http://www.my-namespace.org/service/abc">
            <hh>23</hh>
            <mm>59</mm>
            <ss>59</ss>
        </m:RequestBody>
    </e:Body>
</e:Envelope>

私のクラス:

[MessageContract]
class Green
{
    [MessageHeader(Namespace = "")]
    public string a { get; set; }

    [MessageHeader(Namespace = "")]
    public string b { get; set; }
}

[MessageContract]
class RequestHead
{
    [MessageHeader(Namespace = "")]
    public int id { get; set; }

    [MessageHeader(Namespace = "")]
    public Green green { get; set; }

    [MessageHeader(Namespace = "")]
    public int Time { get; set; }
}

[MessageContract]
class Head
{
    [MessageHeader(Namespace = "http://www.my-namespace.org/header/abc")]
    public RequestHead RequestHead { get; set; }
}

[MessageContract(Namespace = "http://www.my-namespace.org/service/abc")]
class RequestBody : Head
{
    [MessageBodyMember(Order = 1)]
    public int hh { get; set; }

    [MessageBodyMember(Order = 1)]
    public int mm { get; set; }

    [MessageBodyMember(Order = 1)]
    public int ss { get; set; }
}

そして、WCF サービスでの私のアクション メソッドは次のようになります。

public RequestBody CheckTime(RequestBody objBody)
{

}

次のコードを使用してリクエスト SOAP XML を確認したとき:

OperationContext.Current.RequestContext.RequestMessage.ToString();

ヘッダー値を含む完全なリクエストSOAP XMLも提供しますが、オブジェクトにデシリアライズしません。

どこが間違っているのか、何かが欠けているのかわかりません。

同じ質問がありますが、今のところ回答がありません: WCF でカスタム SOAP ヘッダーを逆シリアル化するにはどうすればよいですか?

手伝ってくれてありがとう...

4

0 に答える 0