我正在使用System.Net.WebClient类,并且正在尝试使用UploadFileAsync方法上传文件。我正在使用Visual Studio 2010,并且我所有的项目都设置为使用.NET 4.0标准运行时,而不是客户端库。

以下是我正在使用的代码的一小部分。大约有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
}

最佳答案

这很有趣。查看引用源(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);
}
asyncOp的类型为AsyncOperation

看来这里对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上报告了该错误

但是,从事物的外观来看,我想说抛出异常的原因在于您的代码。不幸的是,由于UploadFileAsync丢失了异常信息,因此无法说出位置。也许,正如其他人所指出的那样,尝试同步上载可以使您对该主题有更多的了解。

关于调用System.Net.WebClient.UploadFileAsync时出现.NET错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6348804/

10-09 03:35