2014-02-19 113 views
2

我有一個WinRT應用程序(8.0,不是8.1,所以我不能使用Windows.Web.HttpClient)在哪裏上傳大文件到網站。我使用System.Net.Http.HttpClient從Microsoft.AspNet.WebApi.Client NuGet包用於跟蹤進度的目的,System.Net.Http.Handlers.ProgressMessageHandler。System.Net.Http.Handlers.ProgressMessageHandler立即返回100%

不管我上傳的文件有多大,我似乎總是調用一次HttpSendProgress事件,並且只有一次,100%進度(和totalBytes == sentBytes)。然而,該文件實際上並沒有完成上傳到該網站,直到事件發生後的一段時間,這取決於文件大小以及是否限制了上傳速度等。上傳確實有效,但進度報告是無用的。

我使用了一個網絡監控工具,可以在調用進度事件後(當我讓應用程序在停止點後停止運行)後看到緩慢傳輸的數據 - 但我只收到了一次事件上傳完成前100%進展。

我認爲HttpClient正在寫入某種緩衝區,發生的速度比實際的上傳速度快得多,但我無法弄清楚如何更改/防止該問題,或者ProgressMessageHandler類的要點是什麼它總是以這種方式工作。

目前我使用的代碼如下所示:

public static async Task<string> UploadDataAsync(string uploadUrl, byte[] data, string contentTypeHeader, string oauthHeader, Action<long, long?> progressCallback) 
{ 
    var ph = new System.Net.Http.Handlers.ProgressMessageHandler(); 
    if (progressCallback != null) 
    { 
     ph.HttpSendProgress += (sender, args) => 
     { 
      progressCallback(args.BytesTransferred, args.TotalBytes); 
     }; 
    } 

    var client = HttpClientFactory.Create(ph); 
    client.Timeout = new TimeSpan(0, 20, 0); 

    if (!String.IsNullOrEmpty(oauthHeader)) 
     client.DefaultRequestHeaders.Add("Authorization", oauthHeader); 

    var content = new ByteArrayContent(data); 
    content.Headers.TryAddWithoutValidation("Content-Type", contentTypeHeader); 
    var postResponse = await client.PostAsync(new Uri(uploadUrl), content); 
    var result = await postResponse.Content.ReadAsStringAsync(); 
    if (!postResponse.IsSuccessStatusCode) 
    { 
     throw new OAuthException(result); 
    } 
    return result; 
} 
+1

只需添加到我的問題 - 我發現用相同的症狀上線(有些堆棧溢出)的幾個職位,但往往建議是使用的HttpClient和progressmessagehandler(這是我想做),或者使用Windows.Web.HttpClient,由於工具兼容性等原因我暫時還不能這樣做。儘管所有這些聽起來都很相似,但它們似乎並不是我的問題的重複內容。 – Yort

+0

我還應該提到await client.PostAsync之後的代碼,直到進度事件激發之後,以及出現數據實際上傳時,纔會恢復執行。因此,似乎該方法正在等待數據傳輸,但基於寫入某種緩衝區來報告進度? – Yort

+0

請嘗試使用[BackgroundUploader](http://msdn.microsoft.com/library/windows/apps/br207140)。它會返回一個叫做[UploadOperation(http://msdn.microsoft.com/en-US/library/windows/apps/windows.networking.backgroundtransfer.uploadoperation),這將允許您訪問類似'Progress'事物的對象。 –

回答

0

我建議您鏈這兩個任務與ContinueWith和使用TaskContinuationOptions.OnlyOnRanToCompletion給予ProgressMessageHandler報告完全按照你想要的進步的機會。

希望這可能有所幫助。

postResponse.ContinueWith(task => 
    { 
     if (task.Result.IsSuccessStatusCode) 
     { 
     } 
    }, TaskContinuationOptions.OnlyOnRanToCompletion);