Предотвращение автоматической загрузки IDM в веб-api

У меня есть метод web api, который возвращает HttpResponseMessage, содержащий файл PDF. Метод выглядит примерно так:

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StreamContent(new FileStream(path, FileMode.Open, FileAccess.Read));
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
return response;

Когда я вызываю этот api из клиента (который написан в angularJS), Internet Download Manager автоматически ловит файл PDF и хочет его загрузить. И поскольку у меня есть план безопасности для моего проекта, IDM автоматически запрашивает имя пользователя и пароль. Кто-нибудь имеет представление о том, как я должен программно отключать IDM, чтобы поймать PDF файл?

Обновление: Здесь мой код angularJS:

$http.post(url, { transactionId: txId }
            , {responseType: 'arraybuffer'})
            .success(function (response) {
                var reader = new FileReader();
                var file = new Blob([response.data], {type: 'application/pdf'});
                reader.onload = function (e) {
                    var printElem = angular.element('#printPdfLink');
                    printElem.attr('target', '_blank');
                    printElem.attr('href', reader.result);
                    printElem.attr('ng-click', '');
                };
                reader.readAsDataURL(file);
            })
            .error(function (error) {});

Ответы

Ответ 1

Измените тип mime на application/octet-stream как способ обойти вашу проблему. Убедитесь, что имя файла содержит правильное расширение файла, так что оно может быть распознано клиентской системой после загрузки.

Другая проблема - это размещение attachment содержимого, которое обычно заставляет его сохранять его в качестве загрузки файла. Измените его на inline, чтобы клиент мог использовать его без IDM, пытаясь загрузить его в качестве вложения.

var stream = new FileStream(path, FileMode.Open, FileAccess.Read);
var content new StreamContent(stream);
content.Headers.ContentDisposition = new ContentDispositionHeaderValue("inline");
content.Headers.ContentDisposition.FileName = fileName;
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = content;
return response;

Ответ 2

Я пытаюсь использовать HttpResponseMessage.

Если я использую ContentDisposition is inline, тогда ответ разбивает файл. Если используется attachment, то IDM может его обнаружить.

В конце дня я обнаружил, что заголовок Accept-Ranges может загружать без IDM, но он недействителен в HttpResponseMessage.

Вы можете попробовать мой код ниже, чтобы скачать файл без IDM:

[HttpGet]
[Route("~/download/{filename}")]
public void Download(string filename)
{
    // TODO lookup file path by {filename}
    // If you want to have "." in {filename} you need enable in webconfig
    string filePath = "<path>"; // your file path here
    byte[] fileBytes = File.ReadAllBytes(filePath);
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.AddHeader("Accept-Ranges", "bytes");
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AddHeader("ContentDisposition", "attachment, filename=" + filename);
    HttpContext.Current.Response.BinaryWrite(fileBytes);
    HttpContext.Current.Response.End();
}

Примечание: параметр filename служит для загрузки имени файла, поэтому вы можете настроить его в webconfig, если хотите иметь расширение файла (по умолчанию отключено).