1

インターネットから URL を介して Windows8 アプリに画像をダウンロードし、バイト [] に変換しようとしています。(BitmapImage はシリアル化できません)

残念ながら、このコードを処理しようとすると、ストリームがシークできないため、bytearray の初期化でクラッシュします。

これを達成する方法はありますか?WinRT でシーク可能なストリームがまだないことを確認しました...

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;
        }
4

1 に答える 1

5

あなたの問題はこの行です:

result = new byte[imageStream.Length];

HTTP応答ストリームの場合、読み取られるまでその大きさはわかりません。

サーバーがヘッダーを送信する場合Content-Lengthは、ヘッダーを読み取り、それを使用して配列のサイズを設定できるはずです。ただし、次のように、(サイズが不明な)ストリーム全体をメモリに読み込むことにフォールバックする必要があります。

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;
  }
}

PSHttpClientの代わりに使用することをお勧めしますHttpWebRequest

于 2012-06-27T13:57:47.873 に答える