Классические объекты ASP, файлы cookie и VB.NET COM+

Это запутано.

Мне передали веб-сайт, написанный на классическом ASP, с множеством закулисных вещей, выполненных в объектах VB6 COM+, вызываемых со страниц ASP через экземпляры Server.ObjectCreate(). Для этого воплощения подпрограммы VB6 были преобразованы в VB.NET, просто запустив на них инструмент преобразования Visual Studio 2003, а затем обновив этот файл решения до VS 2008. Таким образом, существует тысяча и один возможный источник ошибок.

Один из модулей VB6, который доставляет мне проблемы, очищает кучу файлов cookie Response по строкам следующей формы:

ASPResponse.Cookies("SysUserCode") = ""

Где ASPResponse определяется как:

Private ASPResponse As ASPTypeLibrary.Response

И был настроен на активацию объекта:

Set ASPResponse = objContext("Response")

При преобразовании этого модуля в VB.NET эти строки стали

ASPResponse = ContextUtil.GetNamedProperty("Response")

и

ASPResponse.Cookies("SysUserCode")() = ""

(обратите внимание на дополнительную пару круглых скобок. Я не очень разбираюсь в VB, поэтому не очень понимаю, что означает этот синтаксис.)

Хорошо, вот вопрос: когда этот код выполняется на МОЕЙ машине, эта строка выдает ошибку VB 13 с Error.Description «Указанное приведение недействительно». Хм? Какой актерский состав?

Кстати, этот модуль отлично работает на машине коллеги, и он не видит никакой разницы в конфигурации моей машины и соответствующих компонентов от его.

Я здесь совершенно в растерянности. Поиск в Google дал мне кучу информации о файлах cookie VB.NET или компонентах COM с VB.NET, но ничего, связанного с классическими файлами cookie ASP.


person Dave Hanna    schedule 08.02.2011    source источник
comment
Дальнейшее исследование: похоже, что недопустимое приведение фактически происходит при доступе к члену Cookies ASPResponse. Любой код, который обращается к ASPResponse.Cookies и всему остальному, выдает исключение Specified Cast not valid. Это заставляет меня задаться вопросом, нет ли чего-то неправильного в конфигурации, так что то, что передается со страницы ASP, несмотря на то, что к нему обращается именованное свойство Response, на самом деле не является объектом ASPTypeLibrary.Response. Просто предположил. Еще в полной растерянности.   -  person Dave Hanna    schedule 09.02.2011
comment
Миграция VB6 на VB.Net может быть довольно трудной, особенно если вы не слишком увлекаетесь VB! Я рекомендую чтение в фоновом режиме.   -  person MarkJ    schedule 09.02.2011


Ответы (2)


Is...

Private ASPResponse As ASPTypeLibrary.Response
Set ASPResponse = objContext("Response") 

...Опубликовать преобразование VB.NET? Если это так, вам нужно будет явно привести objContext("Response") к объекту ASPTypeLibrary.Response. Это особенно применимо, если Option Strict включен. например

ASPResponse = CType(objContext("Response"), ASPTypeLibary.Response)

Кроме того, операторы Set и Let не поддерживаются в VB.NET.

person George Johnston    schedule 08.02.2011
comment
ты прав, Джордж. Я только что присмотрелся к методу Activate и отредактировал приведенное выше. Теперь здесь отображается фактическая строка, которая устанавливает ASPResponse. (ASPResponse = ContextUtil.GetNamedProperty(Ответ)) - person Dave Hanna; 09.02.2011
comment
Option Strict вероятно выключен, так как код был перенесен из VB6 - person MarkJ; 09.02.2011
comment
@MarkJ Это возможно - посмотреть никогда не помешает;) - person George Johnston; 09.02.2011

Это МОЖЕТ быть связано со способом активации узла COM-компонента. Я прочитал другое сообщение ([Клаус Х. Пробст])1, в котором указывалось, что для для доступа к элементу Response необходимо было активировать COM-компонент как библиотеку (в отличие от сервера), чтобы он работал в пространстве процесса ASP. Поэтому я попытался изменить тип активации хостингового приложения Компонента на библиотеку, несколько раз сбросить и перестроить, и теперь я могу получить доступ к элементу Cookies ответа. Однако мой коллега по-прежнему запускает хост-приложение в качестве сервера, и у него нет проблем.

person Dave Hanna    schedule 10.02.2011