我有一个带有多种方法的 WCF 服务。我想记录来自客户端的原始请求,无论它是如何发送的。一种方法接受数据作为查询字符串(严格用于遗留支持),我可以使用以下方式记录:
OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri
在这种情况下就足够了,但其他方法允许客户端使用由 svcutil.exe 生成的代理类将数据作为 XML 发送。在这种情况下,我在 s:Body 中找到了我想要的数据:
OperationContext.Current.RequestContext.RequestMessage
不幸的是,无论我尝试什么,我都无法在读取之前创建消息的缓冲副本。这是一个例子:
public CascadeResponse SendCustomer(Customer c)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
}
但是,在 SendCustomer 的第一行,我收到以下错误:
此消息无法支持该操作,因为它已被读取。
这就是我创建缓冲副本的目的,确定吗?我猜我在这里做错了。
编辑:
好的,所以方法现在是这样的:
public CascadeResponse SendCustomer(Message requestMessage)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
Customer c = msg.GetBody<Customer>();
string clientKey = "1111"; // This should be the clientKey string passed to the function along with the customer
return SendLead(c, clientKey);
}
我的问题是我不知道如何将 Customer 和 ClientKey 作为单独的实体发送。我可以使 clientKey 成为 Customer 的属性(或创建一个专门用于传入数据并包含 Customer 和 ClientKey 作为属性的自定义对象),但如果可能的话,我想避免这种情况,因为这是对遗留系统的升级已经这样工作了。
我也无法使用 svcUtil.exe 创建我的代理类 - 我假设具有上述方法签名意味着我的服务将不再宣传正确的签名来发送请求?不确定这是否足够清楚 - 如果我唯一的输入法接受 Message 对象,我的客户怎么知道要发送 Customer 和 ClientKey?