C# 从internet下载图像并在WinRT中将其转换为字节[]

C# 从internet下载图像并在WinRT中将其转换为字节[],c#,wpf,windows-runtime,C#,Wpf,Windows Runtime,我正在尝试通过URL从internet下载图像到Windows8应用程序,并将其转换为字节[]。(BitmapImage不可序列化) 不幸的是,当我试图处理这段代码时,它在bytearray初始化时崩溃,因为流不可查找 有没有办法做到这一点?我知道在温特还没有一条可以看到的小溪 private async Task<byte[]> DownloadImageFromWebsite(string url) { //BitmapImage resu

我正在尝试通过URL从internet下载图像到Windows8应用程序,并将其转换为字节[]。(BitmapImage不可序列化)

不幸的是,当我试图处理这段代码时,它在bytearray初始化时崩溃,因为流不可查找

有没有办法做到这一点?我知道在温特还没有一条可以看到的小溪

private async Task<byte[]> DownloadImageFromWebsite(string url)
        {
            //BitmapImage result = null;
            byte[] result = null;

            try
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);

                WebResponse response = await request.GetResponseAsync();

                Stream imageStream = response.GetResponseStream();
                result = new byte[imageStream.Length];
                await imageStream.ReadAsync(result, 0, (int)imageStream.Length);


                response.Dispose();
            }
            catch (Exception ex)
            {
                return null;
            }

            return result;
        }
私有异步任务下载ImageFromWeb(字符串url)
{
//BitmapImage结果=空;
字节[]结果=空;
尝试
{
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(url);
WebResponse=wait request.GetResponseAsync();
Stream imageStream=response.GetResponseStream();
结果=新字节[imageStream.Length];
等待imageStream.ReadAsync(结果为0,(int)imageStream.Length);
response.Dispose();
}
捕获(例外情况除外)
{
返回null;
}
返回结果;
}

您的问题是这一行:

result = new byte[imageStream.Length];
对于HTTP响应流,在读取之前,您不知道它会有多大

如果服务器发送一个
内容长度
头,那么您应该能够读取它并使用它调整数组大小。但是,您仍然需要返回到将整个流(大小未知)读取到内存中,例如:

private async Task<byte[]> DownloadImageFromWebsiteAsync(string url)
{
  try
  {
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
    using (WebResponse response = await request.GetResponseAsync())
    using (var result = new MemoryStream())
    {
      await imageStream.CopyToAsync(result);
      return result.ToArray();
    }
  }
  catch (WebException ex)
  {
    return null;
  }
}
私有异步任务下载ImagefromWebSiteAsync(字符串url)
{
尝试
{
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(url);
使用(WebResponse=await request.GetResponseAsync())
使用(var result=new MemoryStream())
{
等待imageStream.CopyToAsync(结果);
返回result.ToArray();
}
}
捕获(WebException ex)
{
返回null;
}
}

另外,我建议您使用而不是
HttpWebRequest

您的问题是这一行:

result = new byte[imageStream.Length];
对于HTTP响应流,在读取之前,您不知道它会有多大

如果服务器发送一个
内容长度
头,那么您应该能够读取它并使用它调整数组大小。但是,您仍然需要返回到将整个流(大小未知)读取到内存中,例如:

private async Task<byte[]> DownloadImageFromWebsiteAsync(string url)
{
  try
  {
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
    using (WebResponse response = await request.GetResponseAsync())
    using (var result = new MemoryStream())
    {
      await imageStream.CopyToAsync(result);
      return result.ToArray();
    }
  }
  catch (WebException ex)
  {
    return null;
  }
}
私有异步任务下载ImagefromWebSiteAsync(字符串url)
{
尝试
{
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(url);
使用(WebResponse=await request.GetResponseAsync())
使用(var result=new MemoryStream())
{
等待imageStream.CopyToAsync(结果);
返回result.ToArray();
}
}
捕获(WebException ex)
{
返回null;
}
}

另外,我建议您使用而不是
HttpWebRequest

,而不是尝试一次读取所有数据,您可以在固定大小的块中读取数据,并使用可扩展的。(也就是说,我真的不明白这将如何与异步功能交互。)与其尝试一次读取所有数据,您可以在固定大小的块中读取数据,并使用可扩展的。(也就是说,我真的不明白这将如何与异步功能交互。)