![]() |
|
Модераторы: gambit |
![]()
|
|
| Grambler |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
проблема в том, что если допустим надо поменять Conf.Config.ClientGT.RemoteIP, Conf.Config.ClientGT.RemotePort то при повторной регистрации вылетает следующий эсепшен Попытка перенаправить активацию для типа 'GTServer.GTRemoteServer, ServerGTAssembly', которая уже перенаправлена
Это сообщение отредактировал(а) Дрон - 17.5.2007, 11:03 |
||||
|
|||||
| tol05 |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 6 Всего: 170 |
Смотри, пример с MSDN (http://msdn2.microsoft.com/en-us/library/h...x8b(VS.80).aspx)
а ты предлагаешь сделать так:
Вопрос отпал? Попробуй вот что: RemotingConfiguration.RegisterActivatedClientType(...) убери ввобще, а работай через Activator/ пример с MSDN превращается в
Это сообщение отредактировал(а) tol05 - 16.5.2007, 16:14 -------------------- На хорошей работе и сны хорошие снятся. |
||||||
|
|||||||
| Grambler |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
все гениальное просто ? ))
|
|||
|
||||
| Grambler |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
не работает
ексепшен {"Конструктор для типа \"GTServer.GTRemoteServer\" не найден."} |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 6 Всего: 170 |
Покажи весь код. Завтра я тебе его верну исправленным. Сегодня не успею.
И на будущее: удаленный объект всегда должен иметь public конструктор по умолчанию (без параметров) это аксиома для ремоутинга! Только так ремоутинг и создает удаленные объекты! Другого способа не бывает! -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Grambler |
|
||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
конструктор разумеется есть привожу код тестового проекта удаленный класс
сервер
клиент:
после замены
на
вылетает эксепшен "Конструктор для типа \"тип" не найден."} Это сообщение отредактировал(а) Grambler - 17.5.2007, 09:55 |
||||||||||||
|
|||||||||||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 3 Всего: 61 |
Grambler, пардон за вопрос, а почему бы не настроить весь ремоутинг через .config файл и не париться?
|
|||
|
||||
| Grambler |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
можно конечно, просто есть необходимость вынести настройки ремоутинга в общие настройки программы но при их изменении (ip, port) приходится перезапускать программу |
|||
|
||||
| tol05 |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 6 Всего: 170 |
Но если их не вынести в конфиг, то тогда
Grambler, прийдется перекомпиливать приложение и заново клиентам развозить А теперь по твоему коду. Раз обещал, надо фиксать. Устал я, пока понял, в чем причина. Их даже несколько. Во-первых, я забыл, что Activator позволяет создавать инстансы не только для ремоутинга и дал тебе не ту перегрузку метода вот правильный вариант (по крайней мере рабочий)
во-вторых, ты тоже оказывается не промах. Почему ты не упомянул, что юзаешь ДВА удаленных объекта, а не один? А второй - тоже сокет использует!!! И настройки не меняются (9001 порт при каждом вызове насилуется). Вот эксепшен и вылетает. Ты смотри не только сообщение об эксепшене, но и его свойство InnerException! Как только я закоментал
и все, что с ним связано, все заработало. Потом раскоментал, закоментал этот долбанный сокет на 9001 порт, тоже работает. вот весь код, без комментов и мусора. Только в объекте я комменты оставил. удаленный объект
клиент
сервер
все. Удачи. P.S. Все никак не могу успокоиться Если просто на сервере создать RemoteMessageObject remMesObj = new RemoteMessageObject(); RemoteMessageObject remMesObj2 = new RemoteMessageObject(); то это нормально, статическая переменная у тебя, одна на все экземпляры приложения. Но ты одну эту переменную создаешь на сервере, а другую - на клиенте. А Компьютер - один! поэтому и IP у двух приложений совпадают Ты попробуй два раза сервер из проводника запустить, тоже самое будет, завалится оно. Это сообщение отредактировал(а) tol05 - 17.5.2007, 15:50 -------------------- На хорошей работе и сны хорошие снятся. |
||||||||||
|
|||||||||||
| Grambler |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
спасибо за советы
вечерком буду тестить |
|||
|
||||
| Grambler |
|
||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
я как раз и выношу ip, port в настройки, но не в App.config, в общие программы проблема следующая: при запуске клиент пытается подключиться, если неудачно, то настройки надо изменить, но после изменения подключиться не удается, только перезапуском клиента.
проверил я твой код если в клиенте создавать подключение твоим способом
то выполняется конструктор вложенного статического объекта
и при создании сокета - ошибка если же использовать прием из книжки
то все нормально, конструктор выполняется только при первом сооздании объекта, при запуске сервера
сервер должен быть один, его не может быть много вывод: твой пример в книжках по ремоутингу я не видел, может он не годится ? похоже, что у тебя создается объект на клиенте а не на сервере, отсюда и ошибка |
||||||||||||
|
|||||||||||||
| tol05 |
|
||||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 6 Всего: 170 |
возьми, поставь в строчке "Count++;" конструктора класса RemoteMessageObject брейкпоинт, закоментай на клиенте Activator.CreateInstance() и все что я написал, поставь свою конструкцию с new. Запусти в отладке сервер, а потом - клиент. Когда будешь запускать клиента - поток остановится - конструктор выполняется и при первом создании (на сервере) и при втором (на клиенте). Как объяснить? Причем, если при втором создании посмотреть в Call Stack, то можно увидеть
А ты консольный вывод внимательно смотрел? На сервере и клиенте? Консоль сервера:
Консоль клиента:
если на клиенте создается, то как сервер это пишет?! Как у него в remMesObj Count становится равным 2?!
Почему Activator.CreateInstance() вызывает статический конструктор второй раз? Смотрел рефлектором. Похоже, что сначала Activator.CreateInstance вызывает у себя метод Assembly.InternalLoad() с хитрыми параметрами, сборка удаленного объекта грузится в домен клиента. И только потом вызывается перегруженный метод Activator.CreateInstance(), который возвращает прокси! да я просто пример привел, когда на один 9001 порт вешается два выполняющих процесса. а ты уверен, что все книжки по ремоутингу прочитал? P.S. Да, Activator действительно сначала грузит класс в память клиента. Но все равно, потом вызывает прокси. В принципе, можно и с ним работать, в конце-концов, если ремоутинг на разных машинах будет, то и порты у них разные единственное, до чего докопался, так это то. что можно код упростить, не создавать ObjectHandle и UnWrap() не вызывать:
Это сообщение отредактировал(а) tol05 - 18.5.2007, 12:24 -------------------- На хорошей работе и сны хорошие снятся. |
||||||||||||||
|
|||||||||||||||
| Grambler |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
конструктора класса RemoteMessageObject будет выполнятся столько, раз сколько создается объект класса, а конструктор MyRemoteClass должен запускаться только один раз, при первом создании объекта класса RemoteMessageObject, т.к. remObject - статик поле этого класса
собственно у меня так все и работало в твоем примере MyRemoteClass вызывается при каждом создании RemoteMessageObject
уверен что не все книжки которые читал ты тоже кинь ссылками если есть ч-ть интересное |
||||
|
|||||
| tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 6 Всего: 170 |
Ты не следишь за собственными высказываниями
ты написал: Какой конструктор? Мне показалось, ты имел в виду RemoteMessageObject() я ответил:
а теперь ты мне:
Извини, по-моему мы просто оба устали что такое я догадывался и раньше Да, два раза, но не в одном процессе, иначе бы валился бы MyRemoteClass не в конструкторе, а гораздо раньше, до конструктора и не дошел бы. Валится из-за того, что статический член класса RemoteMessageObject, создаваемого в процессе клиента (но только временно, до вызова прокси) пытается повеситься на порт, где висит статический член класса RemoteMessageObject, создаваемого в процессе сервера. Пока больше ничем помочь не смогу. Но мои объяснения про Activator мне и самому, если честно, не очень нравятся. Я еще наведу справки, если что-то прояснится, сообщу. полезная книжка по ремоутингу Маклин С., Нафтел Дж,, Уильяме К. "Microsoft .NET Remoting" http://www.zipsites.ru/books/maklin_microsoft_net_remoting/ старовата, но по второму фреймворку ничего вроде не выходило. Да и изменения незначительны -------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
| Grambler |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
нет, я имел ввиду что в твоем примере конструктор MyRemoteClass() выполнялся при создании, как на серверк, так и на клиенте а в моем только 1 раз на сервере, на клиенте уже нет, поэтому и ошибки с сокетом не было
не понял в чем вопрос, но вот оно private static MyRemoteClass remObject = new MyRemoteClass(); извиняюсь, за недостаточно корректные фразы и туманные объясения |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Распределённые приложения и сеть | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |