这是我的代码:
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,或者在上一次连接(响应流)关闭之前没有响应。
答案 0 :(得分:0)
似乎大多数时候你不会在HttpWebRequest中获得长度,这就是为什么在尝试运行你的代码时你会得到如下例外:
This stream does not support seek operations.
和:
'debug.Position' threw an exception of type 'System.NotSupportedException'
有关详细信息,请查看this答案:)
修改强> 我不确定你是如何调用你的代码以及从哪里调用的,但是如果你是以正常的程序(串行)方式进行调用,例如:
for (int i =0; i<10; i++) {
var some_var = CreateLink(path, i*100,(i+1)*100)
}
然后它显然会调用该方法,等到它获得前100个(或任何你设置的)字节,然后再调用它。
答案 1 :(得分:0)
.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);
}