0

这是我的代码:

 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-Rangesas bytes
所以,我的问题是如何建立多个连接或者我上面的代码有问题吗?


更新:
response由于超时异常而设置为 null,或者在关闭前一个连接(响应流)之前没有响应。

4

2 回答 2

0

似乎大多数时候您不会在 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 个(或任何您设置的)字节,然后再次调用它。

于 2013-11-02T10:51:22.460 回答
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);
}
于 2013-11-02T21:41:49.947 回答