WCF和MSMQ - 转换消息体失去复杂参数

时间:2013-05-07 15:51:26

标签: wcf soap transformation netmsmqbinding msmq-wcf

我正在尝试通过WCF和MSMQ发送消息,并在发送之前对消息内容应用转换。

我可以在Client Message Inspector的BeforeSendRequest事件中捕获消息,将消息作为xml抓取并对其应用Xslt转换,该转换必须替换soap消息中的参数值,该消息在构建消息时为null。当消息到达另一个端点时,即使我已尽力在消息中插入值,该参数仍为null。

如果我对包含预期参数的消息进行硬编码都按预期工作,那么当我应用转换时,它只会“失败”并带有空值。不知道我在这里做了一些根本错误的事情(我是大多数这些话题的新手)或者我的肥皂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

0 个答案:

没有答案