Почему делает мой ASP.NET, который “контекст” статической функции перекрестно соединяет между сеансами пользователя?

Сделайте это:

label.text = [NSString stringWithFormat:@"%d", count];
7
задан Matt Hamsmith 16 September 2009 в 19:44
поделиться

5 ответов

Одно из возможных решений - использовать [ThreadStatic].

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute (VS.71) .aspx

Он сделает вашу статику на поток. Однако есть каветы, поэтому вам следует проверить их.

2
ответ дан 6 December 2019 в 08:15
поделиться

Каждый запрос к сайту asp.net поступает и обрабатывается в собственном потоке. Но каждый из этих потоков принадлежит одному и тому же приложению. Это означает, что все, что вы помечаете как статическое, используется для всех запросов и, следовательно, для всех сеансов и пользователей.

В этом случае функция MyFunc , которая является частью вашего класса страницы, копируется поверх статического Элемент Func в A с каждым page_init, поэтому каждый раз, когда любой пользователь выполняет page_init, он заменяет на A.Func , используемый все запросы.

11
ответ дан 6 December 2019 в 08:15
поделиться

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

4
ответ дан 6 December 2019 в 08:15
поделиться

Я не буду пытаться улучшить объяснения статических членов в других ответах, но хочу указать другой способ кодирования вашей непосредственной проблемы.

В качестве решения вы может создать экземплярно-ориентированную версию вашего класса A , сохранить ее в переменной уровня страницы и передать ее конструктору Q при загрузке страницы:

public class MyPage: Page {
    private A2 _a2;

    // I've modified A2's constructor here to accept the function
    protected Page_Init() { this._a2 = new A2(MyFunc); }

    protected Page_Load() { 
        Q myQ = new Q(this._a2); 
        // etc..
    }
}

Фактически , если нет настоятельной необходимости объявлять A2 ранее, вы можете просто создать его экземпляр при создании своего экземпляра Q в Page_Load .

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

4
ответ дан 6 December 2019 в 08:15
поделиться

Если вы хотите, чтобы данные сохранялись только для текущего запроса, используйте HttpContext.Items : http://msdn.microsoft.com/en-us/library/system.web.httpcontext.items.aspx

Если вы хотите, чтобы данные сохранялись для сеанса текущего пользователя (при условии, что у вас включено состояние сеанса ) используйте HttpContext.Session : http://msdn.microsoft.com/en-us/library/system.web.httpcontext.session.aspx

1
ответ дан 6 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: