2015-02-25 5 views
1

Я ищу разъяснения по ответам на это 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, который не является потокобезопасным.

ответ

0

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

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

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

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

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

+0

Есть ли у вас какая-либо ссылка/документация, в которой экземпляр может быть вызван одновременно? –

+0

Это лучшее, что я смог найти, используя Reflector. Я не очень старался, так как этот вопрос спорный. – usr

+0

ОК спасибо, я пришел к другому выводу, глядя на исходный код, но не был уверен, поэтому искал документацию для подтверждения. Обработчик, над которым я работал, имеет некоторую инициализацию в конструкторе на основе структуры папок на веб-сайте, на котором он работает. Я рассматривал его как многоразовое, так как нет необходимости повторять инициализацию для каждого запроса. –

Смежные вопросы