Сборка .NET, используемая классическим ASP, работает один раз, затем генерирует исключение ObjectRefNotSetException - PullRequest
1 голос
/ 15 декабря 2011

Я создал сборку .NET в VS2010 для использования веб-приложением Vendor в Classic ASP.

  • Сборка скомпилирована для .NET 3.5 (на компьютере DEV)
  • У меня есть локальный компьютер IIS Dev, работающий под управлением Windows XP Pro с IIS 5.1
  • Я установил сборку на «Сделать Com Visible»
  • Сборка установлена ​​на «Регистрация для COM»Interop "
  • На компьютере разработчика я регистрирую dll, используя regasm mydll.dll / codebase
  • На компьютере разработчика я предоставил учетным записям пользователей IUSR и IWAM доступ на чтение к реестру HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones

То, что происходит, - это то, что сборка используется во время проверки входа в систему для поиска пользовательских типов, которые определяют макет страниц на основе их типа.Asp отлично работает в первый раз после входа в систему и возвращает тип без ошибок.Но если я выйду из системы или закрою страницу и снова войду в систему, ASP выдаст ошибку в моем com-объекте Object Reference, а не в экземпляре объекта.Почти как GC не поднимает объект после завершения регистрации.Объект не установлен как глобальный объект и используется только при проверке страницы входа в систему.Я пытался утилизировать, а не удалять на классической странице ASP, и получаю те же результаты.

Я в растерянности относительно того, что мне нужно сделать, чтобы решить эту проблему.Я провел последние 3 дня, читая примеры и темы по этому вопросу, но я не сталкивался ни с кем другим с такой же проблемой.Буду очень признателен за любые идеи, помощь или что-то еще.

Это главная сборка

namespace rd_custom
{
    [ClassInterfaceAttribute(ClassInterfaceType.AutoDual), EventTrackingEnabled]
    public class rd_Custom
    {
        private rd_Logger rdLog;
        private XmlDocument DADoc;

        public String getRequesterType(String reqId, String dbProf)
        {
            //"Logic is Here to do user Lookups"

            rd_sqlCon rdCon = new rd_sqlCon();
            rdCon.rdLog = rdLog;     // This is Disposed and Set to null later as well
            rdCon.LoadSqlConfig(dbProf, "requester_type");
            String[] parms = new String[1];
            parms[0] = "requester_id|" + reqId;
            DataTable dt = rdCon.builDataTable(parms);
            rdCon.Dispose();   //*Answer
            rdCon = null;      //Previously was setting to null

            return strRequesterType;
        }
    }
}

Это классический ASP, ссылающийся на COM

Dim ls_requester_type
Dim rdCustomObj
Set rdCustomObj = Server.CreateObject("rd_custom.rd_custom")
*Err*ls_requester_type = rdCustomObj.getRequesterType(CStr(l_l_requester_id), CStr(l_s_db_profile))*
If ls_requester_type <> "ERROR" Then
    Session("RequesterType") = ls_requester_type
End If
Set rdCustomObj = nothing    
...