2015-08-21 4 views
2

Я работаю над уровнем сервиса 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, ...); 
    } 
} 

ответ

0

Можно ли иметь ответное сообщение в параметрах методы BeforeSendReply инспекторов, с помощью MSMQ?

Нет, это не так.

 Смежные вопросы

  • Нет связанных вопросов^_^