Держите COM-ссылку в веб-сервисе .net - PullRequest
1 голос
/ 01 апреля 2009

Я попытался создать интерфейс веб-сервиса для компонента COM, поддерживающего состояние.

Веб-сервис в основном содержит операции Start, Shutdown и GetCurrentState.

Старт создает COM-компонент, Стоп релизы. А GetCurrentState извлекает информацию из компонента COM.

Это казалось легким делом, но через день он все равно отказывается работать.

Я попытался сохранить COM-ссылку как переменную-член в объекте C #. Объект постоянно воссоздается. Затем я попытался сохранить COM-ссылку в объекте Session. Но все же что-то все еще не так.

Кто-нибудь знает, как один должен хранить ссылку на COM, которая должна оставаться в живых внутри веб-сервисов?
/ л

Ответы [ 2 ]

3 голосов
/ 01 апреля 2009

Предполагая, что вы используете ASMX здесь, а не WCF, где вы могли бы управлять временем жизни немного по-другому, каждый раз, когда приходит запрос в классе, который обслуживает запрос, он создается заново. Это стандартное поведение для ASMX.

Что вам нужно сделать, это сохранить COM-объект либо внутри коллекций Cache [] или Application []. Это может все еще быть разрушено, когда рабочий пул переработан. Вам нужен такой код:

public FooClass GetFooClassInstance()
{
    FooClass instance = (FooClass)this.Context.Application["FooClassInstance"];

    if (instance == null)
    {
        instance = new FooClass(); // Creates the RCW.
        this.Context.Application["FooClassInstance"] = instance;
    }

    return instance;
}

FooClass - это вызываемая оболочка во время выполнения для вашего COM-объекта. Содержимое объекта приложения сохраняется между запросами. Одна вещь, которую вы должны остерегаться - это модель потоков, которую использует COM-компонент, так как некоторые могут вызвать проблемы с производительностью, поскольку они маршалируют вызовы в одном потоке.

2 голосов
/ 01 апреля 2009

Веб-сервис по своей природе не имеет состояния. Попробуйте создать службу Windows и использовать веб-службу для управления ею. Метод start запускает службу Windows, и эта служба создает экземпляр COM-компонента. Метод GetCurrentState связывается со службой и получает ссылку на COM.

Другой подход - сделать ваш COM-компонент COM + доступным:

  1. Откройте Администрирование -> Службы компонентов.
  2. Открыть узел приложений COM +.
  3. Создать новое приложение. Выберите «Создать пустое приложение» на первом шаге мастера. Введите имя приложения и выберите опцию «Приложение сервера» на следующем шаге.
  4. Создать новый компонент. Выберите «Установить новые компоненты» в мастере. Найдите и выберите ваш COM DLL.
  5. Перейти к свойствам компонента и включить пул объектов. Установите минимальный и максимальный размер пула равным 1. Это сделает ваш компонент одиночным.
...