2017-02-13 17 views
0

Недавно я обнаружил ошибку в нашей системе, где свойство в dll было общим. В случае ASP.Net это вызвало проблемы с безопасностью потоков.Альтернатива HttpContext.Current.Items

protected static object Data { get; set; } 

Для того, чтобы исправить это с наименьшим изменением возможно, я выгружена внутреннее свойство, чтобы сделать использование HttpContext.Current.Items для хранения и извлечения значения. Это работает в случае наших веб-сайтов.

protected static object Data 
{ 
    get 
    { 
     return HttpContext.Current.Items[DataKey] as object; 
    } 
    set 
    { 
     HttpContext.Current.Items[DataKey] = value; 
    } 
} 

Однако у нас также есть exe, ссылающийся на эту dll. Когда это выполняется, (очевидно) не имеет ссылки на HttpContext.Current.

Есть ли альтернативный объект, который я могу использовать, который будет работать как для asp.net, так и для exe. Я хочу использовать ветвящуюся логику для определения того, какое свойство следует ударить, если это необходимо, пока мне нужно только изменить это свойство (очевидно, что одно из них является предпочтительным.

+0

Я нашел атрибут '[ThreadStatic]'. Будет ли это работать как для exe, так и для абонентов Asp.Net? –

+0

http://stackoverflow.com/a/407931/4172872 – levent

ответ

1

Так что атрибут [ThreadStatic] может потенциально помочь в этом сценарий, но он приходит с предостережениями

Скотт Hanselman написал Blog Post относительно использования ThreadStatic В частности, эта часть имеет отношение:..

не хлопнуть [ThreadStatic] атрибут на статический член когда вы работаете в ASP.NET, так как вы не контролируете жизнь потока ... вы наследуете рабочий поток. ThreadStatic предоставляет вам локальное хранилище потоков, а не локальное хранилище HttpContext!

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

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

[ThreadStatic] 
private static object _data; 

protected static object Data 
{ 
    get 
    { 
     if (HttpContext.Current != null) 
      return HttpContext.Current.Items[DataKey] as object; 
     else 
      return _data; 
    } 
    set 
    { 
     if (HttpContext.Current != null) 
      HttpContext.Current.Items[DataKey] = value; 
     else 
      _data = value; 
    } 
}