Ищете способ предотвратить переписывание приложения без использования переменных сеанса.

StackOverflow https://stackoverflow.com/questions/279066

  •  07-07-2019
  •  | 
  •  

Вопрос

Наша компания использует приложение, которое изначально было ColdFusion + Access, позже преобразованное в классический ASP + MS Sql для отслеживания задач/времени, называемое системой запросов.Он разбит по отделам, поэтому есть один для MIS, маркетинга, логистики и т. д.Проблема возникает, когда (в основном менеджеры) используют более одного браузера одновременно, когда открыты два окна браузера.Система запросов использует переменные сеанса, множество переменных сеанса, «сеанс» упоминается в приложении 2300 раз.Когда 2 открыты одновременно, как вы можете себе представить, это вызывает всевозможные аномалии из-за путаницы переменных.

В системе есть запрос MIS трехлетней давности, чтобы «исправить» это, и над ним работали три разработчика, и теперь моя очередь попытаться это исправить.Мне было интересно, приходилось ли кому-нибудь еще работать над таким проектом, и был ли какой-то хак, чтобы попытаться смягчить некоторые проблемы.Я подумывал о том, чтобы вызвать что-нибудь в global.asa для загрузки разного.переменные сеанса из строки запроса.Проблема в том, что происходит всякое:

If (Session("Application") <> Request("App")) and Request("App") <> "" THEN
  Session("Application") = Request("App")
End If

Глядя на функции во включаемых файлах, вы увидите функцию с 4 параметрами, которая ссылается на 6 различных переменных сеанса.Итак, вы поняли, это будет больно.

Кому-нибудь приходилось делать что-то подобное в прошлом?Есть ли какие-нибудь хаки, которые вы нашли полезными?

Это было полезно?

Решение

рефакторинг кода вне прямого интерфейса Session (" независимо от "):

<Ол>
  • создайте API для доступа к сеансу и замените им все существующее использование сеанса (это может быть сеанс «класс / объект» или просто включаемый файл)
  • манипулируйте переданными именами переменных сеанса с помощью чего-то, что сделает их уникальными для каждого домена в соответствии с вашими потребностями (отдел или что-то еще)
  • тщательно протестируйте
  • затем переписать все это позже на современном веб-языке и / или найти другую работу, прежде чем они попросят вас совершить еще одно чудо; -)

    Другие советы

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

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

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

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

    Кроме того, переписывание не всегда лучший вариант. Вы никогда не знаете, какие забавные бизнес-логики / исправления ошибок теряются при переписывании.

    Я согласен с AnonJr

    Blockquote с открытым браузером должен начать две отдельные сеансы BlockQuote

    возможно, использование статических глобальных переменных приводит к потере данных

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

    Private Const PREFIX As String = "MyPrefix_"
    Public Shared Property MyVariable() As String
        Get
            Return HttpContext.Current.Session(String.Concat(PREFIX, "MyVariable"))
        End Get
        Set(ByVal value As String)
            HttpContext.Current.Session(String.Concat(PREFIX, "MyVariable")) = value
        End Set
    End Property
    
    Цикл

    для поиска переменных сеанса, которых нет в вашем классе

    For Each Item As Object In HttpContext.Current.Session.Contents
        If Not Item.ToString.StartsWith(PREFIX) Then
    
        End If
    Next
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top