Я ищу разъяснения по ответам на это question.IHttpHandler Требования к IsReusable
Два первых ответа несколько противоречат требованиям безопасности потока для многоразового обработчика.
Может ли экземпляр IHttpHandler обрабатывать несколько запросов одновременно, требуя, чтобы он был полностью потокобезопасным?
или
Будет ли это только когда-либо обрабатывать несколько запросов последовательно, требуя только, что состояние обработчика не изменяется в методе ProcessRequest?
Update (6/5/15):
я просматривал исходный код HttpApplication снова here, чтобы попытаться получить ответ на этот вопрос.
Мое мнение:
запросы отображаются в IHttpHandlers экземпляром HttpApplication в MapHttpHandler.
MapHttpHandler использует коллекцию HanlderFactoryCache для частного экземпляра HttpApplication. См. GetFactory.
HanlderFactoryCacheHttpHandlerWrapper возвращает для IHttpHandler отображений, который управляет один экземпляр IHttpHandler и IsReusable свойство обрабатывается в HttpHandlerWrapper.ReleaseHanlder.
Таким образом, любое повторное использование обработчика будет быть ограничена к экземпляру HttpApplication и, как HttpApplication экземпляры не используются одновременно (см Жизненный цикл событий и Global.asax файл here) все это предполагает:
- Возвращение правда из IHttpHanlder.IsReusable использует существующий пул объектов HttpApplication для повторного использования экземпляров IHttpHanlder.
- IHttpHanlders не должны быть потокобезопасными, чтобы использовать встроенное повторное использование экземпляра в ASP.NET.
Проблема в том, что я ошибаюсь. Я мог бы создать некоторые довольно большие проблемы для себя, и многие люди, у которых есть мнение по этому вопросу, кажется, считают, что я неправ.
Может ли кто-нибудь показать мне, где я прочитал код неправильно? Может ли кто-нибудь подтвердить мою интерпретацию?
Примечание: Я убежден в том, что сам HttpApplication является многократно используемым IHttpHanlder, который не является потокобезопасным.
Есть ли у вас какая-либо ссылка/документация, в которой экземпляр может быть вызван одновременно? –
Это лучшее, что я смог найти, используя Reflector. Я не очень старался, так как этот вопрос спорный. – usr
ОК спасибо, я пришел к другому выводу, глядя на исходный код, но не был уверен, поэтому искал документацию для подтверждения. Обработчик, над которым я работал, имеет некоторую инициализацию в конструкторе на основе структуры папок на веб-сайте, на котором он работает. Я рассматривал его как многоразовое, так как нет необходимости повторять инициализацию для каждого запроса. –