ASP.NET rdlc с внешними изображениями, не отображающими изображения в формате PDF

StackOverflow https://stackoverflow.com/questions/1268820

  •  13-09-2019
  •  | 
  •  

Вопрос

Я использую Microsoft ReportViewer, который поставляется с ASP.NET, и у меня есть параметр отчета, который должен задавать значение (путь) изображения в моем отчете.Прямо сейчас я предоставляю путь в виде полного URL-адреса, начиная с http://, но также пробовал это как относительный путь к приложению, корневой путь к сайту и т. д.и по какой-то причине изображение всегда отображается как красный X при экспорте в PDF.Я просто создаю экземпляр элемента управления в коде, устанавливаю свойства и экспортирую непосредственно в поток ответов, чтобы он выполнял загрузку.

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

ОБНОВЛЕНИЕ 1

Я определил, что могу встроить изображение с помощью URL-адреса, если оно находится на моем общедоступном веб-сервере, но когда я работаю на локальном хосте, изображение не будет вставлено.Я подтвердил для localhost, что если я вставлю тот же URL-адрес в свой браузер, изображение откроется нормально.Насколько я знаю, у меня нет прокси.Итак, я могу обойти свою проблему, но я все еще не понимаю, в чем проблема с localhost.

ОБНОВЛЕНИЕ 2

Забыл упомянуть, что когда URL-адрес изображения открывается из браузера, он работает нормально.

Это было полезно?

Решение

PDF-файл не может содержать ссылку на внешнее изображение (по крайней мере, насколько я понимаю).Чтобы изображение появилось в PDF-файле, оно должно быть встроено в документ.Следовательно, чтобы использовать внешнее изображение, ваше приложение должно получить изображение и сохранить его в документе.Средство просмотра отчетов попытается сделать это за вас.

Два возможных ответа:

Первый, чтобы ваше приложение могло упаковать изображение в PDF-файл, оно должно иметь возможность получить изображение по указанному вами URL-адресу.Если этот URL-адрес находится за прокси-сервером (с точки зрения вашего сервера приложений) и/или для доступа требуются учетные данные, это создаст проблемы с конфигурацией средства просмотра отчетов по умолчанию.

Если проблема в прокси-сервере, ознакомьтесь с настройками вашего web.config, которые вы можете добавить ниже.Вам также может потребоваться предоставить сетевые учетные данные, чтобы ваше приложение могло пройти аутентификацию на прокси-сервере.Есть много способов решить эту проблему, но один из самых простых — запустить ваше приложение как учетную запись службы в вашем домене, имеющую права на доступ к вашему прокси.Вы можете проверить это, временно запустив сайт от своего имени (должно быть временно, потому что это ужасная практика безопасности).

Для доступа к используемому вами изображению могут потребоваться учетные данные (попробуйте загрузить изображение в Firefox с пустыми файлами cookie и проверить, требуются ли учетные данные для доступа к нему).Если требуется проверка подлинности Windows, то же решение, касающееся безопасности прокси-сервера, может применяться к проверке подлинности, необходимой для удаленного образа.Если для этого требуется какая-то другая форма аутентификации, возможно, вам лучше загрузить и встроить изображение в свой проект.

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

Второй, взгляните на следующую страницу:

http://msdn.microsoft.com/en-us/library/ms251715%28VS.80%29.aspx

Использование внешних изображений в отчете ReportViewer не включено по умолчанию.Чтобы использовать внешнее изображение, вы должны установить свойство EnableExternAlimages в вашем коде.В зависимости от конфигурации вашей сети, вам также может потребоваться обойти настройки прокси, чтобы позволить внешнему изображению появиться.Вы можете добавить следующие настройки в файл web.config, чтобы обойти локальный прокси.При изменении файла web.config обязательно укажите имя прокси -сервера, который используется в вашей сети:

<system.net>
<defaultProxy>
<proxy usesystemdefault = "false" bypassonlocal = "true" proxyaddress = "http://< proxyservername >:80/" />
<defaultProxy>
</system.net>

Надеюсь, один или оба из них помогут.

Джерри

Другие советы

При передаче имен файлов внешних изображений в параметры ReportViewer передайте следующий формат:файл://C:\app\images\pic.jpg.Все остальное обычно не работает должным образом при развертывании.

Хорошо, это было наше решение.Веб-сервер не распознал свое собственное полное DNS-имя в качестве URL-адреса, поэтому нам пришлось отредактировать файл Hosts в папке C:\Windows\System32\drivers\etc и добавить имя хоста как localhost.Строка, которую мы добавили в файл, была:

нашсервер.ourdomain.com 127.0.0.1

Вы пробовали обычный путь к файлу (c:/temp/somefile.bmp)?Локальный отчет служб отчетов считывает файл с диска и встраивает его в созданный PDF-файл.Убедитесь, что удостоверение пула приложений в IIS имеет разрешение на чтение файла изображения.

Мы делаем это, и наши изображения помещаются в папку img на веб-сайте вместе с остальными изображениями веб-сайтов.Мы избегаем жесткого кодирования пути, используя Server.MapPath(относительный путь).

Надеюсь это поможет

  1. Может ли средство просмотра отчетов получить изображение по относительному URL-адресу?Я никогда не использовал его, поэтому лучше проверить это предположение.
  2. Пробовали ли вы использовать помощник Html.Content() для установки URL-адреса?Всякий раз, когда у меня возникают проблемы с URL-адресами, это происходит потому, что я не использовал их для создания правильного URL-адреса для представления.

Я не думаю, что Adobe Reader (или, может быть, сама спецификация PDF?) позволяет загружать внешний контент в целях безопасности.Я смутно припоминаю, что у меня была похожая проблема, не имевшая ничего общего со службами отчетов (я динамически создавал PDF-файлы и использовал переменные логотипы, и мне приходилось их встраивать).

Я исправил свою проблему следующим образом:

//For local relative paths
string imgUrl = new Uri(HttpContext.Current.Server.MapPath("~/images/mylocalimage.jpg")).AbsoluteUri;

// OR

// For complete URLs
{
    ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; // This allows reportViewer to download image from url
    string imgUrl = /* Your image URL ("http://") */;
}
//Then pass imgUrl parameter as external source of your image. 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top