Лучший способ обмена данными типа "состояние сеанса" между двумя приложениями.net

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

мы создали новый проект, он наследует glob al.asax основного проекта, а также очень хорошо обращается к web.config основного проекта, однако в глобальном коде asax есть сессия, проверяющая целостность данных, чтобы увидеть, если пользователь вошел в систему.. это то, где мы получаем проблемы.. пользователь вошел в систему, но сайт выдает ошибку, заявив, что он вошел в систему, потому что аддон-проект не может получить доступ к идентификатору пользователя сеанса, который установлен основным проектом.

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

также мы не хотим идти по пути мьютексов... хотим держаться подальше от оконного кодирования, если сможем

Схема сайта о том, что происходит с сеансом: пользователь входит в систему с помощью asp-кода (код.net 1.1), пользователь проходит аутентификацию и успешно входит в систему, отправляет guid для этого пользователя в базу данных, основной проект (код.net 2.0) захватывает, что guid, захватывает данные пользователей и сохраняет идентификатор пользователя в сеансе. любая страница, которая требует знания того, кто пользователь, получает его из сеанса ("идентификатор пользователя")

Итак: мы создаем еще один проект, который наследует global.asax, может получить доступ к web.config - DONE!

Кроме того, мы хотим, чтобы этот новый проект содержал страницу (функция добавления из основного проекта), чтобы эта страница обращалась к сеансу ("идентификатор пользователя"), установленному из основного проекта. - НЕ УВЕРЕН, КАК ЭТО СДЕЛАТЬ...

6 ответов

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

Это было сказано...

Поскольку эти два приложения должны выполняться в разных процессах (как и в разных версиях среды выполнения), они не могут напрямую обмениваться данными.

Одним из вариантов может быть использование веб-служб или удаленного взаимодействия. Вы можете иметь объект CustomSession, в котором хранятся все данные сеанса, и идентифицировать каждый из них по Guid. Вы можете отслеживать все существующие сеансы, созданные в приложении A с помощью Guid-CustomSession, и передавать Guid через строку запросов в приложение B. Приложение B может запрашивать приложение A с помощью Guid через веб-службу или удаленное взаимодействие и получать обратно соответствующий объект CustomSession., Вы можете сделать то же самое в обратном порядке.

Единственная проблема здесь - вы должны убедиться, что Guid всегда указывается в URL при переходе от страницы в приложении A к странице в приложении B или наоборот. Приложение всегда может проверить, если сеанс не существует, чтобы вернуться к использованию Guid, чтобы увидеть, есть ли у другого приложения сеанс.

Имейте в виду, что некоторые структуры данных.NET (не многие) по-разному сериализуются между.NET 1.1 и 2.0, поэтому при совместном использовании объектов через удаленное взаимодействие или веб-службы вам может потребоваться учитывать это.

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

Если вы собираетесь сделать это самостоятельно, есть еще одна проблема, ранее не упоминавшаяся: время ожидания сеанса. Вам нужно убедиться, что оба процесса имеют одинаковое представление о том, когда сеанс использовался в последний раз. Если вы не сделаете это правильно (и я столкнулся с этим), вы рискуете попасть в состояние, когда похоже, что вы вошли в одну часть приложения, а не в другую.

Я знаю, что вы сказали, что хотите держаться подальше от Session State Server....

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

Но опять же, что бы вы ни делали, чтобы делиться данными сеанса, так же, как указывал другой автор "Рекс М", вы должны быть осторожны с тем, каким типом данных сеанса вы делитесь и что они должны быть сериализуемы.

Вы можете использовать куки для хранения вашего UserID. Обе ваши приложения 1.1 и 2.0 могут получить к нему доступ без каких-либо проблем.

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

Рекс М: мы пытаемся обмениваться данными сессий между одними и теми же версиями.net.. оба работают под управлением.net 3.5, (работает на платформе.net 2.0), у нас уже есть код для передачи данных для входа в систему 2.0.

у нас работает основной проект, однако мы хотим добавить к нему модули, которые, как мы думали, проще говоря, если вы добавляете другое веб-приложение.net, не используете пространства имен и настраиваете сервер состояний сеанса, настраиваете свои ссылки, а затем компилировать, все будет подливкой..

оба приложения (те, которые пытались обмениваться данными сеанса) работают на платформе 2.0, оба находятся в одном пуле приложений, оба с одним и тем же ключом компьютера, и информация о сервере состояний, оба выполняются на одном компьютере, просто из разных папок, (общий доступ к одной родительской папке, однако)

Есть ли что-нибудь, что мы можем сделать, чтобы заставить это работать?

(без использования сервера состояний sql).

Другие вопросы по тегам