Требования IHttpHandler для IsReusable

Я ищу разъяснения по ответам на этот вопрос.

Два верхних ответа несколько противоречат требованиям безопасности потока многоразового обработчика.

Можно ли использовать экземпляр IHttpHandler для одновременной обработки нескольких запросов, что требует его полной поточной безопасности?

или же

Будет ли он когда-либо обрабатывать несколько запросов подряд, требуя только того, чтобы состояние обработчика не изменялось в методе ProcessRequest?

Обновление (5/5/15):

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

Мое мнение:

Запросы сопоставляются с IHttpHandlers экземпляром HttpApplication в MapHttpHandler.

MapHttpHandler использует коллекцию закрытых данных HanlderFactoryCache для экземпляра HttpApplication. Смотрите GetFactory.

HanlderFactoryCache возвращает HttpHandlerWrapper для сопоставлений IHttpHandler, который управляет одним экземпляром IHttpHandler, а свойство IsReusable обрабатывается в HttpHandlerWrapper.ReleaseHanlder.

Таким образом, любое повторное использование обработчика будет ограничено экземпляром HttpApplication, и поскольку экземпляры HttpApplication не используются одновременно (см. Здесь "События жизненного цикла" и файл Global.asax), все это предполагает:

  • Возвращая true из IHttpHanlder.IsReusable, использует существующий пул объектов HttpApplication для повторного использования экземпляров IHttpHanlder.
  • IHttpHanlders не должен быть потокобезопасным, чтобы воспользоваться преимуществами повторного использования встроенного экземпляра в ASP.NET.

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

Может кто-нибудь показать мне, где я неправильно прочитал код? Кто-нибудь может подтвердить мою интерпретацию?

Примечание: я также убежден в том, что HttpApplication сам по себе является многократно используемым IHttpHanlder, который не выглядит потокобезопасным.

1 ответ

Повторно используемый экземпляр обработчика может быть вызван одновременно. Это отвечает на ваш вопрос.

сбрасывается в начале или в конце запроса

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

Просто никогда не создавайте повторно используемый обработчик, и вопрос становится спорным. Нет причин делать это. Это недостаток дизайна в ASP.NET. Всегда return false;,

Если вы хотите поддерживать состояние (которое является последним средством в ASP.NET), сделайте это вне экземпляра обработчика, чтобы проблемы параллелизма были очевидны для обнаружения и решения. Обработчик должен иметь ноль полей экземпляра.

Другие вопросы по тегам