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