Совместное использование сеанса между двумя приложениями ASP.NET, где одно вложено в другое - PullRequest
6 голосов
/ 14 февраля 2011

Итак, прежде чем спросить: "Какого черта ты имеешь в виду, одно вложено в другое?" Я объясню это настолько просто, насколько смогу.

Существовало веб-приложение .NET (A). Было создано дополнительное приложение (B), которое работает с несколькими одинаковыми сборками ядра. Предыдущая консалтинговая компания каким-то образом «установила» приложение B в приложении A, чтобы B мог получить выгоду от сеанса A. Итак, как то так:

- Application A (C:\Inetpub\wwwroot\ApplicationA)
    + Application B (C:\Inetpub\wwwroot\ApplicationA\sup\ApplicationB

Предыдущая компания оставила ноль документации о том, как или почему они это сделали, но у них это сработало. Моя дилемма теперь такова: приложение А было обновлено, что сделало Б бесполезным. Я обновил B, чтобы запустить новое ядро, предоставленное A, но к тому времени, когда я закончил, другая команда уничтожила предыдущие производственные и тестовые серверы, и я не могу получить резервную копию, чтобы посмотреть, как оно было настроено.

После нескольких сует, я смог воспроизвести вышеприведенную иерархию в одном приложении и пуле IIS, разделив файл web.config для B и удалив дублирующиеся разделы - те, которые уже существовали в сети A .config. Я также выкинул все файлы из папки bin в папку B в папку bin.

Оба сайта компилируются и обслуживаются IIS, но я не могу ничего прочитать из сеанса A, используя эту структуру. Я не удивлен этим результатом, но мне нужно найти обходной путь. Короче говоря, A имеет сессионный идентификатор, сохраненный в своем сеансе, который мне нужно использовать для получения источника данных в B, из-за некоторых сумасшедших правил лицензирования, наложенных создателями A (этот sessionID должен быть передан каждой функции в их основном API для авторизация пользователя).

Любые идеи о том, почему эта функция больше не работает (при условии, что я правильно воспроизвел старую среду), или как я могу обойти ее? Переход на сервер SQL для состояния сеанса не вариант - я не могу ничего изменить в приложении A.

Я немного посмотрел на код А (столько, сколько я решаюсь с Reflector), и переменная, которую я пытаюсь извлечь из сеанса, все еще там и используется.

Любые мысли были бы великолепны!

1 Ответ

3 голосов
/ 15 февраля 2011

Поскольку они являются двумя отдельными приложениями, они (очевидно) имеют две разные области видимости.Вы можете иметь сеанс в одном, но не в другом, и сеанс в A может истечь раньше, чем сеанс в B, заставив A создать новый сеанс, пока B все еще использует старый.Нет ничего связывающего А с В или наоборот, поэтому логически нет простого способа, которым они даже могли бы делиться объектами, поскольку между ними нет значимой корреляции.

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

...