2017-03-29 8 views
1

この質問には以前は答えられていたが、回答が私に役に立たなかったのであれば申し訳ありません。私は私のWebViewのためのイベントがあります。HttpClient getAsync大きなファイルにぶら下がって

private async void MainWebView_UnviewableContentIdentified(WebView sender, WebViewUnviewableContentIdentifiedEventArgs args) 
{ 
    await downloadFromUri(args.Uri).ConfigureAwait(false); 
} 

マイdownloadFromUri方法は、ファイルをダウンロードし、ダウンロードフォルダに格納し、最終的にそれがファイルを開くしようとします。

static async Task downloadFromUri(Uri uri) 
    { 
     var url = uri; 

     HttpClient client = new HttpClient(); 

     client.DefaultRequestHeaders.TryAppendWithoutValidation(
      "Authorization Bearer", 
       " MYTOKEN" 
      ); 

     Debug.WriteLine("Attempting GET request"); 

     var response = await client.GetAsync(url); 

     Debug.WriteLine("Got response.. checking " + response.StatusCode); 


     if (response.IsSuccessStatusCode) 
     { 
      Debug.WriteLine("Okay, we've got a response"); 
      var responseFileName = response.Content.Headers.ContentDisposition.FileName; 

      Debug.WriteLine("Filename: " + responseFileName); 

      var ManualFile = await DownloadsFolder.CreateFileAsync(responseFileName, CreationCollisionOption.GenerateUniqueName); 

      Debug.WriteLine("Creating buffer: "); 
      var buffer = await client.GetBufferAsync(url); 

      Debug.WriteLine("Writing buffer."); 
      await Windows.Storage.FileIO.WriteBufferAsync(ManualFile, buffer); 

      Debug.WriteLine("Done, opening"); 

      var openOptions = new Windows.System.LauncherOptions(); 
      openOptions.DisplayApplicationPicker = true; 

      var openFile = await Windows.System.Launcher.LaunchFileAsync(ManualFile, openOptions); 
     } 
     else 
     { 
      Debug.WriteLine(response.StatusCode.ToString()); 
     }  
    } 

事があり、このコードは、小さなPDFやzipファイルでうまく機能しているようです。それは> 10メガバイトているPDFファイルに来るときしかし、アプリケーションは単に次の行でハング:

するvar応答= client.GetAsync(URL)を待ちます。

私はこの作業を行うために何ができますか?ありがとうございます!

注:私はSystem.Net.Http.HttpClientではなくWindows.Web.Http.HttpClientを使用しています。

編集:client.GetAsync(url)をスキップして、var buffer = await client.GetBufferAsync(url);を直接実行しようとしました。これもハングアップします。

+0

configのmaxRequestLengthプロパティを更新しましたか? GetAsyncをReadAsStreamAsyncに変更し、Streamをファイルに書き込むことを検討しましたか?ファイルはメモリにダウンロードされませんが、ファイルに直接保存されると思います。 –

答えて

0

またthis- HttpClient.GetAsync(...) never returns when using await/async

それとも、あなたはまた、OSのスレッドプールを管理されるタスクであなたの長時間実行機能を実行するためにTPLを使用することができますを参照してください

var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false)); 

ツー・コードを変更してください。大きなファイルのためたぶん

var result = Task.Run(() => downloadFromUri(uri)).Result; 
+0

メソッド.ConfigureAwait()は、Windows.Web.Http.HttpClient.GetAsyncメソッドでは使用できません。私が言ったように、私はWindows.Web.Http.HttpClientを使用しています。私はあなたの2番目の提案を試みます! –

+0

2番目の提案については、この例外が発生しています。(例外:HRESULT:0x8001010E(RPC_E_WRONG_THREAD)) ' –

+1

ありがとうございます。あなたは 'System.Net.Http.HttpClient'を使用できますか、それを行う特別な理由がありますか?依然として現在の実装に移行したい場合は、キャンセルトークンとタイムアウトを使用できます。無期限に待つことを避けるためにタイムアウトを設定する方が良いです。参照してください - http://stackoverflow.com/questions/19535004/windows-web-http-httpclient-timeout-option –

2

は、BackgroundDownloaderのように、

Windows.Networking.BackgroundTransfer

名前空間を使用して良いですか?

+0

私が知る限り、バックグラウンドダウンローダーでファイル名を見つけることはできません。これは必須です。または私は何かを逃していますか? –

関連する問題