gpt4 book ai didi

asp.net - 如何在 WCF 服务中记录原始请求

转载 作者:行者123 更新时间:2023-12-04 00:19:46 25 4
gpt4 key购买 nike

我有一个带有多种方法的 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?

最佳答案

我找到了一个其他人也可能觉得有用的解决方案。创建 MessageInspector 允许您将代码附加到“AfterReceiveRequest”和“BeforeSendReply”事件,如下所示:

public class MessageInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
request = buffer.CreateMessage();
LogMessage("Received:\n{0}", buffer.CreateMessage().ToString());
return null;
}

public void BeforeSendReply(ref Message reply, object correlationState)
{
MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
reply = buffer.CreateMessage();
LogMessage("Sending:\n{0}", buffer.CreateMessage().ToString());
}
}

有一个 full tutorial for setting up message inspectors fo wcf here .我会说,当您将行为扩展添加到 app.config/web.config 时,请小心检查您的完全限定程序集名称。

希望其他人觉得这很有用。

关于asp.net - 如何在 WCF 服务中记录原始请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10248482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com