Службы Reporting Services в формате PDF через WebRequest в C # 3.5 «Неподдерживаемый тип файла»

Я унаследовал унаследованное приложение, которое должно извлекать на лету 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();
10.12.2008 17:18:59
3 ОТВЕТА

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

0
10.12.2008 20:36:05

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

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

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

1
10.12.2008 20:46:16

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

Итак, исправляя одну строку:

request.Method = WebRequestMethods.Http.Post;

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

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

1
22.01.2012 11:47:00
«Второй набор глаз» также называют «отладка резиновой утки», Google это :)
Adriaan Davel 31.08.2013 03:18:33