Куда указывает Прозрачный Прокси? - PullRequest
1 голос
/ 20 декабря 2009

Я использую .Net Remoting. У меня есть служба, предоставляющая одноэлементный класс, который клиент на другом компьютере может зарегистрировать, чтобы сервер мог передавать сообщения всем зарегистрированным клиентам.

  MessageManager mgr = MessageManager.Instance; //Static Singleton Factory Proprty
  RemotingServices.Marshal(mgr, MesgURI);

Теперь в моем сервисе, в методе, в котором я публикую эти сообщения, я хочу, чтобы код не отправлял одно и то же сообщение одному и тому же клиенту более одного раза. Поэтому я перебираю делегат сервера. InvocationList

public event MessageArrived SendMsgToClientEvent;
Delegate[] clientList = SendMsgToClientEvent.GetInvocationList();
List<int> dels = new List<int>();
foreach (Delegate d in clientList)
    try
    {
       mAH = (MessageArrived)d;
       int tgtHC = mAH.Target.GetHashCode();
       if (dels.Contains(tgtHC))        // If we already sent  
           SendMsgToClientEvent -= mAH; // to this one, delete it
       else 
       {
          mAH.BeginInvoke(msg, OnMsgCallComplete, null);
          dels.Add(tgtHC);    // keep track of which ones we've sent to
       }
    }
    // ..... 

Теперь каждый делегат mAH содержит метод (который будет вызываться при вызове делегата). Он также содержит свойство Target, которое (например, методы) заполняется ссылкой на объект, который будет вызываться этим методом. против.

Но для таких удаленных событий делегат заполняется регистрацией событий от удаленных клиентов по каналу .Net Remoting. Таким образом, в этом случае это целевое свойство заполняется объектом Transparent Proxy , а не объектом в удаленном клиентском окне, где фактически будет выполняться обработчик. Таким образом, я предполагаю, что даже если две регистрации делегатов происходят от одного и того же метода на одном и том же удаленном объекте, они все равно получат отдельные прозрачные прокси-серверы на сервере. Теперь я хочу убедиться, что, если конкретный клиент регистрируется несколько раз, сервер не передает одно и то же сообщение более одного раза этому клиенту. (... и затем удалите этот дополнительный делегат из Списка вызовов).

Итак, мой вопрос: как я могу судить по просмотру делегата или по прозрачному прокси в Target Property делегата, что два таких делегата на самом деле принадлежат одному объекту на одном клиентском компьютере?

...