我正在尝试通过 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