1

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

我可以在客户端消息检查器的 BeforeSendRequest 事件中捕获消息,将消息作为 xml 获取并对其应用 Xslt 转换,该转换实质上替换了构建消息时为空的 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>

在转换中,我从源消息中复制所有节点,并用上面显示的 xml 替换“clientOrderData”元素。

目标合同如下:

[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