Сеанс ASP.NET и хранение объектов, использующих COM-взаимодействие

Я работаю над веб-сайтом asp.net. Мы должны использовать com-взаимодействие для взаимодействия с устаревшими компонентами ActiveX vb6. Компоненты во многих случаях полагаются на получение объекта контекста (который сам является компонентом activex vb6) в качестве параметра. Создание объекта контекста довольно затратно.

Поэтому одна идея состоит в том, что объект контекста создается один раз и сохраняется в сеансе asp.net. Однако, если этот объект является просто оболочкой .net вокруг компонента activex, разумно или целесообразно сохранять такой объект в сеансе?

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

Я понимаю другие ограничения и вещи, о которых вам необходимо знать при использовании сеанса asp.net, вопрос о сеансе aspnet.

Чтобы задать вопрос немного по-другому: есть ли у них какие-либо проблемы или проблемы с хранением объекта .net, который является просто оболочкой вокруг объекта com?


person Jon    schedule 08.10.2008    source источник


Ответы (2)


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

ASP.NET по умолчанию инициализирует COM в своих потоках, чтобы поместить поток в многопоточную квартиру. Компоненты VB6 были в лучшем случае образцом квартиры. Это означает, что когда поток MTA создает компонент, он помещается в основную STA, если она уже существует (что для рабочих процессов ASP.NET не будет), или новый поток создается специально для STA. Не имеет значения, какой поток MTA создает компонент, один и тот же STA всегда используется для компонентов, которые не могут обрабатывать модель MTA. Это означает, что для каждого вызова этих компонентов используется один и тот же поток, поэтому одновременные вызовы должны ждать в очереди.

Чтобы указать ASP.NET инициализировать COM для однопоточных компонентов, что, по крайней мере, приведет к созданию объекта в том же потоке, что и выполняющаяся страница, добавьте атрибут AspCompat в @ Page.

Я бы не стал кэшировать объекты, так как при повторном использовании они, скорее всего, будут иметь проблемы с перекрестными потоками.

person Mike Dimmick    schedule 08.10.2008

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

person FlySwat    schedule 08.10.2008
comment
Он содержит информацию о пользователе. Следовательно, нельзя использовать в нескольких сеансах. Надо было прояснить это. - person Jon; 09.10.2008