我正在开发一个 WCF 服务层,它利用消息检查器来记录请求和回复肥皂消息。
这是检查器,去掉了不相关的代码;
public class ServiceInspectorBehavior : Attribute, IDispatchMessageInspector, IServiceBehavior
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
// pass request to BeforeSendReply method
return request.ToString();
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
string requestMessage = (string)correlationState;
string responseMessage = reply.ToString();
LogManager.Log(request, response);
}
}
一切都很好,很花哨,直到出现了一个新的业务需求,这将最适合MSMQ,所以我正在实施一个 MSMQ 端点。这里的问题是消息传递是单向的。
[OperationContract(Name = "EnqueueRequest", IsOneWay = true)]
即使我构建了一个响应对象,检查员的 BeforeSendReply 方法中的“回复”也将为空,因为不会将任何内容发送回客户端。
目前唯一看似合理的事情是将日志记录从消息检查器转移到我的消息处理器逻辑中,在那里我处理请求并构建响应。如果可能的话,我仍然更喜欢保留我当前的设置。
问题是,虽然看起来不太可能,但“是否可以使用 MSMQ 在检查器的 BeforeSendReply 方法参数中包含回复消息?”。
提前致谢。问候。
编辑 2015.08.27
我已经放弃了使用 Message Inspector 进行日志记录。现在登录我的服务层。这就是我所做的。我仍然愿意接受建议。
public ResponseBase ProcessRequest(RequestBase requestObject)
{
string requestString = string.Empty;
string responseString = string.Empty;
try
{
requestString = DataContractSerializerHelper.SerializeObject(requestObject);
// ...
// Do magic stuff, build a response object, etc
// ...
responseString = DataContractSerializerHelper.SerializeObject(responseObject);
return responseObject;
}
catch(Exception e)
{
// Handle/log exception, return a default response, etc
}
finally
{
Logger.Log(requestString, responseString, ...);
}
}