Блокировка файла для прерванной загрузки, кажется, не снимает - PullRequest
2 голосов
/ 11 июня 2011

Я получаю сообщение «Процесс не может получить доступ к файлу», поскольку он используется другим процессом ».ошибка в нашем обработчике загрузки.Что мы тестируем, так это загрузчик через silverlight, который отправляет данные порциями в обработчик на сервере.Все работает нормально до тех пор, пока мы не проверим разрыв соединения с интернетом и не включим его снова (загрузчик предназначен для автоматического возобновления работы при возобновлении работы интернета).Когда обработчик пытается повторно открыть файл после восстановления интернет-соединения, появляется ошибка («Процесс не может получить доступ к файлу»).

код, который имеет проблему, ниже

using (FileStream fs = File.Open(context.Server.MapPath("~/Uploads/") + uploadGuidAsString, FileMode.CreateNew, FileAccess.Write, FileShare.None))
{

    SaveFile(context.Request.InputStream, fs);
    fs.Flush();

}

Ответы [ 2 ]

1 голос
/ 11 июня 2011

Сокеты TCP могут обнаруживать разорванное соединение, только когда данные фактически передаются через соединение.Когда соединение вашего загрузчика прерывается, с дальнего конца больше не отправляются данные.Поскольку ваш сервер не отправляет данные загрузчику, он просто ждет, ожидая, что в конечном итоге от клиента загрузчика будет поступать больше данных.

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

0 голосов
/ 11 июня 2011

Вам нужен идентификатор, который может однозначно идентифицировать сеанс загрузки, и протокол, который может разрешить возобновление загрузки (GUID?).При переподключении загрузчик может затем отправить идентификатор и с какого смещения в файле он хочет возобновить.Затем сервер может использовать идентификатор для поиска экземпляра класса, который обрабатывает эту загрузку, и, как предлагает Dark Falcon, просто закрыть «старое» соединение, переместить указатель файла в соответствии с запросом и возобновить потоковую / чанковку на новом соединении.Я полагаю, вам понадобится некоторое время для удаления устаревших объектов сеанса загрузки на сервере.Ваш протокол может иметь дело с этим - что произойдет, если клиент запросит возобновление после истечения времени ожидания и освобождения экземпляра сеанса загрузки?

Rgds, Martin

...