Когда я передаю файлы через веб-сервис, я обычно делаю вещи немного по-другому. Я не буду притворяться, что это единственный способ сделать это, но это работало для меня в прошлом.
Я предпочитаю получать документы, используя HTTP-глагол GET, следующим образом:
[WebMethod()]
[ScriptMethod(UseHttpGet = true)]
public void DownloadAlbum(string folderToDownload)
{
var path = // calculate and validate path...
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + path);
HttpContext.Current.Response.TransmitFile(path);
HttpContext.Current.Response.End();
}
Обратите внимание, что этот метод относится к службе .asmx и не является статическим.
В файле web.config я включаю службу (Documents.asmx) для HttpGet следующим образом:
<location path="Documents.asmx">
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
</protocols>
</webServices>
</system.web>
</location>
Если служба настроена таким образом, она может быть вызвана через обычную гиперссылку без AJAX с URL-адреса приложения ~/Documents.asmx/DownloadAlbum?folderToDownload=myfoldername
.
Обратите внимание, что для снижения риска CSRF-атак следует избегать включения HttpGet в службе, которая может обновить вашу систему. Обычно я сохраняю методы вставки / обновления / удаления в отдельном сервисе, если планирую GET-включить методы чтения.