IIS возвращает 400 - ошибка отсутствующего содержимого - PullRequest
0 голосов
/ 27 апреля 2018

Я использую IIS версии 8.5 на Windows Server 2012 R2. Сайт представляет собой API, обрабатывающий запросы по HTTPS (TLS 1.2). Одна из конечных точек принимает сериализованные данные JSON через PUT (команда / глагол). Данные могут быть успешно переданы до определенного размера, который составляет около 8 МБ. Для наборов данных больше этого, клиент получает странную ошибку HTTP: 400 - Missing Content. Я включил правило трассировки на сервере IIS для ошибки 400, и в какой момент в трассировке видно, что ответ 400 - Missing Content отправляется обратно. Однако я не могу понять, что может пойти не так в событиях, предшествовавших этому. Все, что я могу заметить, это то, что данные читаются кусками 16299 bytes в течение нескольких раундов. И тогда внезапно число прочитанных байтов становится меньше (12506 bytes), и мы получаем следующую последовательность событий:

1288.   NOTIFY_MODULE_COMPLETION    ModuleName="ManagedPipelineHandler", Notification="EXECUTE_REQUEST_HANDLER", fIsPostNotificationEvent="false", CompletionBytes="12506", ErrorCode="The operation completed successfully.
 (0x0)" 07:20:18.730
1289.   AspNetPipelineEnter Data1="System.Web.ImplicitAsyncPreloadModule"   07:20:18.730
1290.   AspNetPipelineLeave Data1="System.Web.ImplicitAsyncPreloadModule"   07:20:18.730
1291.   AspNetHttpHandlerEnter      07:20:18.730
1292.   GENERAL_SET_RESPONSE_HEADER HeaderName="Content-Length", HeaderValue="30", Replace="false"  07:20:19.043
1293.   GENERAL_SET_RESPONSE_HEADER HeaderName="Cache-Control", HeaderValue="private", Replace="true"   07:20:19.043
1294.   GENERAL_SET_RESPONSE_HEADER HeaderName="X-AspNet-Version", HeaderValue="4.0.30319", Replace="true"  07:20:19.043
1295.   MODULE_SET_RESPONSE_ERROR_STATUS
Warning ModuleName="ManagedPipelineHandler", Notification="EXECUTE_REQUEST_HANDLER", HttpStatus="400", HttpReason="missing content", HttpSubStatus="0", ErrorCode="The operation completed successfully.
 (0x0)", ConfigExceptionInfo=""

Я также включил подробный ответ об ошибках от IIS к клиенту, но возвращенное сообщение не содержит ничего полезного (просто включите трассировку, которую я уже сделал). Вот фрагмент того, что возвращается на случай, если кому-то интересно:

<div class="content-container"> 
  <h3>HTTP Error 400.0 - missing content</h3> 
  <h4>Bad Request</h4> 
</div> 
<div class="content-container"> 
 <fieldset><h4>Most likely causes:</h4> 
  <ul>  <li></li> </ul> 
 </fieldset> 
</div> 
<div class="content-container"> 
 <fieldset><h4>Things you can try:</h4> 
  <ul>  <li>Create a tracing rule to track failed requests for this HTTP status code. For more information about creating a tracing rule for failed requests, click <a href="http://go.microsoft.com/fwlink/?LinkID=66439">here</a>. </li> </ul> 
 </fieldset> 
</div>

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

1 Ответ

0 голосов
/ 30 апреля 2018

После повторного изучения конфигурации развернутого IIS выяснилось, что проблема заключалась в том, что ограничения на максимальные данные могут быть установлены запросом. Итак, произошла ошибка (слишком низкое значение) в MaxRequestLength HttpRuntimeSection конфигурации IIS.

Подробнее об этом свойстве можно прочитать здесь: https://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.maxrequestlength(v=vs.110).aspx. По сути, сумма (мера в килобайтах) определяет максимальный размер запроса. В приведенном выше случае, когда размер данных превысил предел, установленный этим полем, возникла проблема.

...