.NET Remoting
От: Аноним  
Дата: 28.02.06 11:17
Оценка:
Привет всем. Я только начал изучать .NET Remoting. Есть приложение-сервер и приложение-клиент. Конфигурационный файл сервера
<configuration>
  <system.runtime.remoting>
    <application name="JobServer">
      <service>
        <wellknown mode="Singleton" type="JobServerLib.JobServerImpl, JobServerLib" objectUri="JobURI" />
      </service>
      <channels>
        <channel ref="http" port="8080">
          <serverProviders>
            <formatter  ref="soap" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>


Конфигурационный файл клиента
<configuration>
  <system.runtime.remoting>
    <application name="JobClient">
      <client>
        <wellknown type="JobServerLib.JobServerImpl, JobServerLib" url="http://localhost:8080/JobURI"/>
      </client>
      <channels>
        <channel ref="http" port="0">
          <serverProviders>
            <formatter ref="soap" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>


Вроде все нормально, вызов функции RemotingConfiguration.Configure в клиенте происходит нормально. Проблема следующая. При вызхове следующей строки

 m_IJobServer.JobEvent += new JobEventHandler(this.MyJobEventHandler);


возникает эксептион — Cannot load file or assembly JobClient.exe bla bla bla. Вопрос — че за нафиг, и вообще связано ли это с .NET Remoting?

Инструмент — VS 2005.
Всем заранее спасибо.
Kolo.

Re: .NET Remoting
От: Hacker_Delphi Россия  
Дата: 28.02.06 12:43
Оценка: 1 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Привет всем. Я только начал изучать .NET Remoting. Есть приложение-сервер и приложение-клиент. Конфигурационный файл сервера

[skipped]
А>Вроде все нормально, вызов функции RemotingConfiguration.Configure в клиенте происходит нормально. Проблема следующая. При вызхове следующей строки

А>
А> m_IJobServer.JobEvent += new JobEventHandler(this.MyJobEventHandler);
А>


А>возникает эксептион — Cannot load file or assembly JobClient.exe bla bla bla. Вопрос — че за нафиг, и вообще связано ли это с .NET Remoting?

Да, связано... чтобы подписаться на обработку делегата, надо чтобы на сервере был тип, который подписывается.
Как вариант — сделать ProxyClass (не путать с XXXProxy из .Net Framework) примерно так:
public class EventProxy
{
    public void Event(object sender, EventArgs e)
    {
        if (RealEvent != null)
            RealEvent(sender, e);
    }
    
    public event EventHandler RealEvent;
}

Описать этот класс в серверной сборке и подписывать его метод на события (на клиенте, естессно) и на клиенте же подписаться на его события... примерно так:
public void ClientEventSubscription()
{
    EventProxy proxy = new EventProxy();
    serverObject.Event += new EventHandler(proxy.Event);
    proxy.RealEvent += new EventHandler(MyEventHandler);
}

тогда все запашет...
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: .NET Remoting
От: Аноним  
Дата: 28.02.06 13:10
Оценка:
Большое спасибо, все заработало, но не до конца. Скажи пожалйста, какой раздел в MSDN описывает данную проблему, чтобы мне самому понять в чем дело.
Re[3]: .NET Remoting
От: Arboz Россия  
Дата: 28.02.06 13:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Большое спасибо, все заработало, но не до конца. Скажи пожалйста, какой раздел в MSDN описывает данную проблему, чтобы мне самому понять в чем дело.


Может поможет:
http://www.genuinechannels.com/Content.aspx?id=27&amp;type=1
Re[3]: .NET Remoting
От: Hacker_Delphi Россия  
Дата: 28.02.06 13:53
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Большое спасибо, все заработало, но не до конца. Скажи пожалйста, какой раздел в MSDN описывает данную проблему, чтобы мне самому понять в чем дело.

да нет такого раздела специального — надо просто понимать, что для того, чтобы вызвать метод (а что есть делегат, как не скрытый вызов метода) надо чтобы объект был на сервере.
P.S.
кстати, заьыл указать в том исходнике, что нужно наследоваться от MarshalByRefObject...
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[4]: .NET Remoting
От: varennik  
Дата: 28.02.06 14:14
Оценка: +1
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>кстати, заьыл указать в том исходнике, что нужно наследоваться от MarshalByRefObject...

