Классический ASP с использованием COM + .Net Interop 64-разрядный Windows Server 2008 IIS 7 Server.CreateObject Fails

У меня возникла проблема, связанная с запуском .Net dll из классического приложения asp на 64-битном сервере Windows Server 2008 с IIS7. Ситуация следующая:

Я написал сборку .Net C # для выполнения некоторых задач шифрования. Эта сборка стала доступной для классической среды ASP путем наследования от ServicedComponent, гарантируя, что файл assemblyinfo имеет атрибут ComVisible (true), и она была установлена ​​с помощью командной строки regsvcs.

При тестировании на моем собственном рабочем столе (XP с IIS6) все работало нормально. При переходе на IIS 7 и Windows Server 2008 я получаю печально известную ошибку «Ошибка ASP 0177 Server.CreateObject».

Я безрезультатно пробовал следующее:

  1. Убедитесь, что на сервере установлены функции ASP и Script Extension, так как это не является значением по умолчанию для IIS7. Это позволило мне выполнять простые команды ASP, но не server.createobject для сборки .net.
  2. Включена поддержка 32-битных приложений для пула приложений, поддерживающего классический сайт asp.
  3. Используется NetworkService в качестве идентификатора для пула приложений, поддерживающего классический сайт asp.
  4. Пытался зарегистрировать dll с помощью regsvr32, но это не удалось
  5. Я могу создавать другие объекты, такие как "scripting.filesystemobject"
  6. Перемещение dll в каталог wow64 и затем использование regsvcs для их регистрации.
  7. И да, когда я выполнял команды regsvcs, они были из командной строки, запущенной с помощью администратора «RunAs». Команды regsvcs успешно зарегистрированы как в 64-битной, так и в 32-битной версиях. Однако при использовании из классического приложения asp это не удается.

Этот вопрос тесно связан с этим . Однако я думаю, что этот вопрос был больше связан с использованием инструментов на сервере, а не с программной проблемой, похожей на мою.

У кого-нибудь есть еще идеи, которые можно попробовать?


person Pat    schedule 15.08.2009    source источник
comment
Перейти на Windows 2003? Похоже, вам действительно не нужен 2008 год.   -  person NotMe    schedule 15.08.2009
comment
К сожалению, в этой ситуации у меня нет возможности перейти на Windows 2003. Большая часть веб-сайта будет построена на .Net, поскольку мы переносим классическое приложение asp на .Net. Итак, думаю, нам придется разобраться в проблеме :(   -  person Pat    schedule 17.08.2009


Ответы (3)


После большой помощи и дополнительных исследований мы наконец нашли ответ. Чтобы решить нашу проблему, мы сделали следующее:

  • Больше не наследовать от ServiceComponent (это нормально, поскольку мы фактически не используем какие-либо конкретные функции COM +)
  • Для установки компонента использовались следующие команды, которые необходимо делать по порядку:

    gacutil / i "C: \ Inetpub \ wwwroot \ ASPTest * имя библиотеки *"

    regasm / tlb "C: \ Inetpub \ wwwroot \ ASPTest * имя библиотеки *"

Этот процесс устранил исходные ошибки, а также имел дополнительное преимущество, заключающееся в возможности замены dll во время работы IIS.

person Pat    schedule 27.08.2009

Попробуй это

Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM +

Откройте объект приложения COM +.

Открытые компоненты.

Щелкните класс правой кнопкой мыши и выберите «Свойства».

В разделе «Дополнительно» есть флажок «Разрешить внутренние свойства IIS».

Меня устраивает

person Community    schedule 25.09.2009

Создайте тестовый файл vbs и попробуйте создать там свой COM-объект. Если вы не можете (т.е. получаете ту же ошибку), значит, ваш компонент не зарегистрирован правильно. Если можете - значит, он был установлен правильно, и проблема в отсутствии разрешений для учетной записи, под которой ваше приложение выполняется в IIS.

person DmitryK    schedule 15.08.2009
comment
Спасибо большое за идею. Мне удалось получить сценарий VBS, успешно создавший объект. Итак, я начал смотреть разрешения. Чтобы быстро увидеть, были ли проблемы с разрешениями, я добавил следующие локальные учетные записи в группу администраторов (конечно, только для тестирования), которые ВСЕ ЕЩЕ не позволяли странице asp создавать объект: Анонимный вход в систему Пользователи, прошедшие проверку подлинности, Интерактивная сетевая служба IUSR, Все - person Pat; 17.08.2009
comment
Прохладный. Мы приближаемся. Посмотрите здесь: windows2008forum.com/f9/com-problem-in -ws2008-263.html Включили ли вы 32-битный режим совместимости для скриптов и элементов управления? Также проверьте последний пост на странице 1. - person DmitryK; 17.08.2009
comment
Спасибо за эти идеи. Но я уже установил для свойства Enable 32-Bit Applications значение true для пула приложений, используемого классическим виртуальным каталогом asp. Я считаю, что метод сценария, описанный в приведенной выше ссылке, - это просто способ сделать то же самое до IIS7. Теперь это просто вариант конфигурации в пуле приложений ... Есть другие идеи? - person Pat; 17.08.2009
comment
под какой учетной записью работает ваш пул приложений? Можете ли вы проверить разрешения для этой учетной записи? Есть ли в этой учетной записи хотя бы RX на самой DLL? - person DmitryK; 17.08.2009
comment
В настоящее время мой пул приложений выполняется в NetworkService. Однако я уже выполнил задачу добавления этой и нескольких других учетных записей в группу администраторов на сервере, поэтому я думаю, что мы уже прошли этот путь. См. Мой первый комментарий для справки. Спасибо. - person Pat; 17.08.2009
comment
Еще интересная информация: при запуске файла vbscript из cmd.exe (расположенного в system32) createobject работает. Однако, если я попытаюсь запустить тот же сценарий vbscript с помощью cmd.exe, расположенного в папке SysWow64, оператор createobject сценария vbs завершится ошибкой. Насколько я понимаю, папка SysWow64 содержит 32-битные версии. Я полагаю, что это похоже на то, как мое классическое приложение asp также работает в 32-битном режиме. Итак, я думаю, что мы имеем дело с 32-битной и 64-битной проблемой, а не с какой-то проблемой с разрешениями ... - person Pat; 17.08.2009
comment
Ага! При регистрации DLL - убедитесь, что вы запустили regsvr32 из каталога WOW64, чтобы 32-битная DLL могла правильно зарегистрироваться. Лучше отменить регистрацию вашей DLL (regsvr32 / u name.dll), а затем заново зарегистрировать ее должным образом. - person DmitryK; 18.08.2009
comment
На самом деле regsvr32 выходит из строя с сообщением об ошибке: точка входа DllRegisterServer не найдена. Regsvr32, если я правильно помню, я думаю, предназначался для старых com dll. Методом регистрации сборки, обернутой в net com, является regsvcs или regasm (который я уже пробовал в 32-битной и 64-битной версиях). Я думаю, что нам, возможно, придется открыть дело с Microsoft, если мы не сможем найти способ решить эту проблему. - person Pat; 19.08.2009
comment
Очень хороший. Использовали ли вы переключатель / codebase при регистрации DLL взаимодействия (regasm)? - person DmitryK; 19.08.2009
comment
Также какой код ошибки вы получаете при попытке создать объект? Это 8000FFFF или что-то другое? - person DmitryK; 19.08.2009