Яке використання для IHttpHandler.IsReusable?


104

Я пишу IHttpHandlerі потрібно буде реалізувати IsReusableвластивість. Коли я переглядаю документацію MSDN, вона говорить:

Отримує значення, що вказує, чи може інший запит використовувати екземпляр IHttpHandler.

Це не дуже допомагає. У яких ситуаціях я повинен використовувати оброблювач багаторазового використання та в яких ситуаціях він не може бути повторним?

Наступні запитання:

  1. Що таке повторне використання?
  2. Чи можу я підтримувати стан (тобто змінні класу), коли Reusable = true??


"Повторне використання" означає обробляти більше одного запиту з певним екземпляром обробника. Ви можете зберігати що-небудь у сесії - це не вплине, коли екземпляр обробника буде випущений.
Ірландський начальник

@IrishC Directortain Це так, як .Net зберігає мішок з екземплярами HttpHandlers, вибирає один і просто подає йому контекст?
Kees C. Bakker

1
@IrishCperortain зараз я використовую його для простого потоку деякої інформації журналу. Але я намагаюся дізнатися, що означає розуміти, коли і як використовувати IHttpHandlers. Вони є забутою рисою багатьох.
Kees C. Bakker

Відповіді:


93

Це властивість вказує, чи можна обробити декілька запитів одним і тим же екземпляром IHttpHandler. За замовчуванням в кінці конвеєра запиту всі обробники http, які розміщені в обробникуRecycleList HttpApplication, встановлені на нуль. Якщо обробник повторно використовується, він не буде встановлений на нуль, а екземпляр буде повторно використаний у наступному запиті.

Основний виграш - продуктивність, оскільки буде менше об'єктів для збору сміття.
Найважливішим больовим моментом для багаторазового використання є те, що він повинен бути безпечним для ниток. Це не банально і вимагає певних зусиль.

Я особисто пропоную залишити значення за замовчуванням (не для багаторазового використання), якщо ви використовуєте лише керовані ресурси, оскільки збирач сміття повинен легко обробляти їх. Приріст продуктивності від багаторазових обробників зазвичай незначний порівняно з ризиком впровадження важко знайти помилок з потоком.

Якщо ви вирішили повторно використовувати обробник, вам слід уникати збереження стану в змінних класу, оскільки, якщо доступ до екземпляра обробника здійснюється одночасно, кілька запитів записують / читають значення.


1
Ваша остання рекомендація уникати збереження стану у змінних класів трохи заплутана. Якщо припустити, що ви встановили IsReusable на false, то чи не було б можливості іншого запиту (одночасно чи ні) отримати доступ до того ж екземпляра цього HttpHandler, і тому підтримання стану в змінних класів було б безпечним?
Бен Амада

2
Звичайно. Я перефразував останню рекомендацію, підкресливши, що вона застосовна лише в тому випадку, якщо IHttpHandler буде повторно використаний. Дякую за роз’яснення, Бен!
Браніслав Абаджимарінов

7
Для чого це варто, я реалізував багато, багато IHttpHandlerз IsReusableзаданими trueі не мав жодних проблем. Головне, що потрібно пам’ятати - не мати будь-яких змінних до класу, а скористатися локальними змінними у своїх функціях.
дата

6
Чудове пояснення. Ясно і до точки. Я хотів би, щоб статті MSDN були такими стислими.
AlexVPerl

1
@Branislav - Якщо я правильно зрозумів вашу відповідь. Неможливо, що різні потоки одночасно використовують різні екземпляри обробника, але також можливо, що різні потоки одночасно виконують ідентичний екземпляр обробника?
Ян

11

Мабуть, це зберігає обробник в пам'яті та здатний обробляти декілька запитів. Якщо встановлено значення false, він повинен створити новий екземпляр обробника для кожного вхідного запиту.

Ось питання, яке показує, що відбувається, коли воно не використовується належним чином:

Потокове передавання зображень на базі даних за допомогою HttpHandler


Чи є у вас якась документація, що підтверджує вашу відповідь?
Kees C. Bakker

4
Як ви, я не міг знайти задовільної документації на MSDN, тому мені довелося перевірити завантаження зображень із бази даних на сторінку веб-сайту електронної комерції, а потім спостерігати, що сталося :)
IrishC Directortain

5

Переробити оброблювач дешевше, ніж новий, кожного разу, коли надходить запит, і сервер розширює менше пам'яті, полегшуючи роботу, яку повинен виконувати GC. Якщо обробник перебуває в стані, коли розгляд нового запиту не буде проблематичним (тобто будь-який стан в екземплярі обробника був скинутий) , він повинен кваліфікуватися як багаторазовий.

EDIT

Я не впевнений, чи правильно моя відповідь визначає, що таке повторне використання. Це фактично дозволяє одночасне повторне використання, тому ефективно стан було б найкраще уникати або ретельно керувати безпечним способом.


Я б так думав. Ви маєте рацію, актуальним (основним) питанням є: "що повторне використання?"
Kees C. Bakker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.