WCF と MSMQ を介してメッセージを送信し、送信前にメッセージ コンテンツに変換を適用しようとしています。
Client Message Inspector の BeforeSendRequest イベントでメッセージをキャプチャし、メッセージを xml として取得し、Xslt 変換を適用して、メッセージが作成されたときに null だった SOAP メッセージのパラメーター値を本質的に置き換えることができます。ただし、メッセージが他のエンドポイントに到着すると、メッセージに値を挿入するために最善を尽くしたにもかかわらず、パラメーターはまだ null です。
期待されるパラメーターを含むようにメッセージをハードコーディングすると、すべて期待どおりに機能しますが、変換を適用すると null 値で「失敗」するだけです。ここで何か根本的に間違っているのか (これらのトピックのほとんどは初めてです)、それとも SOAP xml が単に間違っているのかわかりません。
応答をハードコーディングしたときに作成された xml を調べ、これを変換の基礎として使用しました。出入りするときにメッセージを調べ、名前空間をいじって、一掃されるまでグーグルで検索しました...どんな助けも大歓迎です!
変換されたメッセージの本文部分は次のとおりです。
<s:Body>
<ImportClientOrders xmlns="urn:OrderServices.UI.Services/Contract/2013/05">
<clientOrderSourceId>2</clientOrderSourceId>
<clientOrderData xmlns="" xmlns:osCod="urn:OrderServices.UI.Services/Schemas/2013/05" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<osCod:OperationResult i:type="osXml:string" xmlns:osXml="http://www.w3.org/2001/XMLSchema">TestString</osCod:OperationResult>
<osCod:OperationSucceeded>true</osCod:OperationSucceeded>
</clientOrderData>
</ImportClientOrders>
変換では、ソース メッセージからすべてのノードをコピーし、「clientOrderData」要素を上記の xml に置き換えます。
対象契約は以下の通りです。
[ServiceContract(Namespace = "urn:OrderServices.UI.Services/Contract/2013/05")]
public interface IOrderManagementService
{
/// <summary>
/// Import new orders into the sytem and acknowledge them with the end client
/// </summary>
/// <param name="clientOrderSourceId"></param>
/// <param name="clientOrderData"></param>
[OperationContract(IsOneWay = true)]
void ImportClientOrders(int clientOrderSourceId, ClientOperationResult clientOrderData);
}
ClientOperationResult のデータ コントラクトは次のとおりです。
[DataContract(Namespace="urn:OrderServices.UI.Services/Schemas/2013/05")]
public class ClientOperationResult : IClientOperationResult
{
#region Implementation of IClientOperationResult
/// <summary>
/// Inidicates whether or not the operation was a success
/// </summary>
[DataMember]
public bool OperationSucceeded { get; set; }
/// <summary>
/// The result, if any of the operation
/// </summary>
[DataMember]
public object OperationResult { get; set; }
#endregion
}
OperationResult は Object 型であり、実行時に文字列を提供していることに注意してください。それがこれに関係しているかどうかわかりませんか?私が言うように、ハードコードされた ClientOperationResult を提供すると機能しますが、変換で同じことをしようとすると機能しません。
それがすべて明確であることを願っています。ありがとう、W