Remoting. Обработка событий объекта на сервере.
От: Alexey_Sarantsev  
Дата: 03.12.04 05:31
Оценка:
Здравствуйте.

Remoting... Первые шаги

Нужно заставить 2 (или более) приложений общаться между собой. Хочу реализовать так: на сервере активизируется объект некоторого класса, содержащего некоторе событие. На клиентах есть обработчики события. Клиент, который хочет что-то "сказать", вызывает событие, другие клиенты его обрабатывают.
Вообще, правильно ли я делаю?

Теперь сама реализация.
Тот самый класс (вернее, сборка с ним), активизируемый на сервере:


using System;
   namespace Race 
   {
      public delegate void RaceEvent (string Message);
     
      interface IRaceInterface
        {
          void PutMessage (string Message);    
          event RaceEvent SendMessage;
        }

      public class RaceRemoteClass :MarshalByRefObject, IRaceInterface 
       {
          public string Name;
          public RaceRemoteClass()  { }
          public event RaceEvent SendMessage;
          public void PutMessage (string Message)
             {
               if (SendMessage!=null) SendMessage(Message);
             }
        }
   }



Далее: App.config для сервера:


   <configuration>
      <system.runtime.remoting>
        <application name="ServerApplication">
          <channels>
            <channel ref="http" port="25001" />
               <serverProviders>            
                   <provider ref="wsdl" />            
                     <formatter ref="soap" typeFilterLevel="Full" />            
                     <formatter ref="binary" typeFilterLevel="Full" />
               </serverProviders>
               <clientProviders>
                   <formatter ref="binary" />
               </clientProviders>    
          </channels>
          <service>
            <wellknown 
              mode="Singleton" 
              type="Race.RaceRemoteClass, RaceRemoteClass" 
              objectUri="Test.rem" />
          </service>
        </application>
      </system.runtime.remoting>
    </configuration>

App.config для клиента:


   <configuration>
       <system.runtime.remoting>
         <application>
             <channels>
               <channel ref="http" port="0">        
                 <clientProviders>            
                    <formatter ref="binary" />
                 </clientProviders>
                 <serverProviders>            
                    <formatter ref="binary" typeFilterLevel="Full" />
                 </serverProviders>            
                </channel>
             </channels>
             <client>
                <wellknown 
                   type="Race.RaceRemoteClass, RaceRemoteClass" 
                   url="http://localhost:25001/ServerApplication/Test.rem" />
             </client>
         </application>
       </system.runtime.remoting>
     </configuration>


Так же на клиенте:


  RemotingConfiguration.Configure("ClientApplication.exe.config");
   this.raceRemotedClass = new RaceRemoteClass(); //отрабатывает корректно
   raceRemotedClass.SendMessage += new RaceEvent(this.OnEvent) ;


Вылетает Exception:
An unhandled exception of type 'System.Security.SecurityException' occurred in mscorlib.dll
Additional information: Type System.DelegateSerializationHolder and the types derived from it (such as System.DelegateSerializationHolder) are not permitted to be deserialized at this security level.
Понимаю, дело в настройках безопасности NET 1.1, но я же установил typeFilterLevel! Как быть?
Читал в форумах: надо в каталог с сервером кидать сборки клиентов. а можно ли обойтись без этого (сервер не знаето клиентах)??

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.