我有一個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;
}
只需添加到我的問題 - 我發現用相同的症狀上線(有些堆棧溢出)的幾個職位,但往往建議是使用的HttpClient和progressmessagehandler(這是我想做),或者使用Windows.Web.HttpClient,由於工具兼容性等原因我暫時還不能這樣做。儘管所有這些聽起來都很相似,但它們似乎並不是我的問題的重複內容。 – Yort
我還應該提到await client.PostAsync之後的代碼,直到進度事件激發之後,以及出現數據實際上傳時,纔會恢復執行。因此,似乎該方法正在等待數據傳輸,但基於寫入某種緩衝區來報告進度? – Yort
請嘗試使用[BackgroundUploader](http://msdn.microsoft.com/library/windows/apps/br207140)。它會返回一個叫做[UploadOperation(http://msdn.microsoft.com/en-US/library/windows/apps/windows.networking.backgroundtransfer.uploadoperation),這將允許您訪問類似'Progress'事物的對象。 –