我正在使用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
}
答案 0 :(得分: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);
}
asyncOp
的类型为AsyncOperation
。
看起来这里对UploadFileAsyncWriteCallback
的调用是一个错误,因为它将错误类型的对象传递给回调。回调做了C风格的演员表(即UploadBitsState uploadState = (UploadBitsState)state;
)。
但只有在上传过程中触发异常时才会发生这种情况。
ProgressChanged
或UploadCompleted
事件处理程序中的某些内容是否可能引发异常?您传递给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);
报告了错误
然而,从外观上看,我会说抛出异常的原因在于你的代码。不幸的是,不可能说 where ,因为UploadFileAsync
正在丢失异常信息。也许正如其他人所指出的那样,尝试同步上传将会更多地阐明这一主题。