Я унаследовал унаследованное приложение, которое должно на лету получать pdf с сервера служб отчетов. Все работает до тех пор, пока вы не попытаетесь открыть возвращаемый PDF-файл, и Adobe Acrobat скажет вам:
Не удалось открыть Adobe Reader
'thisStoopidReport'.pdf', потому что это
либо не поддерживается тип файла или
потому что файл был поврежден (для
Например, он был отправлен по электронной почте
вложение и было не правильно
декодируется).
Я сделал некоторые начальные проблемы по этому вопросу. Если я заменил URL-адрес в вызове WebRequest.Create () на мой локальный компьютер действительным файлом PDF, т. Е. @ "C: temp / validpdf.pdf"), я получу действительный PDF.
Кажется, что сам отчет работает нормально. Если я вручную ввожу URL-адрес отчета служб отчетов, который должен сгенерировать файл PDF, мне будет предложено ввести аутентификацию пользователя. Но после предоставления я получаю действительный файл PDF.
Я заменил фактические строки url, username, userpass и domain в приведенном ниже коде поддельными значениями по очевидным причинам.
WebRequest request = WebRequest.Create(@"http://x.x.x.x/reportServer?/reports/reportNam&rs:format=pdf&rs:command=render&rc:parameters=blahblahblah");
int totalSize = 0;
request.Credentials = new NetworkCredential("validUser", "validPass", "validDomain");
request.Timeout = 360000; // 6 minutes in milliseconds.
request.Method = WebRequestMethods.Http.Post;
request.ContentLength = 0;
WebResponse response = request.GetResponse();
Response.Clear();
BinaryReader reader = new BinaryReader(response.GetResponseStream());
Byte[] buffer = new byte[2048];
int count = reader.Read(buffer, 0, 2048);
while (count > 0)
{
totalSize += count;
Response.OutputStream.Write(buffer, 0, count);
count = reader.Read(buffer, 0, 2048);
}
Response.ContentType = "application/pdf";
Response.Cache.SetCacheability(HttpCacheability.Private);
Response.CacheControl = "private";
Response.Expires = 30;
Response.AddHeader("Content-Disposition", "attachment; filename=thisStoopidReport.pdf");
Response.AddHeader("Content-Length", totalSize.ToString());
reader.Close();
Response.Flush();
Response.End();