Я пытаюсь открыть документ PDF в новой вкладке с AngularJS.PDF загружается в виде байтового массива из контроллера .NET Web API следующим образом:
[HttpPost]
[Route("PdfDocument")]
public async Task<HttpResponseMessage> GetPdf(int it)
{
MemoryStream memoryStream = new MemoryStream();
PdfService pdfService = new PdfService();
using (var stream = await pdfService.GetDocument(id))
{
try
{
stream.CopyTo(memoryStream);
stream.Close();
}
catch(Exception ex)
{
stream.Close();
throw new Exception("Exception: ", ex);
}
}
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new ByteArrayContent(memoryStream.ToArray());
response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue(System.Net.Mime.DispositionTypeNames.Inline)
{
FileName = "file.pdf"
};
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
return response;
}
В классе PdfService для загрузки документов PDF у меня есть следующие методы:
public async Task<Stream> GetDocument(int id)
{
try
{
var stream = await this.getPdfDocument(id);
return stream;
}
catch (Exception ex)
{
throw new Exception("Exception: ", ex);
}
}
private async Task<Stream> getPdfDocument(int id)
{
try
{
var credentials = new CredentialsCache();
credentials.Add(....);
using (var handler = new HttpClientHandler() { Credentials = credentialCache })
{
using (var client = new HttpClient(handler))
{
client.DefaultRequestHeaders.ExpectContinue = true;
var stream = await client.GetStreamAsync(id);
return stream;
}
}
}
catch (Exception ex)
{
throw new Exception("Exception: ", ex);
}
}
На стороне клиента код для загрузки байтового массива PDF и его отображения на новой вкладке браузера следующий (это внутри директивы AngularJS):
scope.openPdfInTab = function() {
var pdfId = 1234;
scope.pdfParameters = {
"id": pdfId
}
resource.pdf.open(scope.pdfParameters,
function(data) {
var file = new Blob([data.content], { type: "application/pdf" });
var fileURL = URL.createObjectURL(file);
window.open(file, '_blank');
}
);
}
Проблема в том, что ничего не происходит.Новая вкладка не открыта, и в консоли разработчика (в Chrome) нет ошибок, и если я отлаживаю ее, я вижу, как выглядят правильные данные, возвращаемые из Web API.Снимок экрана 1 - это то, как выглядит ответ в контроллере Web API, а снимок экрана 2 содержит данные PDF, файл и URL-адрес файла на стороне клиента.
Снимок экрана 1
Снимок экрана 2
Я попытался заменить "data.content" на "data" в следующемстрока в коде на стороне клиента, с тем же результатом:
var file = new Blob([data.content], { type: "application/pdf" });
Есть идеи, в чем здесь проблема?