HttpWebRequest chunked / POS assíncrono
Oi, eu quero fazer upload de algum conteúdo gerado dinamicamente para a minha API da web. No cliente eu uso o HttpWebRequest. Os dados devem ser carregados com sincronização e eu quero gravar no fluxo APÓS (!) Eu executei a solicitação HTTP.
(De servidor para cliente, ele funciona bem, mas de cliente para servidor eu recebo algumas exceções).
A implementação do cliente se parece com:
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...
Recebo exceções (NotSupportedException: o fluxo não suporta operações de leitura ou gravação de E / S simultâneas.) Em stream.write ().
Por que eu chego aqui a exceções. Algumas vezes as primeiras gravações worke e as gravações tardias lançam a exceção. No início, a propriedade stream.CanWrite é verdadeira, mas após a primeira ou a segunda ou terceira gravação, ela se torna falsa ... E a exceção é lançada na próxima gravação.
Editar: Alterar AllowWriteStreamBuffering não ajudou
Apêndice: Eu encontrei o meu problema. Esse problema é causado pela ordem do meu código. Eu tenho que chamá-lo nesta ordem:
GetRequestStream (gravando assíncrono no fluxo) (a solicitação é enviada ao servidor após a primeira gravação) e:GetResponseAsync ()GetResponseStream ()Eu pensei que "GetResponseAsync" aciona o cliente para enviar a solicitação (por enquanto apenas os cabeçalhos). Mas isso não é necessário porque a solicitação já foi enviada depois que eu escrevi os primeiros bits no fluxo.
Segunda causa dos meus problemas: Violinista. No momento, o Fiddler suporta apenas o fluxo de respostas e não solicitações.