Загрузка файла ASMX - PullRequest
       30

Загрузка файла ASMX

7 голосов
/ 26 января 2011

Есть ли способ загрузить файл из локальной файловой системы в папку на сервере с помощью веб-служб ASMX (без WCF, не спрашивайте, почему:)?

UPD

Размер PS-файла может быть 2-10 ГБ

Ответы [ 4 ]

9 голосов
/ 26 января 2011

Sure:

[WebMethod]
public void Upload(byte[] contents, string filename)
{
    var appData = Server.MapPath("~/App_Data");
    var file = Path.Combine(appData, Path.GetFileName(filename));
    File.WriteAllBytes(file, contents);
}

затем предоставьте сервис, сгенерируйте клиентский прокси из WSDL, вызовите стандартный материал.

-

UPDATE:

Теперь я вижу ваше обновление об обработке больших файлов. Протокол MTOM с потоковой передачей , встроенный в WCF, оптимизирован для обработки таких сценариев.

2 голосов
/ 26 января 2011

При разработке моего бесплатного инструмента для загрузки больших файлов на сервер я также использую .NET 2.0 и веб-службы.

Чтобы сделать приложение более устойчивым к ошибкам для очень больших файлов, я решил не загружатьодин большой массив byte[], но вместо этого выполняется загрузка по частям.

Т.е. для загрузки файла размером 1 МБ я вызываю функцию SOAP загрузки 20 раз, каждый вызов передает массив byte[] размером 50 КБ.и снова объединяю его на сервере.

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

Это делает загрузку более устойчивой к ошибкам и более отзывчивой в пользовательском интерфейсе.

Если вам интересно, это статья CP инструмента .

0 голосов
/ 26 января 2011

У нас было такое же требование, в основном загрузка файла через HTTP POST с использованием стандартных FileUpload элементов управления на стороне клиента.В конце мы просто добавили страницу ASPX в проект веб-службы ASMX (в конце концов, это всего лишь веб-проект) - это позволило нам загрузить, например, http://foo/bar/Upload.aspx, когда веб-служба была на http://foo/bar/baz.asmx.Это сохраняло функциональность внутри веб-службы, даже если она использовала отдельную веб-страницу.

Это может или не может соответствовать вашим требованиям, подход @Darins также будет работать как обходной путь, но вам придетсямодификации на стороне клиента для этого, что не было для нас вариантом.

0 голосов
/ 26 января 2011

Для очень больших файлов единственный эффективный способ отправить их в веб-сервисы - MTOM .И MTOM поддерживается только в WCF , что вы исключили.Единственный способ сделать это с помощью веб-сервисов .asmx старого стиля - это ответ, который дал @Darin Dimitrov.И с этим решением вам придется понизить стоимость файла, кодируемого base64 (пропускная способность на 33% больше).

...