2
我正在使用WCF服務層,它利用message inspectors來記錄請求和回覆soap消息。在MSMQ端點上使用消息檢查器記錄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方法無效,因爲沒有人會被髮送回客戶端。
目前看起來似乎有道理的唯一事情是將日誌從消息檢查器移動到我的消息處理器邏輯中,在此處理請求並構建響應。如果可能的話,我仍然喜歡保留當前的設置。
問題是,雖然看起來不太可能,「在檢查員的BeforeSendReply方法參數中是否可以使用MSMQ來回復消息?」。
在此先感謝。 此致敬禮。
編輯2015年8月27日
我使用消息督察拋棄記錄。現在登錄我的服務層。這是我所做的。我仍然樂於接受建議。
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, ...);
}
}