Я реализую метод действия прокси что вперед входящий веб-запрос и вперед это к другой веб-странице, добавляя несколько заголовков. Файл работ метода действия для ПОЛУЧАЕТ запросы, но я все еще борюсь с передачей входящего запроса POST.
Проблема состоит в том, что я не знаю, как правильно записать тело запроса в исходящий поток Запроса HTTP.
Вот сокращенная версия того, что я имею до сих пор:
//the incoming request stream
var requestStream=HttpContext.Current.Request.InputStream;
//the outgoing web request
var webRequest = (HttpWebRequest)WebRequest.Create(url);
...
//copy incoming request body to outgoing request
if (requestStream != null && requestStream.Length>0)
{
long length = requestStream.Length;
webRequest.ContentLength = length;
requestStream.CopyTo(webRequest.GetRequestStream())
}
//THE NEXT LINE THROWS A ProtocolViolationException
using (HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse())
{
...
}
Как только я называю GetResponse на исходящем запросе HTTP, я получаю следующее исключение:
ProtocolViolationException: You must write ContentLength bytes to the request stream before calling [Begin]GetResponse.
Я не понимаю, почему это происходит, с тех пор requestStream. CopyTo должен был заботиться о записи правильной суммы байтов.
Любые предложения значительно ценились бы.
Спасибо,
Adrian
попробуйте изменить блок внутри оператора if
long length = requestStream.Length;
webRequest.ContentLength = length;
requestStream.CopyTo(webRequest.GetRequestStream())
с
webRequest.Method = "POST";
webRequest.ContentLength = requestStream.Length;
webRequest.ContentType = "application/x-www-form-urlencoded";
Stream stream = webRequest.GetRequestStream();
requestStream.CopyTo(stream);
stream.Close();