Я провел некоторое время этим утром, пытаясь помочь коллеге с странной ошибкой, которая в настоящее время приводит нас в тупик трое.Сценарий состоит в том, что у нас есть система в разработке, которая позволяет пользователям прикреплять файлы PDF к записи данных.Система использует сервис для хранения и извлечения файлов с сервера и сохраняет идентификатор в таблице вложений, чтобы указать, какие файлы принадлежат каким записям.
Затем, на двух разных страницах приложения, у нас есть сетка, которая отображает список вложений для записи.В сетке находятся кнопки ссылок, которые позволяют пользователю открыть данное вложение.Кнопка ссылки вызывает событие команды, передавая идентификатор вложения в качестве аргумента.В обработчике события команды мы берем идентификатор из аргумента, используем его для извлечения вложения из службы в виде байтового массива, а затем перезаписываем объект ответа для возврата вложения.Вот код:
byte[] byteFile = DataHandler.GetAttachmentDocument(selectedAttachmentID);
if (DataHandler.sErrorMsg != "")
{//Error trying to retrieve file...
this.DisplayMessageBox(DataHandler.sErrorMsg);
}
else
{//File retrieved...
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=" + lblAttachmentName.Text);
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(byteFile);
Response.Flush();
Response.Close();
Response.End();
}
Теперь этот точно такой же код отлично работает на одной странице и не работает на другой.В обоих случаях, когда нажимается кнопка и появляется диалоговое окно загрузки, нажмите кнопку «Открыть», и откроется окно Adobe Reader.На рабочей странице в окне считывателя отображается запрошенный документ, но на другой странице мы получаем сообщение об ошибке из окна считывателя: There was an error opening this document. This file cannot be found.
Запустившись в отладчике, мы можем пройти и увидеть, что получаем такое же количество байтов вbyteFile, и что мы переходим к полному методу без ошибок.
Мы немного погуглили по этому вопросу и попробовали несколько вариантов этого кода, не испытав при этом удачи.Несколько вещей, которые я знаю, мы пытались изменить тип контента на поток октетов, добавить длину контента в заголовок, изменить буфер на false, удалить атрибут размещения контента.Единственная заметная разница заключалась в удалении атрибута размещения содержимого, в этом случае документ отображался, но отображался в исходном окне, а не в отдельном окне Adobe Reader.Еще одна идея, которая была предложена, но пока не опробована, состоит в том, чтобы извлечь сетку и связанную логику из веб-элемента управления, который затем можно будет повторно использовать на обеих страницах.Любые другие предложения?