I just found a bug in my Access plugin which exposed another bug on the Milestone side.
When sending an Access Control Event into Milestone one of the fields on an ACEvent is an IEnumerable relatedCredentialHolders. Milestone expects that to be a list of valid credential holders but does not rigorously check that. I did NOT test sending invalid IDs, that may or may not be caught on the Milestone side. What I was doing was sending in a List with exactly one item, a null string. Milestone processed this event and actually entered it into the DB. As soon as this happens with a single event for a portal the smart client is no longer able to show ANY events for that portal on the access control tab. Upon further investigation, the following XML in inserted into the Central.Event_Active_Data table:
<d2p1:string i:nil=“true” />
That part in the middle is an accurate representation of what I sent into Milestone in the ACEvent. Unfortunately, the Smart Client doesn’t seem to be able to process that so it stops displaying any events for that portal (even ones with a valid CredentialHolder). The only way to get my events back was to manually remove these events from the DB (or just editing the XML and removing <d2p1:string i:nil=“true” /> from the event).
I’m not sure if the Smart Client should be fixed to allow parsing that data, or if the data should not be allowed into the DB in the first place. Probably both. Let me know if you need any more information.