无法在c#中创建多个连接以下载文件

时间:2013-11-02 07:15:08

标签: c# .net stream download

这是我的代码:

 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,或者在上一次连接(响应流)关闭之前没有响应。

2 个答案:

答案 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);
}