Это довольно интересно. Если посмотреть на справочный источник (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);
Я сообщил об ошибке на https://connect.microsoft.com/VisualStudio/feedback/details/675575/webclient-uploadfileasync-throws-invalidcastexception
Однако, судя по всему, я бы сказал, что причина, по которой выдается исключение, кроется в вашем коде. К сожалению, невозможно сказать , где , потому что UploadFileAsync
теряет информацию об исключении. Возможно, как заметил кто-то другой, попытка синхронной загрузки позволит пролить больше света на эту тему.