WCF ziņojumu konduktori

Viss ir jauki un WCF savā ziņā daudzās jomās ir sevi attaisnojis.

Nesen nācās realizēt klienta prasību un pierakstīt pilnīgi visu, kas iziet un kas ienāk sistēmā, ja integrācijā ar ārējām sistēmām tiek izmantots kāds protokols, kas māk ar savu klonu sarunāties pa drāti.

Šim nolūkam izmantojām WCF – Windows Communication Foundation. Nākamā timekļa servisu reinkarnācija. Jauka tehnoloģija.

Līdz šim WCF atkļūdošana tika veikta ar dažādiem rīkiem (piemēram, Trace funkcionalitātes ieslēgšana ar programmatūras konfigurācijas failu palīdzību un ģenerēto failu aplūkošanu ar ServiceTraceViewer).

Tomēr šīs visas atkļūdošanas iespējas strādā ar ārējiem failiem un citām maģijām, kas dotajā situācijā nebija īsti pielietojamas (kaut gan vienu brīdi jau likās sakarīga doma, rakstīt failā un pēc tam failu saglabāt datu bāzē).

Tomēr lai arī cik sakarīga nelikās iepriekšēja doma, tomēr kaut kas teica priekšā, ka veids, kādā varētu nolasīt izejošo pieprasījumu īsi pirms tas pamet klienta izpildes moduli un tiek fiziski no gādāts gala mērķī, un ienākošo atbildi uzreiz pēc tās saņemšanas no otra servisa.

Un jā :) Tā kā WCF sastāv no ļoti daudziem maziem āķīšiem (angl. hooks), tas nozīmē, ka ļoti daudzas vietas ir papildināmas vai pat aizstājamas ar nepieciešamo uzvedību. Papētot sīkāk objektu modeli, atklāju interesantu interfeisu: System.ServiceModel.Dispatcher.IClientMessageInspector, kas paredzēs tieši šādiem mērķiem.

Šis interfeiss definē 2 metodes:

  • BeforeSendRequest: iespējams darīt savas lietas, pirms paša pieprasījuma izsūtīšanas.
  • AfterReceiveReply: iespējams veikt nepieciešamās operācijas tiklīdz atbilde ir saņemta.

 

Lai šādu ziņojumu konduktoru pielietotu, tas ir jāpievieno klienta izpildes modulim ziņojumu konduktoru kopai. Pievienošana notiek ar System.ServiceModel.Description.IEndpointBehavior interfeisa palīdzību, no kura reāli izmantojas tikai ApplyClientBehavior metode.

 

Pilns izejas kods nepieciešamajam ziņojumu konduktoram ir:

 

public class MessageViewerInspector : IEndpointBehavior, IClientMessageInspector

{

    public string RequestMessage { get; set; }

    public string ResponseMessage { get; set; }

 

    #region IClientMessageInspector Members

 

    public void AfterReceiveReply(ref Message reply, object correlationState)

    {

        this.ResponseMessage = reply.ToString();

    }

 

    public object BeforeSendRequest(ref Message request, IClientChannel channel)

    {

        this.RequestMessage = request.ToString();

        return null;

    }

 

    #endregion

 

    #region IEndpointBehavior Members

 

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)

    {

    }

 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)

    {

        clientRuntime.MessageInspectors.Add(this);

    }

 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)

    {

    }

 

    public void Validate(ServiceEndpoint endpoint)

    {

    }

 

    #endregion

}

 

Pirms pieprasījuma izsūtīšanas un pēc atbildes saņemšanas saturs ir pieejams tipa mainīgajos RequestMessage un ResponseMessage.

Ziņojuma konduktora izmantošana notiek pavisam vienkārši:

 

var inspector = new MessageViewerInspector();

using (var svc = new WCFWSSoapClient())

{

    svc.Endpoint.Behaviors.Add(inspector);

    var result = svc.MethodCall();

    Console.WriteLine(inspector.RequestMessage);

    Console.WriteLine(inspector.ResponseMessage);

}

 

Kopsummā izskatās diezgan vienkārši. Vienīgais prasītos kāda efektīvākā veidā šādas nianses piedāvāt arī plašākai oficiālās dokumentācijas lasītāju lokam.

 

 

Cerams, ka noderēs!

Published Tuesday, September 08, 2009 10:16 PM by valdis.iljuconoks
Filed under:

Comments

# re: WCF ziņojumu konduktori

What a joy to find such clear thinking. Thanks for psoting!

Thursday, June 02, 2011 4:13 PM by Makendra

# re: WCF ziņojumu konduktori

AKAIK you've got the asnwer in one!

Friday, June 03, 2011 4:56 PM by Lavigne

Leave a Comment

(obligāts) 
(obligāts) 
(brīvizvēles)
(obligāts)