Nesen sanācis bija darboties ar WCF ziņojumu inspektoriem un citām interesantām un varbūt brīžiem nesaistītām lietām.
Ziņojumu inspektori ir interesanta vieta, kur ievietot savu plumbing code un veikt nepieciešamos vingrojumus pirms pieprasījuma izsūtīšanas otram saņēmējam un pēc atbildes saņemšanas – labākā vieta, kur veikt izejošo un ienākošo ziņojumu žurnalizēšanu.
#region IClientMessageInspector Members
public void AfterReceiveReply(ref Message reply, object correlationState)
{
// do something
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
// do something
return null;
}
#endregion
Kods ir ērts, mazs un pārskatāms.
Problēma rodas apstāklī, ka patiesībā starp šīm abām metodēm ir nepieciešams veikt tā saucamo korelāciju – jeb BeforeSendRequest metode veic izejošā ziņojuma žurnalizēšanu (piemēram, INSERT operācijas izpilde kādā Log tabulā) un pēc brītiņa, kad no endpointa ir saņemta atbilde – tiek izsaukta ziņojuma inspektora AfterReceiveReply metode, kurai attiecīgi ir jāveic pirmajā metodes izpildes laikā ģenerētā ieraksta modifikācija.
Pagāja pāris stundas kamēr pāraku MSDN, forumus un citas interesantas vietnes.. :)
Līdz beidzot izdomāju vēlreiz pārlasīt implementētā interfeisa dokumentāciju, kurā skaidri un gaiši (melns uz balta) stāv rakstīts: tas, ko jūs atgriezīsiet BeforeSendRequest metodes rezultātā, tiks padots AfterReceiveReply metodei, kā correlationState parametrs. Microsoft iesaka šajā vietā izmantot Guid.NewGuid() metodi, lai nodrošinātu, ka konkrētās aktivitātes korelācijas identifikācija ir unikāla :)
Nu ko, labākā vieta kur paslēpties, ir pašā degungalā :)
Cerams, ka noderēs!