У меня есть следующий код подключения:Принудительный асинхронный WebRequest для очистки его буфера C#
_request = (HttpWebRequest)WebRequest.Create(complianceUrl);
_request.Method = "GET";
var authInfo = string.Format("{0}:{1}", _username, _password);
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
_request.Headers.Add("Authorization", "Basic " + authInfo);
// set stream parameters
_request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
_request.Headers.Add("Accept-Encoding", "gzip");
_request.Accept = "application/json";
_request.ContentType = "application/json";
_request.ReadWriteTimeout = 30000;
_request.AllowReadStreamBuffering = false;
_request.Timeout = 30; //seconds, sends 15-second heartbeat.
_asyncCallback = HandleResult; //Setting handleResult as Callback method...
_request.BeginGetResponse(_asyncCallback, _request); //Calling BeginGetResponse on
Это прекрасно работает, и буфер заполняется данными, и в то время как у меня есть большие объемы данных, это хорошо. Но с небольшими объемами данных для заполнения буфера требуется некоторое время, и я хочу периодически очищать буфер, если у меня не было активности за какое-то время.
Я пытался сделать это таким образом:
_request.GetRequestStream().FlushAsync();
Но это не так, как он говорит мне, что я вызывает ProtocolViolationException я думаю, как это GET Глагол?
Может ли кто-нибудь сказать мне, как принудительно заставить соединение сбросить буфер клиенту?
Handling код ответа добавил:
private void HandleResult(IAsyncResult result)
{
using (var response = (HttpWebResponse) _request.EndGetResponse(result))
using (var stream = response.GetResponseStream())
using (var memory = new MemoryStream())
{
var compressedBuffer = new byte[BlockSize];
while (stream != null && stream.CanRead)
{
var readCount = stream.Read(compressedBuffer, 0, compressedBuffer.Length);
// if readCount is 0, then the stream must have disconnected. Process and abort!
if (readCount == 0)
{
}
}
}
}
Что буфер вы говорите? Я не вижу здесь никакого кода для чтения или написания. – usr
Добавлен код для обработки буфера, но это асинхронно, поэтому он ждет, пока буфер не будет заполнен на стороне сервера, а затем отправит лот. Мне нужно принудительно отключить соединение. – jimplode
В чем проблема? Этот код выглядит отлично. Он истощает поток и правильно определяет, когда поток исчерпан (readCount == 0). Вы делаете какой-то длинный опрос или медленный поток по HTTP? – usr