Первый запрос завершается с HTTP 400 (неверный запрос) после чтения HttpRequest.InputStream - PullRequest
3 голосов
/ 24 октября 2010

Я разрабатываю веб-службу asmx (т. Е. ASP.NET 2.0).

Есть фрагмент кода, который может прочитать содержимое HTTP-запроса (через HttpContext.Current.Request.InputStream) во время его обработки.Я понимаю, что InputStream может быть прочитан только один раз для запроса, и я уверен, что никогда не буду пытаться прочитать его более одного раза.

Кажется, проблема в том, что если InputStream будет прочитан на раннихВ жизненном цикле приложения (например, после pskill w3wp, во время Application_Start) HTTP-запрос завершается с ошибкой HTTP 400 - Bad Request, без объяснения, без исключения и без записи в журнале httperr.Если он читается позже (например, в самом веб-методе), запросы выполняются нормально, независимо от того, читается ли InputStream или нет.Application_Start работает нормально, если InputStream не читается.

Это какая-то ошибка ASP.NET?Ошибка IIS?Или я делаю что-то не так, решившись читать InputStream?И если да, есть ли другой способ взглянуть на «сырое» содержимое запроса, не нарушая внутреннюю работу IIS / ASP.NET?

Короче говоря, добавления этого кода в Application_Start достаточно длявоспроизведите эту ошибку:

using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream))
    reader.ReadToEnd();

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Вы не должны использовать блок using, поскольку это приводит к закрытию считывателя и, как следствие, к закрытию потока ввода httprequest

1 голос
/ 28 октября 2010

Не удалось найти способ прочитать содержимое запроса во время Application_Start, не нарушая внутреннюю работу ASP.NET/IIS. Вместо этого мы убедились, что этого не произойдет до тех пор, пока Application_Start не закончится (а также не произойдет с момента запуска Application_End, что также оказалось проблематичным и привело к нарушениям доступа).

0 голосов
/ 20 марта 2012

Я бы предложил , а не , пытаясь прочитать Request.InputStream во время Application_Start - он используется для инициализации приложения. Доступ к объекту запроса из Application_Start приводит к исключению «Запрос недоступен в этом контексте».

Тот факт, что вы хотите прочитать поток ввода, предполагает, что вы должны использовать Application_BeginRequest вместо - , у него есть доступ к запросу и ответу .

В итоге:

  1. Application_Start
    Запускается один раз при запуске приложения. Хотя обычно запускается первым запросом, это происходит до того, как настроен первый запрос. Не запрашивайте здесь конкретный код, так как он не имеет доступа к запросам и ответам.

  2. Application_BeginRequest
    Запускает каждый запрос перед вызовом любых обработчиков страниц - вы можете прочитать ввод, написать в ответ, завершить запрос и т. Д. *

См. Эти статьи SO для получения дополнительной информации:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...