这是我的代码:
public static Stream CreateLink(Uri path, int start, int end)
{
HttpWebResponse response;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
request.Timeout = 30000;
request.AddRange(start, end);
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch
{
response = null;
}
if (response != null)
{
var stream = response.GetResponseStream();
return stream;
}
return null;
}
我正在创建多个连接以从同一流并行下载数据。但是,它会返回流一次,并在所有后续尝试中返回 null,直到第一个返回的流关闭。
此外,Stream 支持Accept-Ranges
作为bytes
。
所以,我的问题是我如何建立多个连接或上面的代码有问题?
更新:
由于超时异常,response
设置为 null,或者在上一个连接(响应流)关闭之前没有收到任何响应。
NET Framework 4/4.5 具有内置的优化异步HttpClient
类。您可以使用它们来实现几乎所有您想要从HTTP实现的目标。以下是您所需要的一切:
var responseMessage = await (new HttpClient().GetAsync("http://download.linnrecords.com/test/flac/recit24bit.aspx", HttpCompletionOption.ResponseHeadersRead));
if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK)
{
var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test_http_download.flac");
using (var fileStream = File.Create(filePath))
using (var httpStream = await responseMessage.Content.ReadAsStreamAsync())
{
httpStream.CopyTo(fileStream);
fileStream.Flush();
}
Process.Start(filePath);
}
似乎大多数时候你不会得到 HttpWebRequest 的长度,这就是为什么在尝试运行代码时,你会遇到这样的异常:
This stream does not support seek operations.
和:
'debug.Position' threw an exception of type 'System.NotSupportedException'
查看此答案以获取更多详细信息:)
编辑:我不确定您如何调用代码以及从何处调用代码,但是如果您以正常的程序(串行)方式进行操作,例如:
for (int i =0; i<10; i++) {
var some_var = CreateLink(path, i*100,(i+1)*100)
}
然后它显然会调用该方法,等到它获得前 100(或你设置的任何)字节,然后再次调用它。