yog*_*ogi 1 c# wcf logging idispatchmessageinspector
我正在尝试记录来自 WCF 服务的请求和响应。到目前为止我所做的是:
public class OutputMessageInspector : IDispatchMessageInspector
{
int lastLogId;
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
// Parse request & read required information
// Insert request data into log tables
// Set lastLogId to the id created above
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
// Parse reply
// Using lastLogId update the response column in database table
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但我有一个担忧:
AfterReceiveRequest
并且BeforeSendReply
必须同步工作,以便BeforeSendReply
更新正确的记录。我想到的情况是服务同时从多个客户端调用,问题:
lastLogId
在多个请求和响应之间混乱和混乱吗?BeforeSendReply
可以在多个客户端同时调用服务的情况下正常工作?如果是,请给我一个解释,以确保我的想法;如果否,请提供更好的解决方案。我同意 @Schneiders 解决方案,使用 WCF 日志记录来满足您的要求。
不过回答你的问题:
此日志记录在 BeforeSendReply 处专门更新是否可以在多个客户端同时调用服务的情况下正常工作?
不,不会。的实例IDispatchMessageInspector
在调用之间共享。
correlationState
不使用成员属性,而是通过on支持调用特定数据IDispatchMessageInspector
。无论返回什么对象都AfterReceiveRequest()
将作为correlationState
to传递BeforeSendReply()
。
换句话说,这样的事情应该有效:
public class OutputMessageInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
// Parse request & read required information
// Insert request data into log tables
// Set lastLogId to the id created above
return lastLogId
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
// Parse reply
int lastLogId = (int)correlationState;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2881 次 |
最近记录: |