【发布时间】:2016-06-25 07:06:30
【问题描述】:
我有以下连接代码:
_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 动词?
谁能告诉我如何强制导致连接将缓冲区转储到客户端?
添加处理响应代码:
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)
{
}
}
}
}
【问题讨论】:
-
你在说什么缓冲区?我在这里看不到任何读写代码。
-
添加了处理缓冲区的代码,但这是异步的,所以它在服务器端等到缓冲区已满,然后发送批次。我需要强制刷新连接。
-
到底是什么问题?这段代码看起来不错。它排空流并正确检测流何时耗尽(readCount == 0)。您是在通过 HTTP 进行某种长轮询或慢速流式传输吗?
-
异步连接,它会一直等待直到缓冲区已满,然后再刷新到客户端,这在大容量内容期间很好,但我希望能够强制连接刷新缓冲区会。
-
那么我们可能需要查看发送数据的服务器。客户端不能导致服务器的实现进行套接字写入调用。
标签: c# asynchronous httpwebrequest flush