Задача такая:
Есть ремотинг сервер который оформлен в виде службы.
Есть IIS на этой же машине. Необходимо чтобы http запросы к ремотинг объектам
уходили к этой службе. Хостинг ремотинг сервера под IIS не предлагать.
Cлужба не может зарегистрировать http канал с 80 портом, его занял IIS.
А хостить ремотинг сервер под IIS мне нельзя.
Написал для этого свой HttpRemotingHandler подглядев искодники microsoft,
но там в реализации метода InternalProcessRequest идет конфигурирование сервера из настроек web.config
Потом ищется канал только что зарегистрированный. Проблема в том что ChannelServices.RegisteredChannels возвращает
каналы зарегистрированные этим приложением, а то что регистрировала моя служба в RegisteredChannels нет.
Если бы достучаться до канала зарегистрированного моей службой то проблемы небыло.
Можно попробовать оформить канал в службе в виде ремотинг объекта а в HttpRemotingHandler стучаться к нему,
но это мне кажется уже извращение. Может есть другие нормальные способы?
Здравствуйте, ShtormX, Вы писали:
SX>Задача такая: SX>Есть ремотинг сервер который оформлен в виде службы. SX>Есть IIS на этой же машине. Необходимо чтобы http запросы к ремотинг объектам SX>уходили к этой службе. Хостинг ремотинг сервера под IIS не предлагать. SX>Cлужба не может зарегистрировать http канал с 80 портом, его занял IIS. SX>А хостить ремотинг сервер под IIS мне нельзя.
Прочитал несколько раз, ничего не понял.
Ты можешь создавать свое отдельное приложение с Net Remoting и протоколом http. Если приходит запрос с расширением rem, то IIS(точнее ISAPI) будет сам тебе пересылать запросы. И можешь навесить хоть на 80 порт, хоть на любой другой. Изменения в IIS, и вешать какие-то сервера на него, не надо.
IIS не пересылает запросы запущенной службе.
У меня remoting сервер уже оформлен как сервис и запущен и слушает другой http port,
80 он занять не может так как его забрал IIS.
IIS может пересылать запросы в том случае если хостить под ним ремотинг сервер, т.е.
IIS конфигурит из web.config remoting и сам создает remoting сервер.
Мне это не нужно, сервер у меня уже запущен, нужно только переслать этот апрос серверу.
В этом собственно и проблема, как это сделать.
Здравствуйте, ShtormX, Вы писали:
SX>Вообщем нужен редирект в службу из под asp.net.
Для редиректа вобщем то никакой asp.net не нужен, достаточно примитивного скрипта на asp, я в инете где то видел. Но это проблему не решит, если у тебя используются не well-known uri. В этом случае внутри ObjRef будет прописан ChannelUri, который, естественно, будет указывать на внутренний порт. И обращение к методам такого ObjRef, естественно, приведет к ошибке. Так что простой редирект не получится, придется писать либо хитрый Channel, либо собственный транспорт.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, ShtormX, Вы писали:
SX>>Вообщем нужен редирект в службу из под asp.net.
AVK>Для редиректа вобщем то никакой asp.net не нужен, достаточно примитивного скрипта на asp, я в инете где то видел. Но это проблему не решит, если у тебя используются не well-known uri. В этом случае внутри ObjRef будет прописан ChannelUri, который, естественно, будет указывать на внутренний порт. И обращение к методам такого ObjRef, естественно, приведет к ошибке. Так что простой редирект не получится, придется писать либо хитрый Channel, либо собственный транспорт.
У меня как раз well-known, я уже почти разобрался как перенаправлять вызовы, сделал HttpHandler,
пока получилось достукиваться до ремотинг сервера получать оттуда response, осталось этот response
правильно оформить и вернуть обратно клиенту.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, ShtormX, Вы писали:
SX>>У меня как раз well-known,
AVK>Тогда смысл в ремоутинге? Пользуйтесь веб-сервисами и проблем будет меньше.
Если бы мне нужен был веб-сервис я бы здесь не написал.
Если я запускаю ремотинг сервер как сервис или как консольное приложение,
то у меня как раз нет никаких проблем, если хостить под iis то мой сервак
не может корректно работать, я получаю в некотрых случаях System.ExecutionEngineException.
Причем ExecutionEngineException вылетает при обращении к com объектам (в консольном приложении и сервисе этого не наблюдается все работает отлично). Поэтому под asp.net я не вижу смысла ничего писать и хостить.
Вопрос еще открыт, может кто нибуть делал что то подобное или знает как побороть ExecutionEngineException.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, ShtormX, Вы писали:
SX>>Вопрос еще открыт, может кто нибуть делал что то подобное или знает как побороть ExecutionEngineException.
AVK>Где то втой замечательный СОМ-объект память портит.
Расскажу что с com объектами тогда, может так выкрутится можно будет.
Вообщем, есть unmanaged com приложение (ComApp), есть managed com написаные под него (ManComObjects),
ComApp работает с документами своего формата (mxd), и представляет набор класcов (ComDocument) для работы с этим документом без запуска ComApp приложения. В документе хранится описание сохранненых объектов как своих родных, так и моих добавленных в него ManComObjects, когда открывается ComDocument мои ManComObjects автоматически создаются (их создание вызывает umanaged код).
В ремотинг сервере идут вызовы
New ComDocument
ComDocument.Open
ComDocument.GetObject(i)
если GetObject(i) мой ManComObjects и ремотинг сервер хостится под iis то ловлю ExecutionEngineException
Если ремотинг сервер офрмлен в виде службы или консоли то все прекрасно работает
Юзерам можно к моему серверу пробится только по http 80
А чтобы работало по 80 надо хостить под iis, под iis нельзя там ExecutionEngineException
Посадил бы свой ремотинг сервер на 80 порт но не могу, iis его сожрал, убрал бы iis с этой машины но нельзя.
iis на другой порт перенапралять мне тоже нельзя.
Вот такая грустная история, сижу и думаю сразу идти к шефу сдаваться или подождать
Здравствуйте, ShtormX, Вы писали:
SX>если GetObject(i) мой ManComObjects и ремотинг сервер хостится под iis то ловлю ExecutionEngineException
Очевидно, что, возможно из-за нехватки прав, твой СОМ объект портит память, в результате чего и наблюдается ExecutionEngineException. Разобраться как и почему можешь только ты сам.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, ShtormX, Вы писали:
SX>>если GetObject(i) мой ManComObjects и ремотинг сервер хостится под iis то ловлю ExecutionEngineException
AVK>Очевидно, что, возможно из-за нехватки прав, твой СОМ объект портит память, в результате чего и наблюдается ExecutionEngineException. Разобраться как и почему можешь только ты сам.
С правами все нормально, у меня подозрение в том что aspnet_wp.exe как то криво стартует сервер, может что то с потоками связано. Вообщем ситуация тупиковая. Не используйте комы в ремотинге.
Здравствуйте, ShtormX, Вы писали:
SX>С правами все нормально, у меня подозрение в том что aspnet_wp.exe как то криво стартует сервер, может что то с потоками связано.
Знаешь, на этом aspnet_wp работает куча всевозможных приложение, так что вероятность проблемы в нем крайне мала.
SX> Вообщем ситуация тупиковая. Не используйте комы в ремотинге.
Видишь ли — ремоутинг полностью managed, а твоя ошибка свидетельствует о порче памяти. Так что ищи проблемы у себя.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, ShtormX, Вы писали:
SX>>С правами все нормально, у меня подозрение в том что aspnet_wp.exe как то криво стартует сервер, может что то с потоками связано.
AVK>Знаешь, на этом aspnet_wp работает куча всевозможных приложение, так что вероятность проблемы в нем крайне мала.
SX>> Вообщем ситуация тупиковая. Не используйте комы в ремотинге.
AVK>Видишь ли — ремоутинг полностью managed, а твоя ошибка свидетельствует о порче памяти. Так что ищи проблемы у себя.
Ошибка при передачи объекта из одного потока в другой,
GetObject(i) поднимает мой объект, делает return, а там где я его запрашивал, т.е. в ремоутинге получаем ExecutionEngineException
Т.е. просто не можем получить ссылку на объект. Наверное когда хостить по iis как то хитро запускаются потоки,
это уже не мой косяк, и вообще про ошибку ExecutionEngineException ниче толкового не написано, все по разному про нее говорят.