Привет, я хочу загрузить динамически сгенерированный контент в свой веб-API. На клиенте я использую HttpWebRequest. Данные должны загружаться синхронно, и я хочу записать в поток ПОСЛЕ(!) выполнения HTTP-запроса.
(От сервера к клиенту все работает нормально, но от клиента к серверу я получаю некоторые исключения).
Реализация клиента выглядит так:
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: поток не поддерживает параллельные операции чтения или записи ввода-вывода) в stream.write().
Почему я получаю здесь исключения. Иногда первая запись работает, а поздняя запись вызывает исключение. В начале свойство stream.CanWrite имеет значение true, но после первой, второй или третьей записи оно становится ложным... И затем при следующей записи возникает исключение.
Изменить: изменение AllowWriteStreamBuffering не помогло
Приложение: Я нашел свою проблему. Эта проблема вызвана порядком моего кода. Я должен назвать это в следующем порядке:
- GetRequestStream (асинхронная запись в поток) (запрос отправляется на сервер после первой записи), затем:
- GetResponseAsync()
- ПолучитьПотокОтвета()
Я думал, что «GetResponseAsync» запускает клиент для отправки запроса (пока только заголовки). Но это не обязательно, потому что запрос уже отправлен после того, как я запишу первые биты в поток.
Вторая причина моих проблем: Fiddler. (В настоящее время Fiddler поддерживает только потоковую передачу ответов, а не запросов)