ASP.NET Response.TransmitFile () не работает - PullRequest
1 голос
/ 07 сентября 2010

Я вызываю [WebMethod] с куском JQuery. Целью следующего кода является отправка недавно заархивированного файла в браузер пользователя. Когда пользователь нажимает кнопку «Загрузить», на страницу ASP.NET отправляется запрос AJAX, который должен отправить файл zip.

Вот код.

[WebMethod]
    public static void DownloadAlbum(string folderToDownload)
    {
        string archiveDir = "";

        ...some code...

        HttpContext.Current.Response.ContentType = "application/zip";
        HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + path);
        HttpContext.Current.Response.TransmitFile(path);
        HttpContext.Current.Response.End();
    }

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

У 'path' ОПРЕДЕЛЕННО правильный адрес, и когда адрес файла является жестким кодом, то же самое происходит.

Любая помощь будет принята с благодарностью!

Спасибо,

1 Ответ

1 голос
/ 07 сентября 2010

Когда я передаю файлы через веб-сервис, я обычно делаю вещи немного по-другому. Я не буду притворяться, что это единственный способ сделать это, но это работало для меня в прошлом.

Я предпочитаю получать документы, используя 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-включить методы чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...