Привет, я хочу загрузить некоторый динамически сгенерированный контент в свой веб-api. На клиенте я использую HttpWebRequest. Данные должны быть загружены синхронизации, и я хочу писать в поток ПОСЛЕ (!) Я выполнил HTTP-запрос.HttpWebRequest chunked/async POST
(От сервера к клиенту он работает нормально, но от клиента к серверу я получаю некоторые исключения).
реализация клиента выглядит следующим образом:
HttpWebRequest httpWebRequest = HttpWebRequest.Create(myUrl) as HttpWebRequest;
httpWebRequest.Method = "POST";
httpWebRequest.Headers["Authorization"] = "Basic " + ... ;
httpWebRequest.PreAuthenticate = true;
httpWebRequest.SendChunked = true;
//httpWebRequest.AllowWriteStreamBuffering = false; //does not help...
httpWebRequest.ContentType = "application/octet-stream";
Stream st = httpWebRequest.GetRequestStream();
Task<WebResponse> response = httpWebRequest.GetResponseAsync();
// NOW: Write after GetResponse()
var b = Encoding.UTF8.GetBytes("Test1");
st.Write(b, 0, b.Length);
b = Encoding.UTF8.GetBytes("Test2");
st.Write(b, 0, b.Length);
b = Encoding.UTF8.GetBytes("Test3");
st.Write(b, 0, b.Length);
st.Close();
var x = response.Result;
Stream resultStream = x.GetResponseStream();
//do some output...
Я получаю исключение (NotSupportedException:. Поток не поддерживает одновременную IO операцию чтения или записи) на stream.write().
Почему у меня есть исключения. Несколько раз первая пишет worke, а поздняя запись генерирует исключение. Вначале свойство stream.CanWrite имеет значение true, но после первого или второго или третьего написания оно становится ложным ... И тогда исключение бросается на следующую запись.
Edit: Изменение AllowWriteStreamBuffering не помог
Приложения: я нашел мою проблему. Эта проблема вызвана порядком моего кода. я должен назвать его в таком порядке:
- GetRequestStream (написание асинхронной к потоку) (запрос отправляется на сервер после первой записи) затем:
- GetResponseAsync()
- GetResponseStream()
Я подумал: «GetResponseAsync» запускает клиент для отправки запроса (на текущий момент только заголовки). Но это не обязательно, потому что запрос уже отправлен после того, как я напишу первые бит в поток.
Вторая причина моих проблем: Скрипач. (Fiddler в настоящее время поддерживает только потоки ответов, а не запросы)
Я удивлен, что это работает и поддерживается. Можете ли вы опубликовать обновленный код? – usr
здесь вы :-) – user437899
Это работает только в * идеальных * ситуациях и, к сожалению, не является жизнеспособным вариантом. Клиент достаточно упрям, чтобы продолжить запись всего потока, даже если сервер давно ошибочно и отправил статус HTTP. Клиент не будет читать ничего, что отправил сервер, если он не завершит свой запрос, удивительно, даже после закрытия пула приложений, IIS и базового сокета тоже закрылись. Я попытался перейти на один уровень до HttpWebRequest, чтобы попытаться прочитать поток, пока клиент все еще пишет, однако эта операция не разрешена. – MoonStom