2011-06-14 135 views
6

我正在使用System.Net.WebClient類,並且我嘗試使用UploadFileAsync方法上載文件。我正在使用Visual Studio 2010,並且我的所有項目都設置爲使用.NET 4.0標準運行時,而不是客戶端庫。調用System.Net.WebClient.UploadFileAsync時出現.NET錯誤

下面是我正在使用的一小段代碼。大約90%的時間出現以下錯誤:

無法投射「System.ComponentModel.AsyncOperation」類型的對象以鍵入「UploadBitsState」。

Stack Trace: 
at System.Net.WebClient.UploadFileAsyncWriteCallback(Byte[] returnBytes, Exception exception, Object state) 
at System.Net.WebClient.UploadFileAsync(Uri address, String method, String fileName, Object userToken) 
at FileUpload._StartUpload() 

的FTP服務器,我試圖上傳到是內部的我的組織,而是一個正在運行IPSwitches WS-FTP和其他正在運行IIS 6.0的FTP站點,我已經經歷了同樣的問題兩臺服務器。

我已經搜索了高和低爲其他人與類似的問題無濟於事。

發生異常的實際行是_Client.UploadFileAsync方法調用。

private void _StartUpload() 
{ 
    try 
    { 
     _Client = new WebClient 
     { 
      Credentials = _Credentials 
     }; 
     _Client.UploadProgressChanged += ProgressChanged; 
     _Client.UploadFileCompleted += UploadCompleted; 
     _Client.UploadFileAsync(FileBeingUploaded, "STOR", _LocalFile, null); 
    } 
    catch (Exception exception) 
    { 
     // Methods calls removed for brevity 
    } 
} 

private void UploadCompleted(Object sender, UploadFileCompletedEventArgs e) 
{ 
    // Methods calls removed for brevity 
} 

private void ProgressChanged(object sender, UploadProgressChangedEventArgs e) 
{ 
    // Methods calls removed for brevity 
} 
+0

當你同步執行它時它工作嗎?您是否嘗試過使用「tcpdump」或「WireShark」等數據包嗅探器觀看流量? – 2011-06-14 20:13:13

+0

我還沒有嘗試過同步呼叫。至於嗅探器,我沒有試圖去觀察這些特定的錯誤,但是鑑於這個例外是在.Net框架中,並且是一個強制性問題,我不確定TCP流量分析會顯示什麼。 – 2011-06-14 20:19:32

+0

您正在上傳'_LocalFile'文件爲靜態文件嗎?換句話說,有沒有**任何**的可能性被上傳時修改/更新文件的內容?我問,因爲我可以在該特定情況下複製您的錯誤。 – 2011-06-14 20:33:05

回答

4

這很有趣。查看參考源(WebClient.cs),UploadFileAsyncWriteCallback的第一行將參數state轉換爲UploadBitsState

在該方法中UploadFileAsync,有一些異常處理代碼,上面寫着:

catch (Exception e) 
{ 
    if (e is ThreadAbortException || e is StackOverflowException || e is OutOfMemoryException) 
    { 
     throw; 
    } 
    if(fs != null){ 
     fs.Close(); 
    } 
    if (!(e is WebException || e is SecurityException)) { 
     e = new WebException(SR.GetString(SR.net_webclient), e); 
    } 
    UploadFileAsyncWriteCallback(null, e, asyncOp); 
} 

asyncOpAsyncOperation類型。

看起來像這個電話UploadFileAsyncWriteCallback這裏是一個錯誤,因爲它傳遞了一個錯誤類型的對象到回調。該回調執行C風格演員(即UploadBitsState uploadState = (UploadBitsState)state;)。

但是,只有在上傳過程中觸發異常時纔會發生這種情況。

您的ProgressChangedUploadCompleted事件處理程序中是否有可能拋出異常?無論是那個還是您傳遞給UploadFileAsync的其中一個參數都是無效的。

更多信息

它確實看起來像有在UploadFileAsync的錯誤。例如,下面拋出InvalidCastException,根據文檔應該拋出WebException

var targetUri = new Uri("ftp://example.com/file.txt"); 
var srcFile = string.Empty; // documentation says this will throw WebException 
var client = new WebClient(); 
client.UploadFileAsync(targetUri, "STOR", srcFile, null); 

我報道https://connect.microsoft.com/VisualStudio/feedback/details/675575/webclient-uploadfileasync-throws-invalidcastexception

不過的bug,從事情我會說,之所以異常被拋出在於你的代碼看起來。遺憾的是,不可能說其中,因爲UploadFileAsync正在丟失異常信息。或許,正如其他人指出的那樣,嘗試同步上傳可以更清楚地瞭解這個主題。

+0

這兩個事件處理函數都以try {開頭,並以} catch(Exception exception){//處理異常}結束,所以我認爲他們沒有做任何不恰當的事情。上面的答案和註釋都指向導致問題的輸入參數。我將不得不查看是否有任何意想不到的情況正在改變價值。 – 2011-06-14 21:30:21

+0

@DaleCouch:對不起,我指的是上傳的磁盤驅動器上的實際數據文件。例如,如果它是某個其他應用程序的日誌文件。如果其他應用程序在上傳時仍在運行,則其他應用程序可能會將更多日誌記錄數據附加到日誌中。這可能會混淆Webclient,因爲它開始認爲它正在上傳200個字節,但發現該文件現在是250個字節長。我所有的猜想都是這樣。 – 2011-06-14 21:40:04

+0

@ j.w.r .:現在看起來更有意義。這是可能的。所有這些文件都是實時生成的,我只是在嘗試傳輸它們之前關閉它們。所以操作系統很有可能迎頭趕上。我會嘗試改變我的方式,看看是否有幫助。感謝可能的方向。 – 2011-06-14 23:42:55

相關問題