ASP.NET Request.Form Performance - PullRequest
11 голосов
/ 04 мая 2011

Я использовал HttpHandler для реализации облегченного веб-сервиса, ориентированного на высокую производительность. Требуется POST с типом контента application/x-www-form-urlencoded. Веб-сервис выполняет множество задач, включая дешифрование, работу с базой данных, бизнес-логику и так далее. Во время нагрузочного тестирования монитор производительности (ANTS и Visual Studio) указывают на одну строку кода, которая занимает большую часть времени, фактически 67%.

string value = context.Request.Form[MY_FORM_KEY];

В нижней части стека вызовов для этой строки кода, монитор производительности, говорит этот вызов:

System.Web.Hosting.UnsafeIISMethods.MgdSyncReadRequest();

является виновником.

Может кто-нибудь помочь, пожалуйста, объясните ?! Приложение находится в .Net 4, опубликованном в виде выпуска IIS 7 для Windows Server 2008.

Спасибо, Джои Дж. Барретт

Ответы [ 3 ]

6 голосов
/ 10 октября 2012

Задержка происходит из-за того, что IIS пытается прочитать поток запроса от клиента для получения значений формы.Этот поток зависит от клиентского соединения и в некоторых случаях даже не возвращается.Я видел случаи, когда Request.Form блокировался более 5 минут, и это приводило к тому, что IIS в конечном итоге создавало исключение ThreadAbortException.

В нашем случае у нас был HttpModule, который должен был прочитать значения Request.Form (или request ["key"], который также выполняет итерации по значениям формы), и он будет случайным образом блокироваться на сервере и никогда не будетвернуть.Я использовал этот HttpModule для отслеживания производительности приложений на стороне сервера, что дало мне понять, что все, что я отслеживаю с помощью этого модуля, также будет зависеть от подключения клиента, что исказит мои результаты выполнения на стороне сервера.

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

Кроме того, вы можете выгружать HTTP, балансировать нагрузку и даже кэшировать статический контент на вашем обратном прокси (в зависимости от того, какой вы используете).

2 голосов
/ 19 мая 2011

The

System.Web.Hosting.UnsafeIISMethods.MgdSyncReadRequest()

- это импортированная функция IIS (как вы уже догадались). Поскольку http.sys, который выполняет всю работу http для IIS, является неуправляемым кодом, в какой-то момент ваше приложение должно будет с ним общаться, хотя и не напрямую.

Я предполагаю, что когда вы читаете коллекцию форм, .net читает это из необработанного запроса IIS. Если это окажется узким местом, я реорганизовал бы ваш код для асинхронного чтения данных формы и сохранения необходимых значений в собственной структуре данных.

Simon

0 голосов
/ 24 февраля 2016

MgdSyncReadRequest метод заблокировал внутренний API неуправляемого IIS.Но поднятый управляемый ThreadAbortException.
Это означает, что другой управляемый поток может быть вызван Thread.Abort().

Я искал в источнике ссылок, получил "RequestTimeoutManager":

http://referencesource.microsoft.com/#System.Web/RequestTimeoutManager.cs,177

thread.Abort(new HttpApplication.CancelModuleException(true));

Решение (не проверять, может быть): Реализуется с помощью асинхронного считывателя и обрабатывает время ожидания вручную ...

...