调用System.Net.WebClient.UploadFileAsync时出现.NET错误

Dal*_*uch 6 .net webclient exception

我正在使用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()
Run Code Online (Sandbox Code Playgroud)

我试图上传到的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
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*hel 4

这有点有趣。查看参考源(WebClient.cs),第一行将参数UploadFileAsyncWriteCallback转换stateUploadBitsState

在该方法中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); 
}
Run Code Online (Sandbox Code Playgroud)

asyncOp属于 类型AsyncOperation

看起来对UploadFileAsyncWriteCallback此处的调用是一个错误,因为它将错误类型的对象传递给回调。回调执行 C 风格的转换(即UploadBitsState uploadState = (UploadBitsState)state;)。

但只有在上传过程中触发异常时才会发生这种情况。

ProgressChanged您的事件处理程序或事件处理程序中的某些内容是否可能UploadCompleted引发异常?您传递给的该参数或其中一个参数UploadFileAsync无效。

更多信息

看起来确实有一个错误UploadFileAsync。例如,下面的 throws InvalidCastException,根据文档它应该 throw 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);
Run Code Online (Sandbox Code Playgroud)

我已在https://connect.microsoft.com/VisualStudio/feedback/details/675575/webclient-uploadfileasync-throws-invalidcastexception报告了该错误

然而,从表面上看,我想说抛出异常的原因在于您的代码中。不幸的是,不可能说出在哪里,因为UploadFileAsync正在丢失异常信息。也许,正如其他人指出的那样,尝试同步上传将使这个主题更加清晰。