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 があり、me
WCF サービスでオブジェクトへの 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 ヘッダーを逆シリアル化するにはどうすればよいですか?
手伝ってくれてありがとう...