Я реализую API REST с помощью ASP.NET MVC, и небольшой камень преткновения появился в виде заголовка запроса Expect: 100-continue
для запросов с телом сообщения.
RFC 2616 утверждает, что:
Получив запрос, который включает заголовок запроса Expect поле с ожиданием "100-продолжить", исходный сервер ДОЛЖЕН либо ответьте со статусом 100 (Продолжить) и продолжайте читать из входного потока или отвечать окончательным кодом состояния. сервер происхождения НЕ ДОЛЖЕН ждать тело запроса перед отправкой ответ 100 (Продолжить). Если он отвечает окончательным статусом код, он МОЖЕТ закрыть транспортное соединение или МОЖЕТ продолжить читать и отбрасывать остальную часть запроса. Это НЕ ДОЛЖНО выполнить запрошенный метод, если он возвращает окончательный код состояния.
Мне кажется, что мне нужно сделать два ответа на запрос, т.е. он должен немедленно отправить ответ HTTP 100 Continue, а затем продолжить чтение из исходного потока запросов (т.е. HttpContext.Request.InputStream
) без прекращения запроса, и затем, наконец, отправив результирующий код состояния (ради аргумента, скажем, это результат без содержимого).
Итак, вопросы:
- Я читаю право спецификации, что мне нужно сделать два ответа на запрос?
- Как это сделать в ASP.NET MVC?
w.r.t. (2) Я попытался использовать следующий код, прежде чем продолжить чтение потока ввода...
HttpContext.Response.StatusCode = 100;
HttpContext.Response.Flush();
HttpContext.Response.Clear();
... но когда я пытаюсь установить окончательный код статуса 204, я получаю ошибку:
System.Web.HttpException: сервер не может установить статус после отправки HTTP-заголовков.