Службы Reporting Services в формате PDF через WebRequest в C # 3.5 «Неподдерживаемый тип файла» - PullRequest
5 голосов
/ 10 декабря 2008

Я унаследовал унаследованное приложение, которое должно на лету получать 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();

Ответы [ 3 ]

1 голос
/ 10 декабря 2008

Просмотр pdf-файла, который вы вернули в notepad.exe. Я подозреваю, что вы увидите там HTML. Если вы вызываете веб-страницу, которая является проходной страницей, это приводит к разрыву файла PDF. Веб-запрос вернет HTML, а не файл PDF.

Если вы позвоните на веб-сайт, который имеет PDF-файл напрямую, например http://www.somesite.com/file.pdf, ваш код будет работать. Проблема в том, что у вас, вероятно, есть проход по веб-странице, которая скрывает истинное местоположение файла PDF.

Я обошел это путем создания DLL-библиотеки ISAPI, которая позволяла передавать параметры, необходимые для определения того, какой файл PDF необходимо отправить обратно. Затем DLL-библиотека ISAPI вернула бы обратно файл pdf с типом содержимого «application / pdf».

1 голос
/ 11 декабря 2008

Те из вас, кто предположил, что проблема в том, что HTML вернулся с URL, указали мне правильное направление. Фактически именно тогда я понял, что оригинальный программист использовал метод PUT вместо метода GET.

Итак, исправив единственную строку:

request.Method = WebRequestMethods.Http.Post;

Все идет вперед, розы ... эээ ... pdf ... все, что работает.

Спасибо, что указали мне в правильном направлении. Иногда это просто требует второго взгляда.

0 голосов
/ 10 декабря 2008

Может ли ваша проблема быть вызвана объявлением байтового массива длиной 2048, а не основанием длины на длине потока, возвращаемого GetResponseStream ()?

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