1

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

4

0 に答える 0