Загрузка файлов в .net с помощью WebClient (и silverlight)

У меня есть код ниже, который я использую для загрузки файлов на мою страницу ashx. Он отлично работает, хотя я, кажется, не могу найти правильный способ узнать, сколько он передал.

Телефонный код:

WebClient wc = new WebClient();
wc.OpenWriteCompleted += (s2, e2) =>
{
   PushData(e2.Result, offset);
   e2.Result.Close();
};
wc.OpenWriteAsync(ub.Uri);

Код push-данных:

private void PushData(Stream output, long offset)
{
    byte[] buffer = new byte[4096];
    int bytesRead;
    bytesRead = theFileStream.Read(buffer, 0, buffer.Length);
    if (bytesRead != 0)
    {
        output.Write(buffer, 0, bytesRead);

        totalBytesDone += bytesRead;
        FireUpdateEvent(bytesRead);
    }
}

Для краткости приведенный выше код немного отличается от моего фактического кода. Итак, я предположил, что когда он дойдет до output.Write(buffer,0,bytesRead);, это была точка, в которую он отправил фактические данные, и он заблокируется и перейдет к следующей строке только после того, как закончит запись этого раздела. Но он переходит к totalBytesDone += bytesRead;, прежде чем что-либо записывает на сервер. Я предполагаю, что причина в том, что он выполняет запись в отдельном потоке в фоновом режиме (или я на самом деле смотрю не на тот раздел кода, а он пишет где-то еще), но для того, чтобы мой totalBytesDone код работал, я хочу < / strong> заблокировать его до завершения отправки (позже я могу поместить все это в отдельный поток).

Я загрузил множество примеров для этого, и они либо не работают должным образом с моим обработчиком файлов ashx (я не могу его изменить), либо они используют метод WebClient, который просто сообщает о 50% прогрессе.


person Matt    schedule 20.05.2010    source источник


Ответы (1)


Взгляните на этот ответ.

person Darin Dimitrov    schedule 20.05.2010
comment
Спасибо, но, к сожалению, Silverlight не поддерживает весь набор методов. - person Matt; 20.05.2010
comment
Что ж, тогда вам придется прибегнуть к HttpWebRequest / HttpWebResponse. - person Darin Dimitrov; 20.05.2010
comment
А как узнать, что поддерживается, а что не поддерживается в SilverLight версии C #? - person jayarjo; 22.08.2012
comment
@ Дарин Димитров, что это за ответ? ..: | На самом деле я читаю документацию и в настоящее время не вижу, поддерживается ли что-нибудь в реализации SilveLight. - person jayarjo; 23.08.2012
comment
@Matt, что именно вы имели в виду, когда сказали, что SilveLight не поддерживает полный набор методов? - person jayarjo; 23.08.2012
comment
@jayarjo, тогда я думаю, ты невнимательно читаешь. Вот пример с методом WebClient.DownloadStringAsync: i.imgur.com/0ffxI.png. Как видите, этот метод поддерживается в Silverlight, иначе он не появился бы в списке. А вот метод WebClient.DownloadString (синхронный version), который не поддерживается, поскольку в Silverlight можно выполнять только асинхронные HTTP-запросы. Это то, что имел в виду Мэтт, когда Silverlight не поддерживал полный набор методов / классов. - person Darin Dimitrov; 23.08.2012
comment
Теперь это было совершенно неочевидно :( спасибо, хотя за совет ... так что UploadFile и UploadFileAsync недоступны в SilverLight ... это отстой. - person jayarjo; 23.08.2012
comment
Интересно ... Я только вчера читал о WebClient.DownloadString в SilverLight, здесь: wildermuth.com/2008 / 9/27 /. Все это теперь еще более запутано ... - person jayarjo; 23.08.2012
comment
Нет, Silverlight не поддерживает метод DownloadString. Он поддерживает только метод DownloadStringAsync, как показано в примерах кода в сообщении в блоге, которое вы читаете. Все сетевые соединения в Silverlight должны быть асинхронными. - person Darin Dimitrov; 23.08.2012
comment
@DarinDimitrov, на самом деле я только что понял, почему это так сбивает с толку - сейчас я читаю книгу о SilverLight и C #, и вот страница, которая использует UploadFileAsync в SilverLight для загрузки файла: books.google.ge/ ... По вашему мнению, это не должно быть возможным ... ??? - person jayarjo; 23.08.2012
comment
Нет, я понимаю, это не проблема. Проблема в том, что когда я нажимаю здесь раскрывающийся список: msdn.microsoft.com/en -us / library / ms144232.aspx в списке нет SilveLight ... - person jayarjo; 23.08.2012
comment
Ладно, ты прав. Этот метод недоступен в Silverlight. Вместо этого вы можете использовать метод OpenWriteAsync. - person Darin Dimitrov; 23.08.2012
comment
@DarinDimitrov, вы говорите, что книга, на которую я ссылался выше (она о SilverLight), совершенно неправильная? ..: | Думаю, мне нужно попробовать себя. - person jayarjo; 23.08.2012