Путаница на стороне сервера с ASP.NET
Я пытаюсь создать веб-страницу, которая позволит пользователю захватывать изображения с камеры, подключенной к серверу, с использованием ASP.NET. Камера - это Olympus, и код на стороне сервера имеет доступ ко всем синхронным вызовам, которые находятся в SDK камеры.
Проблема возникает, когда я пытаюсь сделать снимок.
В SDK он работает так, что сначала вы приказываете камере сделать снимок, а затем добавляете слушателя к событию, которое запускается камерой, чтобы затем начать загрузку изображения с камеры, как только он завершит захват изображения.
Событие никогда не запускается, поэтому я не могу загрузить изображение с камеры.
Код, который связывает слушателя с функцией и говорит камере сделать снимок, находится внутри кода на стороне сервера.
По сути, мне интересно, как можно получить прослушиватель событий для чего-то, что меняется на сервере, например, состояние камеры, которая подключена.
2 ответа
Я ожидаю, что у вас будут проблемы с этим. Например, я уверен, что камера предполагает, что она одновременно используется одним настольным приложением. Вызов его из веб-приложения сильно отличается, так как каждый запрос может быть от другого пользователя и может не иметь отношения к тому, что уже происходит с камерой.
Я рекомендую вам общаться с камерой через службу Windows. Служба будет взаимодействовать с веб-приложением через службу WCF, размещенную в службе Windows. Он скажет камере сделать снимок и прикрепится к событию. При возникновении события оно загружает изображение с камеры и возвращает его вызывающей стороне веб-службы.
Служба WCF, вероятно, должна была бы гарантировать, что только один пользователь одновременно использует камеру. Если камера уже используется, ей придется отклонить вызов.
Захват событий на стороне сервера может быть немного сложнее. Прошло много времени с тех пор, как я сделал это, поэтому я пишу полностью из моей туманной памяти...
Присоединение к событию на стороне сервера из класса страницы представляет проблему с жизненным циклом класса. После доставки страницы экземпляр класса больше не находится в области видимости, поэтому любой обработчик событий, назначенный камере, также больше не находится в области действия. Мы использовали два разных механизма для борьбы с этим.
А) Назначить статический метод обработчику событий. Статический метод не привязан к конкретному экземпляру класса и будет сохраняться даже после того, как экземпляр страницы больше не будет находиться в области видимости.
B) Назначьте метод в классе GLOBAL для захвата события в событии Application(или session)_Start. Это также удерживает обработчик событий за пределами класса страницы.
В любом из этих случаев ваши обработчики событий должны будут установить некоторый флаг, который может быть прочитан глобально, чтобы указать, что изображение готово, и ваша страница должна будет опросить страницу (или обработчик) или обновить, чтобы узнать, что изображение готово.
Вам также нужно будет рассмотреть возможности создания класса API камеры. Если экземпляр класса является членом класса страницы, он падает с лица земли, как только страница завершает свою работу, и событие не будет инициировано. Класс камеры должен быть статическим, глобальным или порожденным другим независимым потоком.
Надеюсь, мои туманные помехи помогут. Удачи.