И еще переопределить InitializeLifeTimeService
---
Если ты хочешь рассмешить Бога — расскажи ему свои планы на будущее
Re[2]: .NET Remoting
От: Аноним  
Дата: 01.03.06 09:33
Оценка:
Большое спасибо всем, ща приложение нормально запускается, функуии серверного объекта вызываются, тока чтото при генерации события на сервере оно не доходит до клиента.

События подключаются как написано выше:

// event connecting            
m_IJobServer.JobEvent += new JobEventHandler(proxy.Event);
proxy.RealJobEvent += new JobEventHandler(MyJobEventHandler);


Класс JobEventProxy:

    public class JobEventProxy : MarshalByRefObject
    {
        public event JobEventHandler RealJobEvent;

        public void Event(object sender, JobEventArgs args)
        {
            if (RealJobEvent != null)
                RealJobEvent(sender, args);
        }

        public override object InitializeLifetimeService()
        {
            return null;
        }
    }


Ну и наконец функция серверного объекта, которая генерит событие:

     private void NotifyClients(JobEventArgs args)
        {
            System.Delegate[] invkList = JobEvent.GetInvocationList();
            IEnumerator ie = invkList.GetEnumerator();

            while (ie.MoveNext())
            {
                JobEventHandler handler = (JobEventHandler)ie.Current;
                try
                {
                    IAsyncResult ar = handler.BeginInvoke(this, args, null, null);
                }
                catch (Exception e)
                {
                    if (LogEvent != null) LogEvent(e.ToString());
                    JobEvent -= handler;
                }
            }
        }


Может я чего забыл?
Re[3]: .NET Remoting
От: Hacker_Delphi Россия  
Дата: 01.03.06 10:30
Оценка:
Здравствуйте, <Аноним>, Вы писали:

поставь вместо BeginInvoke просто Invoke — сразу узнаешь что не так...
попробуй на клиенте добавить вот такой код до инициализации:
Hashtable props = new Hashtable();
props.Add("port", 0);
//тут serverSinkProvider с TypeFilterLevel.Full инициализируется.
TcpChannel channel = new TcpChannel(props, serverSinkProvider, null);
channel.StartListen(0);
ChannelServices.RegisterChannel(channel);
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[4]: .NET Remoting
От: Аноним  
Дата: 01.03.06 10:50
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, <Аноним>, Вы писали:


H_D>поставь вместо BeginInvoke просто Invoke — сразу узнаешь что не так...

H_D>попробуй на клиенте добавить вот такой код до инициализации:
H_D>
H_D>//тут serverSinkProvider с TypeFilterLevel.Full инициализируется.
H_D>TcpChannel channel = new TcpChannel(props, serverSinkProvider, null);
H_D>channel.StartListen(0);
H_D>ChannelServices.RegisterChannel(channel);
H_D>


Мне чето непонятно, почему serverSinkProvider и серверный канал надо инициализировать на стороне клиента?
Re[5]: .NET Remoting
От: Hacker_Delphi Россия  
Дата: 01.03.06 11:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>Мне чето непонятно, почему serverSinkProvider и серверный канал надо инициализировать на стороне клиента?

потому, что при вызове делегатов клиент становится сервером и наоборот...
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[6]: .NET Remoting
От: __kolo  
Дата: 01.03.06 11:46
Оценка:
Спасибо за советы, надеюсь я еще не достал)). Добавил все как написано выще, но происходит следующее:
1. Если оставить handler.BeginInvoke(...), то по-прежнему события не доходят до клиента.
2. Если же поставить просто handler.Invoke(...), то на этом вызове программа тихо умирает, без каких-либо опознавательных знаков ((.

Вот такие вот пироги.
Re[6]: .NET Remoting
От: __kolo  
Дата: 01.03.06 12:36
Оценка:
Теперь мне погятно, что мне надо клиент наследовать от MarshallByRefObj, только студия не дает наследовать оконный класс от MarshallByrefObj. Возможно ли вообзе такое? или мне надо написать новый класс для клиента, который будет существоавть отдельно от оконного класса?
Re[6]: .NET Remoting
От: Аноним  
Дата: 01.03.06 13:01
Оценка: 1 (1) +1
Ну множественное наследование в .NET не поддерживается, поэтому это не получится. Конечно, лучше создать отдельный класс и не смешивать интерфейс с логикой приложения.


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