Я работаю над уровнем сервиса WCF, который использует message inspectors для регистрации запросов и сообщений о мыльных сообщениях.Регистрация запросов и ответов WCF с помощью Message Inspectors в конечной точке MSMQ
Вот инспектор, лишенный нерелевантного кода;
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.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, ...);
}
}