2012-11-16 9 views
10

私は奇妙なWebClient.UploadFileAsync()の動作について助けが必要です。 ファイルをリモートHTTPサーバ(nginx)のPOSTメソッドにアップロードしています。 POSTはPHPスクリプト(Addressが参照する)を介して処理されます。WebClient UploadFileAsync進行中の異常な動作の報告

私はこの単純なコード

public void uploadFile(string filePath) 
{ 
    webClient = new WebClient(); 
    webClient.Credentials = new NetworkCredential(Constant.HTTPUsername,Constant.HTTPPassword); 
    webClient.Headers.Add("Test", TestKey); 
    webClient.UploadProgressChanged += webClient_UploadProgressChanged; 
    webClient.UploadFileCompleted += webClient_UploadFileCompleted; 

    try 
    { 
     webClient.UploadFileAsync(new Uri(Address), "POST", filePath); 
    } 
    catch (Exception error) 
    { 
     throw new CustomException(error.Message); 
    } 
} 

そしてUploadProgressChangedに、私は単に与えられたProgressPercentageとプログレスバーを更新しています。 最初の問題は、任意のファイルサイズがあると進捗率は、報告されたということです。だから、

[17.38.14] Progress: 0 Bytes Sent: 175/269264 
[17.38.14] Progress: 1 Bytes Sent: 8367/269264 
[17.38.14] Progress: 3 Bytes Sent: 16559/269264 
[17.38.14] Progress: 4 Bytes Sent: 24751/269264 
[17.38.14] Progress: 6 Bytes Sent: 32943/269264 
[17.38.14] Progress: 7 Bytes Sent: 41135/269264 
[17.38.14] Progress: 9 Bytes Sent: 49327/269264 
[17.38.14] Progress: 10 Bytes Sent: 57519/269264 
[17.38.14] Progress: 12 Bytes Sent: 65711/269264 
[17.38.14] Progress: 13 Bytes Sent: 73903/269264 
[17.38.14] Progress: 15 Bytes Sent: 82095/269264 
[17.38.14] Progress: 16 Bytes Sent: 90287/269264 
[17.38.14] Progress: 18 Bytes Sent: 98479/269264 
[17.38.15] Progress: 19 Bytes Sent: 106671/269264 
[17.38.15] Progress: 21 Bytes Sent: 114863/269264 
[17.38.15] Progress: 22 Bytes Sent: 123055/269264 
[17.38.15] Progress: 24 Bytes Sent: 131247/269264 
[17.38.15] Progress: 25 Bytes Sent: 139439/269264 
[17.38.15] Progress: 27 Bytes Sent: 147631/269264 
[17.38.16] Progress: 28 Bytes Sent: 155823/269264 
[17.38.16] Progress: 30 Bytes Sent: 164015/269264 
[17.38.16] Progress: 31 Bytes Sent: 172207/269264 
[17.38.16] Progress: 33 Bytes Sent: 180399/269264 
[17.38.16] Progress: 35 Bytes Sent: 188591/269264 
[17.38.16] Progress: 36 Bytes Sent: 196783/269264 
[17.38.17] Progress: 38 Bytes Sent: 204975/269264 
[17.38.17] Progress: 39 Bytes Sent: 213167/269264 
[17.38.17] Progress: 41 Bytes Sent: 221359/269264 
[17.38.17] Progress: 42 Bytes Sent: 229551/269264 
[17.38.17] Progress: 44 Bytes Sent: 237743/269264 
[17.38.17] Progress: 45 Bytes Sent: 245935/269264 
[17.38.17] Progress: 47 Bytes Sent: 254127/269264 
[17.38.18] Progress: 48 Bytes Sent: 262319/269264 
[17.38.18] Progress: 49 Bytes Sent: 269220/269264 
[17.38.18] Progress: 50 Bytes Sent: 269264/269264 
[17.38.25] Progress: -50 Bytes Sent: 269264/269264 
[17.38.25] Progress: 100 Bytes Sent: 269264/269264 
[17.38.25] FileCompleted event raised! 

、ウェブ上で検索、私は、50〜> 100からのジャンプは、中だけで設計上の選択であることを発見しました%のレポート..そしてそれで私はそれでいいです。 奇妙な問題は、ファイル全体が送信されたときの50%であっても、ネットワークインターフェイスがまだトラフィックを生成し、依然としてアップロードしているということです。 実際には、上記のログの時間からわかるように、UploadFileCompletedEventを発生させるためにファイルが送信されてから7秒かかります。ただし、HTTPでファイルを送信しています。

ここでの問題は、UIが確実に更新できないことです。プログレスバーが50%まで拡大しますが、アップロードの完了を待っていることになります(これは大きなファイルでは有意に)。

質問は次のとおりです。どのようにすれば、ファイルのアップロードの進捗状況を確実にユーザーに更新させることができますか?

ありがとうございました。

P.S.メソッドは完全に正常に動作し、ファイルはリモートサーバーに正しくアップロードされます。唯一の問題は進捗報告です。

+0

解決策として答えを投稿して受け入れても問題ない場合は、 –

+0

時にはここに質問を投稿することもあなたがそれを理解するのを助けます:) –

答えて

2

これは基本的なHTTP認証にあります。いくつかの奇妙な理由で、たとえ私がCredentialsを指定したとしても、WebClientはHTTPヘッダーの資格情報を指定せずに最初のPOST要求を送信します。サーバーはauth-requestで応答した後、資格情報を正しく指定した2番目のPOST要求を送信します。これら2回の再試行で、私のアプリケーションはファイルを2回送信します!

string authInfo = userName + ":" + userPassword; 
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
req.Headers["Authorization"] = "Basic " + authInfo; 

溶液手動..行を認証ヘッダを付加(とWebClient.Credentialsを削除することにより、HTTP基本認証を強制することである(iは、ファイルが完全に送信された後でも、アップロード活動を経験した理由です)

このようにして、1番目のPOSTリクエストが認証ヘッダーとともに正しく送信され、レポートの進行状況が正しく表示されます(共有のために、上記の理由でプログレスバーの進行状況を(e.ProgressPercentage * 2)

1
string authInfo = userName + ":" + userPassword; 
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
req.Headers["Authorization"] = "Basic " + authInfo; 

あなたの進捗状況を報告するため、投稿要求の冒頭にこれをe.ProgressPercentage * 2と置きます。

関連する問題