2011-06-14 83 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

相关问题