Aspnetcore: Отчетность ядра Asp.Net (SSRS)

Созданный на 2 июн. 2016  ·  269Комментарии  ·  Источник: dotnet/aspnetcore

Я работаю над приложением ASP.NET Core и не могу найти решение для отображения отчетов SSRS. При отсутствии «Microsoft.Reporting.WebForm» больше не работает. Каков наилучший способ отображения отчетов SSRS в Интернете в ASP.NET Core

External

Самый полезный комментарий

Почти 2 года. Выпущено ядро ​​2.0. Команда SSRS, просыпайтесь.

Все 269 Комментарий

Поскольку Core все еще находится в стадии RC (RTM к концу месяца), я не думаю, что сценарий SSRS планируется в течение следующих 6 месяцев, но я не являюсь частью команды.

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

Если вам нужно что-то более «интегрированное», вы можете проверить этот пакет сообщества:

https://github.com/ilich/MvcReportViewer

Судя по проблеме https://github.com/ilich/MvcReportViewer/issues/121 , они заинтересованы в ее интеграции, но пока безуспешно.

Я не понимаю, почему основные инициативы dotnet и ASP.net не раскрывают эту проблему во всех предыдущих объявлениях. Это как
[Отчетность не является серьезной проблемой для разработчиков, и они могут справиться с этим, используя классы html и print css]
в настоящее время мы переносим небольшую ERP-систему с большим количеством файлов ssrs и rdlc, и подход css не приносит никакой пользы в отчетах между браузерами.
с другой стороны, на прошлой неделе Microsoft выпустила ssrs 2016 с чистым средством просмотра html5, которое устранило необходимость установки ActiveX [что было единственным недостатком использования ssrs в браузерах, отличных от IE]
Программа просмотра ssrs 2016 идеально подходит для базовой экосистемы asp.net.
но официального заявления о поддержке ядра asp.net не было.

это все заблокировано System.Drawing ?? потому что даже itextsharp до сих пор не выпускал библиотеку.
если это System.Drawing, то, по крайней мере, реализация Windows может быть завершена до [linux и OSX], чтобы увеличить принятие для текущего разработчика Windows, вместо того, чтобы ждать полной кроссплатформенной реализации для System.Drawing

Я надеюсь, что этот пост заставит команду пересмотреть некоторые приоритеты, чтобы включить ssrs в ядре asp.net.

с уважением к MvcReportViewer, упомянутому в предыдущем посте (это оболочка для средства просмотра веб-форм), и в прошлом это помогло многим разработчикам mvc преодолеть отсутствие средства просмотра отчетов mvc в mvc1 - mvc5 [Большое спасибо ilich], я надеюсь увидеть полное решение, потому что ssrs не был первоочередным приоритетом, и люди об этом не говорили в предварительном mvc.

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

@ ddddddddeee22211 Это V1.

Первоначально вы не поставляете с поддержкой SSRS. Поддержка SSRS, вероятно, будет исходить от группы SSRS, а не от команды .NET. Поскольку мы еще даже не вышли из RC, я не считаю это важной особенностью V1.

Если вам нужно делать отчеты, могу ли я порекомендовать просто запустить версию веб-форм? Да уж. Это старый. Но, по крайней мере, это работает и поддерживается.

Если вам нужны отчеты X-Plat, я порекомендую что-нибудь вроде Chartist . Это позволяет создавать диаграммы прямо на клиенте. Добавьте файл CSS для печати и бум. У вас есть отчеты, которые можно распечатать.

с вашей точки зрения это может быть не критично
но некоторые другие разработчики считают это очень важным для своих проектов, потому что, как только они разработают приложение и начнут работать с ним, задачи разработки будут отложены, а задачи по отчетности станут повседневными рутинными задачами. Также некоторые проекты обрабатывают создание отчетов для команды BI (бизнес-аналитики), которая знает, как использовать ssrs, но не имеет представления о ядре asp.net.

Целью моего поста было понять положение ssrs в основной экосистеме asp.net. или если он будет проигнорирован, как от mvc1 до mvc5. Команда ssrs входит в состав Microsoft, и основная команда asp.net может обсудить с ними проблему.
Что свело меня с ума, так это то, что на прошлой неделе я увидел заметку о выпуске ssrs 2016, в которой ничего не упоминалось о ядре asp.net. с другой стороны, вы видите постоянную поддержку azure в asp.net core. поверьте мне, если мы не повысим спрос на ssrs, он будет проигнорирован, как и в предыдущем mvc 5.

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

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

@ ddddddddeee22211 Ааа ... тогда я не могу ответить.

Прямо сейчас единственный способ заставить компоненты SSRS работать в ASP.NET - это WebForms.

Если вам нужна их стратегическая позиция или они ее поддержат, нам нужно дождаться ответа от сотрудника MS.

Может, мы можем / cc @coolcsh ? Он может не отвечать здесь, но было бы неплохо написать в блоге проясняющую позицию.

В группе SSRS мы знаем об ограничениях веб-форм ASP.NET, и мы активно исследуем и работаем над новыми параметрами для элемента управления Report Viewer.
благодаря

@jtarquino

Спасибо за ответ, чувак!

Мы хотели альтернативы со времен MVC. : stuck_out_tongue_winking_eye:

Это сделало мой день лучше. [~ счастливый конец ~]
Спасибо @jtarquino , @MaximRouiller за все усилия.

@jtarquino
Звучит здорово :-)

Можете ли вы что-нибудь сказать о том, когда вы планируете выпустить первую версию «новой опции» для Report Viewer Control?
(Есть ли дорожная карта / план для этого?)

Br.
Бо

К сожалению, на данный момент у меня нет графика, чтобы поделиться

пробовали ли вы использовать библиотеку, установив пакет в консоли диспетчера пакетов и введите следующую команду в командное окно.

PM> Установка пакета ReportViewerForMvc
хотя я пробовал использовать веб-формы, и они выглядят неплохо.

untitled

@bethwellagat
снова возникает ошибка " зависимость ReportViewerForMvc не поддерживает framework .NetCoreapp "
ноты:
работает над проектом ASP.NET Core

@jtarquino пингует это. Похоже, интереса больше: https://github.com/aspnet/Mvc/issues/5332

@jtarquino Кстати, если вы хотите начать обсуждение с моей командой, напишите мне, и мы поговорим.

Оооо мне нравится! Мяч катится! 😀

Привет всем, я только что закончил писать настраиваемый порт элемента управления средства просмотра отчетов с использованием ReportExecutionService.asmx, встроенного в SSRS, и я ориентировался на ASP.NET MVC. Мне кто-то предлагал перенести его на .NetCore и MVC, поэтому я закончил. Попробуйте и дайте мне знать, что вы думаете: https://github.com/alanjuden/MvcReportViewer

Алан

Похоже, что прошло около трех месяцев с тех пор, как здесь обсуждался ReportViewer в ASP Netcore MVC. Я работаю с версией, которую предоставил Алан Джуден в проекте, который я перехожу с WinForms на netcore. Есть ли какие-либо признаки того, что Microsoft предлагает первоклассную поддержку SSRS ReportViewer, или они поместили SSRS в тот же шкаф, что и Visual FoxPro несколько лет назад?

Есть прогресс MS? На данный момент лучшим вариантом является использование стороннего инструмента, такого как Telerik Reports, для визуализации в браузере и серверной части SSRS для подписок на отчеты. Может быть, как писал ddddddddeee22211, SSRS 2016 уже имеет возможность через механизм рендеринга HTML5, но документации не существует?

Привет @Eilon.

Есть новости с сентября? Тем более, что вы, ребята, запустили 1.0 (поздравляю!), Давление должно немного снизиться.

Чем вы можете поделиться?

/ cc @jtarquino

Ничего такого, чем я могу поделиться, как только у меня появятся новости о ядре .NET, вы узнаете первым.
Как вы упомянули, мы только что выпустили последнюю версию nuget для элемента управления ASP.NET Webforms и Winforms.

Я также хотел бы добавить свою подсказку в команду ... Это серьезная проблема. Я ценю решение AlanJuden, но нам нужно «официальное» решение ... Учитывая, что ядро ​​1 отсутствует в течение нескольких месяцев, было бы полезно сообщить кое-что о статусе этого. Если бы вы могли сообщить нам о сроках решения, это было бы кое-что. Эта проблема настолько велика, что помешает нам использовать ядро ​​mvc. Одна запись. Нам действительно нужно решение, которое позволяет пользователям не входить в систему ssrs. Вот почему мой проект должен использовать текущую программу просмотра отчетов (с помощью программы просмотра отчетов у нас есть проект mvc, обеспечивающий стандартный вход на сервер ssrs для всех пользователей)

Sql server 2017 сейчас является предварительным просмотром сообщества2
И
Релиз .net standard 2.0 близок с последним анонсом
И до сих пор нет ни слова о встроенном средстве просмотра отчетов ядра asp.net
Пригласите других разработчиков к участию в этом выпуске, чтобы высказать свое мнение и сообщить команде о необходимости таких усилий для создания шедевра, о котором мечтает каждый разработчик.

@jtarquino : есть ли форум или пользовательский голос для SSRS?
как пользователи могут связаться с командой SSRS?

Да форум есть
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/home?forum=sqlreportingservices
также вы можете проверить наш блог
https://blogs.msdn.microsoft.com/sqlrsteamblog/

Спасибо, мне действительно нужна помощь в настройке моего нового приложения для работы с SSRS.
Есть ли способ получить код, используемый элементом управления веб-формами для страницы aspx для разрыва?
Я хотел бы посмотреть, смогу ли я создать представление angular 2, которое «работает как» и «выглядит как» элемент управления веб-формами.

Привет,

Мы планируем перенести некоторые из наших веб-сайтов и т. Д. На ядро ​​asp.net, но некоторые из них включают элемент управления SSRS Report Viewer. Есть ли прогресс в управлении средством просмотра отчетов для ядра .NET?

благодаря
Тим

Если вы ориентируетесь на Full .NET 4.x, а не на .NET Core, примите во внимание этот № 2022, прежде чем переходить на ASP.NET Core.
ASP.NET Core 2 не поддерживает полную версию .NET 4.x

@ikourfaln. Скорее спорный вопрос на этом этапе, поскольку в ядре asp.net нет средства просмотра отчетов, которое можно было бы сломать. В связи с предстоящими изменениями в третьем квартале в asp.net core 2, а также в стандарте .net 2 с прокладками совместимости, которые позволяют ориентироваться на структуру .net, я думаю, маловероятно, что Microsoft напишет средство просмотра отчетов для текущего ядра asp.net. 1.1.

в настоящее время я пытался войти в расширения аутентификации для SSRS и обнаружил, что это настоящий беспорядок, чтобы попытаться изменить, вы можете ввести новую аутентификацию / вход в систему, но затем, когда вы попытаетесь включить CORS, чтобы веб-приложение могло вызывать SSRS чтобы запустить отчет, браузер не может заставить работать предварительный запрос OPTIONS, и на этом вся идея заканчивается.

Итак, теперь я создаю веб-приложение для веб-форм, в которое я добавляю поддержку OpenId Connect, чтобы я мог работать с единым входом между моим новым блестящим приложением angular и моими отчетами

тогда я посмотрю, смогу ли я как-нибудь объединить их с помощью хакерских фреймов или других средств.

Хотелось бы, чтобы Microsoft обновила ssrs, чтобы лучше работать с новыми веб-технологиями.

Другая мысль: SSRS KPI и мобильные отчеты: есть ли способ использовать их в веб-приложении?

@alanjuden Есть ли возможность настроить ваш пакет для включения рендеринга отчетов rdlc? Установка сервера отчетов и управление им для каждого клиента - настоящая боль.

@IonRobu , я могу быть сумасшедшим ... но я не

Настоящая причина, по которой я не буду этого делать, заключается в том, что я сделал только интерфейсную программу просмотра отчетов. Я полностью полагаюсь на SSRS для рендеринга отчета и передачи мне данных отчета через SSRS API. Поэтому для этого требуется серверная часть сервера отчетов. Извините, но это будет намного больше работы, чем я собираюсь сделать в этом проекте. Я создал свой MvcReportViewer как простое решение, позволяющее обойти проблемы, связанные с внедрением версии элемента управления ASP.NET WebForms.

Сервер отчетов или RDLC, который называется «клиентскими отчетами».
Сервер отчетов требует больше работы по настройке и управлению. Да, это правда.
но у него есть ряд преимуществ:

Отчеты отображаются на внутреннем сервере, который снимает рабочую нагрузку с интерфейсных веб-серверов.
результаты отчета можно обналичить, что может снизить нагрузку на ваш производственный sql-сервер.
сложные отчеты можно запускать по расписанию и работать в то время, когда в системе работает несколько пользователей и
запросы могут затем обслуживаться из этого предварительно скомпилированного снимка.
также при использовании SSRS строки подключения к серверу sql остаются на сервере отчетов и не нуждаются в управлении в файле конфигурации веб-сервера.
Кроме того, сервер SSRS становится центральной точкой, куда авторы отчетов могут публиковать отчеты, а все пользователи могут получать отчеты с сервера.
SSRS может настроить автоматическую отправку отчетов пользователям по электронной почте, вы можете отправить ссылку на сервер отчетов для некоторых пользователей и файл PDF, Word или Excel для других.

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

Так что да, если у вас есть только несколько отчетов и вам не нужны какие-либо преимущества, вы можете использовать rdlc.
но для более крупной системы, которая должна будет обслуживать множество отчетов для большого количества пользователей, сервер SSRS имеет действительно хорошие преимущества.
Кроме того, SSRS api очень эффективен для работы, вы можете вызвать api, чтобы вернуть отчет в формате pdf, например, без необходимости иметь какие-либо веб-формы на стороне клиента или элементы управления mvc viewer.
API также может управлять отчетами, загружать их на сервер, устанавливать разрешения и составлять списки отчетов.
на работе я использую api, чтобы позволить нашему клиентскому приложению отображать отчеты, которые пользователь может запускать, проверять параметры, необходимые для отчета, а затем запускать отчет для пользователя.

так что внимательно посмотрите на преимущества, а не только на накладные расходы администратора.

@figuerres
Отчеты клиентов превосходны в контексте, отличном от того, который вы описали
Многие клиенты не используют сервер отчетов и не имеют квалифицированного персонала для администрирования и обслуживания его проблем.
Также, когда вы отправляете продукт с настроенными отчетами (60+) для каждого клиента, вы сталкиваетесь с накладными расходами на развертывание приложения + развертывание отчетов.
Многие пользователи не являются техническими специалистами, которые могут понимать отчеты, создаваемые сервером и отображаемые в соответствии с ответом, без предварительного их предварительного просмотра (например, счет-фактуру можно легко проверить с помощью средства просмотра, чем загружать несколько исправленных счетов-фактур в разные вкладки)

Как видите, пользователю проще адаптироваться к простому средству просмотра отчетов, чем к сложным сценариям.
Также разработчики потратили бесчисленные усилия на разработку отчетов клиентов, и теперь они стали бесполезными в их истинном использовании.

Надеюсь, команда Microsoft понимает нашу боль

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

сегодня выпускается net Standards 2 с большим количеством API-интерфейсов для system.drawing
Может быть, это шанс сказать от команды srss слово о программе просмотра ssrs для ядра asp.net?

Моя компания в значительной степени полагается на документы экспорта отчетов RDLC в формате PDF. Невозможность сделать это в ядре .net по сути является препятствием для нас, использующих ядро ​​.net и работающее на других платформах, таких как докер.

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

Для тех, кто все еще ищет решение:
Если установлена ​​Java, можно в качестве альтернативы встроить Eclipse BIRT или JasperReports.
Из двух, JasperReports определенно является лучшей альтернативой SSRS (немного более сложной, но также намного более мощной / идеальной по пикселям).
Он имеет автономный и встраиваемый сервер отчетов, способный получить доступ к любому источнику данных JDBC, а также BigData, например Cassandra или Apache Spark (SparkSQL).

Он предоставляет отчеты и аналитику, которые могут быть встроены в веб-приложение или мобильное приложение, а также работать как центральный информационный центр для предприятия, доставляя критически важную информацию в режиме реального времени или по расписанию в браузер, мобильное устройство или почтовый ящик. в различных форматах файлов.

Вы можете выполнить автономное развертывание среды выполнения Java, предоставив BIRT / Jasper через Launch4j.

@jtarquino есть ли хорошие новости для .Net Core?

Я не могу поверить, что это все еще проблема спустя 15 месяцев после того, как она была поднята. Очень разочарован.

Нам действительно нужно, чтобы это работало, даже простая точка в SSRS, ReportName и Params, открытая в DIV или что-то в этом роде. Мы потратили много времени на создание отчетов SSRS непосредственно на SQL, и мне нужен способ их отображения в простом приложении Core2.0 MVC.

Какие-нибудь советы?

@cgountanis , у меня работает:
https://github.com/aspnet/Home/issues/1528#issuecomment -259169426

@cgountanis
Вам нужен отчет в формате pdf или полные интерактивные отчеты, как показывает веб-портал ??

Я могу дать вам несколько советов о том, как я делаю их из углового приложения

Вот что я делаю. Использует учетные данные клиента, которые могут не работать в большинстве случаев.
Увеличение размера страницы работает, а уменьшение - нет.


<strong i="7">@model</strong> string

@{
    ViewData["Title"] = "View Report";
}

<style>
    body {
        overflow-x: hidden;
    }
</style>

@{
    var src = "http://192.168.0.1/ReportServer/Pages/ReportViewer.aspx?/";
    src += ViewData["argument"];
}

<iframe style="overflow:hidden; overflow-x:hidden; overflow-y:hidden; border:none; width:100%; height: 1250px;" src=@src></iframe>

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

когда мы запускаем отчет, мы передаем пользователя сервера отчетов как пользователя, который запускает отчет, это отстой, поскольку это означает, что мы теряем «реального пользователя», если мы не регистрируем это в нашем коде.
но это касается зависимости сервера отчетов от учетных записей пользователей Windows. если бы они обновили его, чтобы использовать токен jwt и получать роли из токена, все было бы лучше для нас.

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

@ ctrl-brk У меня проблема с Core 2.0, может я что-то пропустил. https://github.com/alanjuden/MvcReportViewer/issues/43

@steelwil Спасибо, но мне нужен собственный NetworkCredential.

@figuerres Мы отображаем отчеты из SSRS, защищенного брандмауэром, приложение WebForm проделывает всю тяжелую работу с SSRS.ReportViewer, а не только для пользователей Windows. Хотя согласованный JWT был бы неплохим. Было бы здорово попытаться сопоставить функциональные возможности ReportViewer с WebForms / NUGET.

Спасибо всем!

В конце концов, они выпустят официальный NUGET для этого, верно?

@cgountanis «Они» - это команда SQL Server, а не группа ASP.NET Core. В этом и заключается проблема. Это другая команда.

@giddev, реальный вопрос здесь в том, действительно ли эта другая команда, о которой вы говорите, все еще существует в Microsoft и есть ли у них активные разработчики, которые все еще работают в команде, и достаточно ли у них гордости за свою работу, чтобы создать и опубликовать первоклассное решение для внедрения SSRS. отчеты в веб-приложение ASP.Net Core 1 или 2. Есть ли у них опубликованная дорожная карта? Является ли ASP.Net Core частью плана или от SSRS отказались и заменили на POWER BI? Я начинаю видеть признаки того, что SSRS движется к той же дыре, в которую упал Microsoft Visual FoxPro.

@wqwalter что-то в
У меня сложилось впечатление, что у Microsoft есть много команд, каждая из которых следует своей собственной карте, и не так много людей, которые следят за тем, чтобы у них был общий набор результатов и взаимодействия между ними.
это как пасутся кошки, все они взлетают в разные стороны ....

если это не так - ну вроде так.

Мне трудно поверить, что они откажутся от SSRS, так как он активно используется разработчиками сейчас, когда Crystal Reports непопулярен.

@cgountanis
Хотя мне и нравятся некоторые вещи от Microsoft, я видел 20-летнюю историю, когда они неоднократно останавливали продукты и делали вещи, которые не поддаются моему пониманию. Одним из примеров был Virtual PC, приобретенный Microsoft, проданный Microsoft какое-то время, затем они сделали его бесплатным, а затем убили.
это лишь один из многих подобных случаев ....

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

Приятно видеть, что SSRS поддерживает веб-аутентификацию - желательно OpenID Connect - из коробки. Еще один шаг - было бы здорово, если бы SSRS был nuget для ASP.NET Core. Планирование отчетов и администратор пользователей - возможно, предоставьте образец проекта, но я бы хорошо разработал эту часть с учетом документации по SSRS API.

@Morgma
согласовано!
OIDC идеально подходит для того, что я делаю.
роли должны быть выполнены, чтобы мы могли предоставить сопоставление ролей сервера отчетов с нашими ролями приложений.

прямо сейчас у меня есть приложение, которое использует OIDC с интерфейсом Angular 4/5, которое должно загружать страницу отчета веб-форм в iFrame и должно использовать учетные записи пользователей Windows для управления разрешениями, поэтому, если я запрашиваю базу данных сервера отчетов, я могу Фактически не видно, какие пользователи запускают отчеты. это клудж, который можно использовать, но он далек от идеала.

Это тоже серьезная проблема для нас, и я действительно не могу поверить, что мы до сих пор НИЧЕГО не слышали от Microsoft по этому поводу. Это серьезно заставляет нас рассматривать варианты, отличные от Microsoft. Если бы у нас был хотя бы график, мы могли бы принять обоснованное решение.

Я согласен, я пошел по пути использования ReportServer / ReportExecution2005.asmx напрямую, чтобы напрямую заставить экспорт работать. Отлично работает тогда, когда размещается под IIS, и возникают странные ошибки.

Это было неприятно.

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Basic'. The authentication header received from the server was ''

эта ошибка говорит, что заголовок для авторизации отсутствует, HTTP-запрос должен включать заголовок. это проблема?

Работает нормально, пока не размещен в IIS. Даже моя машина разработки обращается к тому же серверу отчетов, и он работает, но после публикации и размещения на серверах II вы получаете эту ошибку. Подумайте, это говорит о том, что сервер отвечает какой-то пустой ошибкой, но я отправляю ему все.

Помните, что IIS Express работает под вашими учетными данными, поэтому двойной прыжок, вероятно, подходит. Скорее всего, на вашем сервере IIS не настроен Kerberos, и даже если вы включили делегирование, ваш отчет не будет работать, потому что отчет работает как анонимный.

Краткий ответ: вы не можете использовать делегирование без настройки Kerberos, для чего требуются настройки на вашем контроллере домена для учетной записи, под которой работает пул приложений IIS.

https://blogs.msdn.microsoft.com/chiranth/2014/04/17/setting-up-kerberos-authentication-for-a-website-in-iis/

Я знаю, что это не то место, но я хотел продолжить. Размещая Core на IIS, все равно, что вы устанавливаете в настройках IIS. Специально для S&G я сделал администратора пользователя appPool, и он сработал. Пойди, подумай ... Это без включенных параметров проверки подлинности IIS, кроме анонимной. Кто-нибудь объяснит это? Нужен ли ему доступ к библиотеке WCF на Core, для которой нужен специальный доступ? Что дает? Я ЗАБОТАЮСЬ ... и беспокоюсь о безопасности.

@cgountanis, можешь ли ты открыть новый выпуск со своим вопросом?

@jtarquino Есть ли у вас какие-либо обновления графика выпуска программы просмотра отчетов на основе ядра

@ExcaliburVT это в нашем

Открытый исходный код @jtarquino - это хорошо, но в то же время Microsoft должна нести ответственность перед клиентами, клиенты платят за продукты, клиентам нужна доставка продуктов. мы клиенты.

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

то же самое происходит в нескольких продуктах, а не только в этом. зачем мне советовать своим менеджерам лицензировать следующий выпуск SQL Server и SSRS, если мы не можем получить обновления, необходимые для ведения бизнеса?

@jtarquino Я должен согласиться с @figuerres, поскольку я буквально только что закончил трехмесячную битву, чтобы получить разрешение на использование SQL поверх Oracle, и пришел, чтобы узнать, что одно из моих ключевых преимуществ не поддерживается изначально. Я ругал Oracle за то, что у них нет драйвера .Net Core, и у них, по крайней мере, была объявлена ​​дата выпуска. SSRS - это ваш собственный продукт, и вы отстаете на два поколения, даже не предложив дату решения.

Использование новой службы соединителя WCF VS2017 (Core 2) позволяет экспортировать отчеты с параметрами в PDF, Word, Excel, CSV ... довольно просто, если вам нужна помощь до того, как будет выпущен этот пакет NUGET для просмотра. Да, вы должны использовать ReportExecution2005.asmx, который поставляется с SSRS, но и все, что они создают. Мы просто решили пока отказаться от просмотра и заняться загрузкой файлов напрямую.

Изменить: только проблема решается с разрешениями AppPool, о которых я упоминал ранее.

кстати, я получаю отчеты в формате PDF из веб-API, и я не использую биты wcf.
просто вызовы мыла / asmx и вызовы http.
при их выполнении я сдаю верительные грамоты без каких-либо проблем.
мой код - asp.net 4.6 / web api 2
Если вы хотите увидеть, что я делаю, я могу выложить код на github на следующей неделе, чтобы вы могли его проверить.
Я звоню серверу отчетов 2016, но большая часть того, что я делаю, будет работать со старыми версиями SSRS.

Что-нибудь новое для Core 2 с SSRS (RDLC Designer)?

@figuerres, если вы разместили какой-либо код в запросе github, поделитесь ссылкой.

@apondu
отправлю на следующей неделе, до этого не будет. до сих пор никто не просил код.

Я работаю над интранет-приложением Angular5 / .NetCore2 MVC5 (текущий стек RC от MS), мы используем SSRS 2012, и нам нужно создать подписки на отчеты с временной привязкой для пользователей, которые не вошли в учетную запись Windows.

@figuerres Может быть, у вас есть идеи?

Вы можете использовать SSRS и встроенную службу выполнения отчетов, чтобы выдавать PDF-файлы в течение всего дня.

@cgountanis Спасибо за такой быстрый ответ, вы помогли мне понять, что я недостаточно описательный / точный при описании того, что мне нужно сделать. Я обновил свой исходный комментарий, добавив "создавать подписки на отчеты по времени"

Хм, кажется, я сделал что-то подобное, вставив строки расписания подписки прямо в базу данных отчетов (догадался, как работает служба подписки на основе таблицы и существующих строк).

@ExcaliburVT До сих пор я использовал SOAP API и большой SP для взаимодействия с БД и хотел бы избежать непосредственного изменения БД. Я рад узнать, что есть запасной вариант.

что вы имеете в виду под временным интервалом?

вам нужно запускать отчет в определенное время?
вам нужно запускать отчет, когда пользователь что-то делает?

@figuerres по времени, то есть по повторяющемуся расписанию, например, каждую среду в 8:00.

Да, я не смог найти способ сделать это, не вставляя запись вручную, по крайней мере, обратно в SQL 2012. Если я правильно помню, вам не нужно изменять схему или что-то еще, просто вставьте строку в таблицу подписок, и я смог чтобы таким образом отправить отчет в группу рассылки.

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

вы просто создаете подписку на портале.

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

Позвольте мне дать больше контекста, прежде чем говорить о том, что я видел из soapAPI.

Я пишу веб-приложение, которое использует SSRS soapAPI и такие учетные данные, как «ssrsReportWebAdmin». В настоящее время в разработке «ssrsReportWebAdmin» есть все роли безопасности, но, судя по документации, роль Content Manager является той, которая необходима. Пользователь будет использовать веб-приложение для создания подписок для других людей и отправки этих запросов через soapAPI.

Вызов CreateSubscriptionAsync возвращает ошибку о том, что у пользователя нет разрешений.

поэтому, вызывая api, вы передаете объект кредита для пользователя «ssrsReportWebAdmin», у которого есть все роли, но вы получаете сообщение об ошибке, что у него нет разрешения ?? интересно....

из того, что я читал, SSRS настроена так, что единственный человек, который может создавать стандартные (повторяющиеся, основанные на времени) подписки, - это сам пользователь. Подписки на основе данных могут быть настроены ролью Content Manager.

См. Раздел ContentManagerTasks - Управление всеми подписками
https://technet.microsoft.com/en-us/library/ms159693 (v = sql.105) .aspx

См. Первое предложение под заголовком, которое начинается со слов «Службы Reporting Services поддерживают два типа ...»
https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/subscriptions-and-delivery-reporting-services#bkmk_standard_and_datadriven

@figuerres @ExcaliburVT
Я смог создать стандартные подписки как на электронную почту, так и на общие файлы, используя учетную запись AD с ролью Content Manager SSRS. Из того, что я вижу, проблема с разрешениями, с которой я столкнулся в пятницу, была побочным эффектом пустого / искаженного параметра MatchData.

Почти 2 года. Выпущено ядро ​​2.0. Команда SSRS, просыпайтесь.

@ codehippie1, не будь таким грубым. мы все здесь люди. расти!

В пещере разработчиков это была просто шутка. Никаких обид вообще не имелось ввиду. Помимо шуток, ReportViewerForMVC имеет 72 799 загрузок, начиная с начала 2014 года (https://www.nuget.org/packages/ReportViewerForMvc). Команда SSRS игнорировала ASP.NET MVC в течение многих лет, а теперь игнорирует ASP.NET Core в течение 2 лет. Говоря о грубости, 72 799 раз - это много.

Я бы согласился на хороший экспорт в PDF-библиотеку, официально поддерживаемую, нет необходимости в программе просмотра в наши дни с такими адаптивными требованиями, как они есть.

@cgountanis : создать шаблон HTML (правильный размер бумаги - только html, изображения как base64, встроенные стили). Заполните заполнители и не забудьте установить HTML-кодировку utf8. Отправить текст в StandardInput из wkhtmltopdf - получить вывод из StandardOutput из wkhtmltopdf. Кроме того, у вас есть что-то намного лучшее, чем SSRS.

@cgountanis Я обдумывал такой подход, но создать отчет с идеальным пикселем с верхними / нижними колонтитулами и разрывами строк в логических местах непросто.

Для всех, кто разделяет мою боль из-за отсутствия средства просмотра локальных отчетов MS RDLC на ядре aspnet; Я пробовал альтернативный подход с помощью pdfJs и ViewerJs из mozilla - демонстрация pdfJs с программой просмотра отчетов MS RDLC, чтобы выводить отчет в байтах. Для меня это лучшее из обоих миров, поскольку я все еще могу использовать файлы RDLC, использовать их для создания отчетов на стороне сервера и иметь мощный встроенный в средство просмотра документов firefox для отображения результатов. PdfJs по-прежнему не является средством просмотра отчетов, но в моем случае с навигацией по страницам, предварительным просмотром печати, поиском и множеством других полезных функций это тоже не меньше.

Если вам интересно, вот суть, которая поможет вам использовать его внутри основного приложения aspnet (со стороной клиента в angular 2 или выше, rxJs и Typescript). Для меня это просто лучшее из обоих миров.

Как добавить pdf.js и viewer.html в приложение angular 2 (с дополнительным генератором отчетов aspnet core / webapi / mvc backend с помощью средства просмотра отчетов MS Local RDLC)

Я считаю, что вы можете изменить angular 2 с помощью react или любой другой клиентской библиотеки, но принципы остаются теми же.

Работает ли он напрямую с SSRS?

@cgountan - предыдущий пост - это RDLC, что означает, что сервера отчетов нет, веб-сервер отображает отчет.

Интересное обновление от Microsoft ...

https://blogs.msdn.microsoft.com/sqlrsteamblog/2018/04/02/microsoft-acquires-report-rendering-technology-from-forerunner-software/

Мы рады сообщить, что приобрели технологию у Forerunner Software https://forerunnersw.com/, чтобы ускорить наши инвестиции в службы Reporting Services. Эта технология включает, среди прочего, рендеринг отчетов служб Reporting Services (* .rdl) на стороне клиента, адаптивные виджеты пользовательского интерфейса для просмотра отчетов и JavaScript SDK для интеграции отчетов в другие приложения - свидетельство того, что наши партнеры могут достичь, опираясь на наша открытая платформа.

Это отличная новость для вас, так как мы видим возможности применить эту технологию к множеству отзывов, которые мы получили от вас:

  • Вам нужно облачное программное обеспечение как услуга (SaaS) или платформа как услуга (PaaS), которые могут запускать отчеты SSRS. Как вы, возможно, видели в примечаниях к выпуску Spring '18 https://aka.ms/businessappsreleasenotes , мы активно работаем над переносом отчетов SSRS в облачную службу Power BI, и мы строим рендеринг на стороне клиента для сделать это возможным.
  • Вы хотите просматривать отчеты SSRS на своем телефоне, возможно, с помощью приложения Power BI. Мы считаем, что эта технология поможет нам предоставить лучший и более отзывчивый пользовательский интерфейс для предоставления значений параметров отчета, навигации по отчетам и, возможно, даже для просмотра содержимого отчета.
  • Вам нравится элемент управления Report Viewer ... но это элемент управления веб-форм ASP.NET. Вам нужно что-то, что вы можете интегрировать в свое приложение ASP.NET Core / MVC или приложение, отличное от ASP.NET. С помощью этой технологии мы надеемся предоставить средство просмотра отчетов на стороне клиента / на основе JavaScript, которое вы можете интегрировать в любое современное приложение.

Это масштабные мероприятия, и у нас пока нет сроков, но следите за обновлениями в ближайшие месяцы, поскольку мы всегда стремимся делиться с вами своими успехами и выслушивать ваши отзывы как можно раньше и чаще.

С уважением

Павел


От: Денни Фигуэррес [[email protected]]
Отправлено: пятница, 23 марта 2018 г. 2:19
Кому: aspnet / Home
Копия: Пол Шелдон; Комментарий
Тема: Re: [aspnet / Home] Отчетность ядра Asp.Net (SSRS) (№ 1528)

@cgountanis https://github.com/cgountan - предыдущая публикация - это RDLC, что означает, что нет сервера отчетов, веб-сервер отображает отчет.

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/aspnet/Home/issues/1528#issuecomment-375408680 или отключите поток https://github.com/notifications/unsubscribe-auth/AEHciZa6- jjUl8kgdHtuCdH6lSwhoCyyks5tg-s6gaJpZM4IsW_Z .

О боже, только не это дерьмо с jQuery.
Раздутое ПО.
И не только раздутое ПО, но и медленное.

Если вам нужно определение раздутого ПО, это подойдет.
Для совершенства в нем в основном отсутствует только пользовательский интерфейс jQuery, но я совершенно уверен, что люди, которые делают такие вещи, все равно найдут время, чтобы добавить его для datepicker.

Ой, подождите, я только что видел

jquery-ui-1.10.3.forerunner.js

Моя плохая, неважно.
Это определенно прекрасный пример.
Мы, конечно, не просто добавляем jQuery-UI, мы также выпускаем нашу собственную модифицированную версию.

Боже, это похоже на дерьмо. Отчеты по телефону - как раз то, что нам нужно - сразу после CrApple iPads и сенсорных экранов на рабочем столе ...
И я бы по-прежнему соглашался на работу SSRS с прокси-сервером или на возможность совместного использования auth-cookie (многопользовательский хостинг на основе виртуальных имен - включение iframe в одном домене с несколькими виртуальными каталогами без перезагрузки auth-cookie другого виртуального каталога). Или если он (в SSRS 2016+) будет одинаково отображать границы таблиц в IE и Chrome и, возможно, Firefox.
Или просто для того, чтобы установить культуру вручную с помощью строки запроса, перевести заголовки параметров и просто сделать этот datepicker самостоятельно, потому что MS все равно не поймет это правильно ...

ЭТО определение раздутого ПО:

<link href = "~/Forerunner/Common/css/Forerunner-all.css" rel="stylesheet" />
<link href = "~/Forerunner/Lib/jQuery/css/jquery-ui-1.10.3.forerunner.css" rel="stylesheet" />
<link href = "~/Custom/Mobilizer.css" rel="stylesheet" />

<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery-1.11.0.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/jquery.hammer.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/json2.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/scroll-startstop.events.jquery.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/jquery.lazyload.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jsTree/jstree.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/misc/js/jquery.FRmaphilight.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/moment.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner-tools.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner-widgets.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.form.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.watermark.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.validate1.11.1.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery-ui-1.10.3.forerunner.js"></script>
<link href = "~/Forerunner/Common/css/Forerunner-all.css" rel="stylesheet" />
<link href = "~/Forerunner/Lib/jQuery/css/jquery-ui-1.10.3.forerunner.css" rel="stylesheet" />
<link href = "~/Custom/Mobilizer.css" rel="stylesheet" />

<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery-1.11.0.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/jquery.hammer.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/json2.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/scroll-startstop.events.jquery.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/jquery.lazyload.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jsTree/jstree.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/misc/js/jquery.FRmaphilight.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/moment.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner-tools.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner-widgets.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.form.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.watermark.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.validate1.11.1.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery-ui-1.10.3.forerunner.js"></script>

Как насчет:

<link href = "~/css/CustomerX/3kb_styles.sass" rel="stylesheet" />
<script charset="utf-8" type = "text/javascript" src="~/Scripts/4kb_scripts_with_async.ts.js" async="async"></script>

или даже лучше

<script async="async"  charset="utf-8" src="js/loader.js?v=1"
data-js="[ 'js/HtmlToolsAsync', 'js/mainAsync' ]"
data-js-ie-edge="['js/polyfills/es6-promise-2.0.0.min', 'js/polyfills/classList']" 
data-css="['css/{@customer}/styles']" data-css-ie-edge="['css/fixes_for_crappy_browsers_only']"></script>

Бонусные баллы, если он добавляет временную метку unix к каждому скрипту и таблице стилей, поэтому изменения / исправления действительно вступают в силу. Расширенные бонусные баллы, если он передает значение datetime как unix-timestamp вместо строки, зависящей от языка и региональных параметров, и не терпит неудачу для даты> 2030 или 9999. Или для символов UTF8. Теперь что касается поддержки языков с письмом справа налево - мы не хотим слишком сильно расширять лимит для Microsoft. Они терпят неудачу задолго до этого. Они уже превзошли бы мои ожидания, если бы это работало для более чем одного европейского языка одновременно (например, английского, немецкого, французского и итальянского).

Уважаемый Microsoft, возможно, я хотел бы также проверить, все ли поля в отчете переведены, и для этого я просто хотел бы войти в систему как другой пользователь с другим языком - без необходимости каждый раз изменять языковые настройки моего браузера (или рассказывать покупателю, как это сделать - это ваше высшее достижение на сегодняшний день - незабываемый [очень негативный] опыт, который я мог бы добавить - особенно после перехода на Windows 8).
Если вам нужно что-то, к чему ВЫ можете относиться - возможно, иногда есть англичанин, который работает на компьютере, настроенном для неанглоязычных пользователей. Поэтому было бы неплохо, если бы я, как разработчик, мог установить язык отображения из своего приложения, а не просто определять его языковыми настройками пользовательского агента. Может быть, вы могли бы принять во внимание хотя бы это НАСТОЯЩИЙ раз.

Но если я посмотрю на эту чушь, я уже могу сказать, что вы этого не сделаете.

Кстати, чтобы установить культуру в текущем воплощении SSRS, нужно сделать следующее:

вызвать отчет с & in_language = IETF-language-tag

\ machinename \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspx


<script type="text/C#" runat="server">

protected override void InitializeCulture()
{
    string language = System.Web.HttpContext.Current.Request.QueryString["in_language"];

    if (string.IsNullOrEmpty(language))
        language = "";

    switch (language.ToLowerInvariant())
    {
        case "de":
            language = "de-CH";
            break;
        case "fr":
            language = "fr-CH";
            break;
        case "it":
            language = "it-CH";
            break;
        case "en":
            language = "en-US";
            break;
        default:
            language = "";
            break;
    }

    // System.Web.HttpContext.Current.Response.Write(language);
    if (!String.IsNullOrEmpty(language))
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(language);
        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
    }

    base.InitializeCulture();
}
</script>

Затем необходимо перезаписать язык в HTTP-запросе (настраиваемый HTTP-модуль в SSRS)
(и политика P3P заключается в том, что форма-логин-публикация работает, когда она находится в iframe в другом домене).

Не могли бы вы проследить за тем, чтобы не нарушать это, не предлагая языковой параметр (DISPLAY)?
Ваш параметр rs:ParameterLanguage влияет только на параметры в URL-адресе, но не на отображение отчета. И он не должен вообще существовать, например, если вы просто передали datetime как unix-timestamp (UTC). И, конечно же, вы всегда должны использовать заголовок sameorigin или заголовок allow-from (iframe находится в другом домене, чем ReportServer). Кстати, установка языка запроса в модуле HTTP предназначена для установки датпикера с SSRS 2016 на требуемый язык - в противном случае JavaScript выйдет из строя, если у него есть датапикер en-US. Отлично, правда?

Как насчет: & rs: language = языковой тег IETF / IANA?


namespace libRequestLanguageChanger
{


    public class RequestLanguageChanger : System.Web.IHttpModule
    {


        void System.Web.IHttpModule.Dispose()
        {
            // throw new NotImplementedException();
        }


        void System.Web.IHttpModule.Init(System.Web.HttpApplication context)
        {
            // https://stackoverflow.com/questions/441421/httpmodule-event-execution-order
            context.BeginRequest += new System.EventHandler(context_BeginRequest);
            context.EndRequest += new System.EventHandler(context_EndRequest);
        }


        void context_BeginRequest(object sender, System.EventArgs e)
        {
            System.Web.HttpApplication application = sender as System.Web.HttpApplication;
            System.Web.HttpContext context = application.Context;

            if (context.Request != null)
            {
                // string language = context.Request.Headers["Accept-Language"];
                string language = null;
                // string url = context.Request.RawUrl;
                // string referrer = null;


                if (context.Request.UrlReferrer != null)
                {
                    // referrer = context.Request.UrlReferrer.OriginalString;

                    string queryString = context.Request.UrlReferrer.Query;
                    System.Collections.Specialized.NameValueCollection queryStrings = System.Web.HttpUtility.ParseQueryString(queryString);
                    language = queryStrings["in_language"];
                }

                if (context.Request.QueryString["in_language"] != null)
                    language = context.Request.QueryString["in_language"];

                if (!string.IsNullOrEmpty(language))
                {
                    language = language.ToLowerInvariant();

                    switch (language)
                    {
                        case "de":
                            language = "de-CH";
                            break;
                        case "fr":
                            language = "fr-CH";
                            break;
                        case "it":
                            language = "it-CH";
                            break;
                        case "en":
                            language = "en-US";
                            break;
                        default:
                            language = "";
                            break;
                    }

                } // End if (!string.IsNullOrEmpty(language)) 

                // SQL.Log(url, referrer, language);


                // Simulate Browser-Language = language 
                if (!string.IsNullOrEmpty(language))
                {
                    // context.Request.Headers["Accept-Language"] = language;

                    System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(language);
                    System.Threading.Thread.CurrentThread.CurrentCulture = culture;
                    System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

                    for (int i = 0; i < context.Request.UserLanguages.Length; ++i)
                    {
                        // context.Request.UserLanguages[i] = "en-US";
                        context.Request.UserLanguages[i] = language;
                    }

                } // End if (!string.IsNullOrEmpty(language)) 

            } // End if (context.Request != null) 


        } // End Sub context_BeginRequest 



        // https://stackoverflow.com/questions/31870789/check-whether-browser-is-chrome-or-edge
        public class BrowserInfo
        {

            public System.Web.HttpBrowserCapabilities Browser { get; set; }
            public string Name { get; set; }
            public string Version { get; set; }
            public string Platform { get; set; }
            public bool IsMobileDevice { get; set; }
            public string MobileBrand { get; set; }
            public string MobileModel { get; set; }


            public BrowserInfo(System.Web.HttpRequest request)
        {
            if (request.Browser != null)
            {
                if (request.UserAgent.Contains("Edge")
                    && request.Browser.Browser != "Edge")
                {
                    this.Name = "Edge";
                }
                else
                {
                    this.Name = request.Browser.Browser;
                    this.Version = request.Browser.MajorVersion.ToString();
                }
                this.Browser = request.Browser;
                this.Platform = request.Browser.Platform;
                this.IsMobileDevice = request.Browser.IsMobileDevice;
                if (IsMobileDevice)
                {
                    this.Name = request.Browser.Browser;
                }
            }
        }


    }


    void context_EndRequest(object sender, System.EventArgs e)
    {
        if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)
        {
            System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;

            try
            {
                // response.Headers["P3P"] = "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"":
                // response.Headers.Set("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
                // response.AddHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
                response.AppendHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");

                // response.AppendHeader("X-Frame-Options", "DENY");
                // response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
                // response.AppendHeader("X-Frame-Options", "AllowAll");

                if (System.Web.HttpContext.Current.Request.UrlReferrer != null)
                {
                    // "X-Frame-Options": "ALLOW-FROM " Not recognized in Chrome 
                    string host = System.Web.HttpContext.Current.Request.UrlReferrer.Scheme + System.Uri.SchemeDelimiter
                        + System.Web.HttpContext.Current.Request.UrlReferrer.Authority
                        ;

                    string selfAuth = System.Web.HttpContext.Current.Request.Url.Authority;
                    string refAuth = System.Web.HttpContext.Current.Request.UrlReferrer.Authority;

                    // SQL.Log(System.Web.HttpContext.Current.Request.RawUrl, System.Web.HttpContext.Current.Request.UrlReferrer.OriginalString, refAuth);

                    if (IsHostAllowed(refAuth))
                    {
                        BrowserInfo bi = new BrowserInfo(System.Web.HttpContext.Current.Request);

                        // bi.Name = Firefox
                        // bi.Name = InternetExplorer
                        // bi.Name = Chrome

                        // Chrome wants entire path... 
                        if (!System.StringComparer.OrdinalIgnoreCase.Equals(bi.Name, "Chrome"))
                            response.AppendHeader("X-Frame-Options", "ALLOW-FROM " + host);

                        // unsafe-eval: invalid JSON https://github.com/keen/keen-js/issues/394
                        // unsafe-inline: styles
                        // data: url(data:image/png:...)

                        // https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet
                        // https://www.ietf.org/rfc/rfc7034.txt
                        // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
                        // https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP

                        // https://stackoverflow.com/questions/10205192/x-frame-options-allow-from-multiple-domains
                        // https://content-security-policy.com/
                        // http://rehansaeed.com/content-security-policy-for-asp-net-mvc/

                        // This is for Chrome:
                        // response.AppendHeader("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: *.msecnd.net vortex.data.microsoft.com " + selfAuth + " " + refAuth);


                        System.Collections.Generic.List < string > ls = new System.Collections.Generic.List<string>();
                        ls.Add("default-src");
                        ls.Add("'self'");
                        ls.Add("'unsafe-inline'");
                        ls.Add("'unsafe-eval'");
                        ls.Add("data:");

                        // http://az416426.vo.msecnd.net/scripts/a/ai.0.js

                        // ls.Add("*.msecnd.net");
                        // ls.Add("vortex.data.microsoft.com");

                        ls.Add(selfAuth);
                        ls.Add(refAuth);

                        string contentSecurityPolicy = string.Join(" ", ls.ToArray());
                        response.AppendHeader("Content-Security-Policy", contentSecurityPolicy);
                    }
                    else
                    {
                        response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
                    }

                }
                else
                    response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
            }
            catch (System.Exception ex)
            {
                // WTF ? 
                System.Console.WriteLine(ex.Message); // Suppress warning
            }

        } // End if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)

    } // End Using context_EndRequest


        private static string[] s_allowedHosts = new string[]
    {
        "localhost:49533"
            , "localhost:52257"
            , "www.companyX.com"
            , "companyX.com"
            , "vmcompany1"
            , "vmcompany2"
            , "vmbank1"
            , "vmbank2"
    };


        public static bool IsHostAllowed(string host)
    {
        return Contains(s_allowedHosts, host);
    } // End Function IsHostAllowed 


        public static bool Contains(string[] allowed, string current)
    {
        for (int i = 0; i < allowed.Length; ++i)
        {
            if (System.StringComparer.OrdinalIgnoreCase.Equals(allowed[i], current))
                return true;
        } // Next i 

        return false;
    } // End Function Contains 


} // End Class RequestLanguageChanger 


} // End Namespcae libRequestLanguageChanger 

Microsoft ПОЖАЛУЙСТА, не используйте этот передовой код как есть!
современные клиентские веб-приложения уходят от j-запроса к модулям es и т. д.
нам не нужно или мы хотим использовать кучу кода j-запроса.
Я бы предпочел дать клиенту pdf или текущий элемент управления asp.net, а не эту кучу j-запросов.

создать пакет npm, который хорошо работает с Angular 2-6, узлом и другими фреймворками веб-клиентов.
также продолжайте работать с рендерингом SSRS, это дает много преимуществ. просто получите набор обновленных API веб-служб

Есть новости по этому поводу?

Что ж, у нас в принципе уже было бы все необходимое.
Нам понадобится реализация REST / JSON-версии
http: //localhost/ReportServer/ReportExecution2005.asmx
(Не повредит, если мы / кто-нибудь сможет настроить URL-адрес)
как пакет nuget, который также работает на Linux / Mac.
Единственное, что необходимо сделать, - это перенести код .NET на .NET Core / NetStandard и удалить все пинвоки на DLL Windows. Затем добавьте возможность вывода PAGED html через веб-службу (которая в настоящее время отсутствует - конечно, потому что она находится в asp.net-render-control) и позволяет установить имя файла загрузки.

Подбор параметров мы даже могли сделать сами - прочитав RDL с помощью XmlDocument.
(возможны некоторые проблемы с опцией явное отключение, строгое отключение опции, вывод опции с помощью VB-Code)
Вроде как текущий элемент управления ASP.NET, только без всего, что связано с ASP.NET-WebForms.

Так что я не думаю, что есть даже требование к единственной строке JavaScript - это все равно будет отличаться от проекта к проекту, от компании к компании, от человека к человеку.
Некоторым нравится jQuery. Некоторым нравится Angular. Некоторым нравится Vue. Некоторым нравится React. Некоторым нравится NodeJS с NPM, некоторым нравится bower, некоторым нравится TypeScript, некоторым нравится Babel, некоторым потокам, некоторые даже используют jQuery-UI для datepicker.

Я, например, в значительной степени ненавижу все эти фреймворки (особенно jquery-ui) с продолжительностью жизни плодовой мухи, несовместимостью между версиями, раздуванием, немодульностью и кривой обучения чему угодно, сообщество людей, которые не знают, что они (примечание: настоящим я не хочу иметь в виду, что я всегда знаю, что делаю), и сломанный менеджер пакетов, например npm / bower, который имеет неприятные характеристики: всегда находит способ создавать новые радости каждый раз, когда вы хотел бы их использовать.

Поэтому я просто использую VanillaJS (с ECMA-модулями и async - транспилированный с помощью babel или машинописного текста - и кого волнует транспилятор.

Конечно, многие люди не согласятся - и вы имеете право не соглашаться, поскольку есть причины не соглашаться. В конце концов, мне все равно, что вы используете - используйте coffeescript и emacs с jquery-ui и vue, если вам это абсолютно необходимо - только не заставляйте меня идти по этому пути. Мне не нужны / нужны jquery / angular / vue / react / bower / npm или что-либо из этого раздувания и ненадежности.

Теперь, при этом, если вы хотите предоставить библиотеку JavaScript, которую каждый может разместить на своем сайте для автоматического выбора параметров, как в ReportServer (в отличие от RDLC), и в отличие от текущего элемента управления reportviewer, я полностью за . Просто если вы это сделаете, сделайте это независимым от отчета «контроль». И используйте структуру, подобную узлу, для составления модулей ECMA, чтобы люди, которые хотят использовать node, могли использовать его с node / npm, а те, кому это не нужно.

В качестве побочного элемента, если бы версия REST / JSON позволяла извлекать данные фильтра из службы как json, как и визуализированные файлы, нам даже не нужно было бы читать файл RDL, и у нас был бы очень сложный JS для UN библиотека. VB-код, который в настоящее время разрешен в параметрах, в любом случае не позволяет делать это на стороне клиента.

Или, если подумать, было бы еще лучше, если бы служба позволяла получать каждый набор данных в отчете как JSON. Думаю, нам также нужно иметь возможность читать значения по умолчанию для каждого параметра. Тогда мы могли бы даже провести модульное тестирование правильности данных SQL, используемых в отчете!
(отчеты о модульном тестировании в настоящее время практически невозможны)

Одна дополнительная таблица стилей для форматирования завершит трюк (пожалуйста, SASS). И система плагинов для дополнительных / альтернативных рендереров завершит это. ¨

Но, по сути, нам действительно нужна только многоплатформенная библиотека для рендеринга отчетов.
Все остальное сообщество может сделать уже сегодня.
Я предполагаю, что если бы источники для существующих элементов управления были доступны, вся или большая часть требуемой работы могла бы даже полностью выполняться сообществом - даже не стоило бы Microsoft ни копейки.

Is alanjuden MvcReportViewer работает с SSRS 2017 и ядром 2. Могу ли я использовать этот подход для SSRS 2017 и ядра 2

Нет, не обошлось и без сильной головной боли. Самое простое решение - экспортировать PDF-файлы напрямую с помощью reportexecution2005, imho. Пытаться получить любую из старых программ просмотра в адаптивном формате, особенно для телефонов и планшетов, - это боль.

@Mahenbisht , мне нужно собрать его из исходников с пакетами, обновленными до последних версий, чтобы он работал в ядре 2. Еще не пробовал 2017.

Я использую SQL Server 2017 с SSRS 2017 и ядром 2.
Если я не могу использовать alanjuden.MvcReportViewer.NetCore, то есть ли другой подход

@Mahenbisht , я знаю, что некоторое время не был очень активен в своей работе ... однако вы все равно можете использовать аналогичный подход. Вы всегда можете подключиться к API-интерфейсу Reporting Service, который я использую (встроенный в SSRS), чтобы запускать свои собственные отчеты и помещать их в любой желаемый формат.

@Mahenbisht : Здесь есть пакет
https://www.nuget.org/packages/AspNetCore.ReportViewer/
К сожалению, никаких исходников нет, поэтому вы не можете увидеть, что он делает и как его использовать.
Так что я декомпилирован его здесь (он компилирует).

Кажется, это классы, созданные из ReportExecution2005 и ReportService2010-WSDL для .NET Core.
Так что ничто не мешает вам написать собственную программу просмотра, если у вас есть сетевой доступ к работающему экземпляру SQL-сервера с SSRS.
Если я правильно помню, вам нужно передать deviceinfo для рендеринга, чтобы получить постраничный вывод html.
Это оставляет вам возможность настраивать параметры вручную - это то, над чем я (теоретически) в настоящее время работаю.

@alanjuden : Проблема с вашим подходом заключается в том, что для него требуется экземпляр SQL-Server с установленными ReportingServices. Если у вас есть это, вы можете также поместить iframe в / ReportServer и добавить небольшую библиотеку custom-authentication + W3C-header и языковой локализатор в ReportService. Тогда вам вообще не нужна ваша работа.

Проблема в том, что
A) У N клиентов не всегда установлена ​​одна и та же версия SSRS (со всеми накопительными обновлениями / пакетами услуг - в моем случае в настоящее время варьируется от SSRS-2008R1 до 2016),
и Б) что установки SSRS-Express имеют доступ только к базам данных на локальном компьютере. И что действительно отстой, так это то, что нет элемента управления ReportViewer, который работает на ПК без Windows (Linux, Mac), поэтому вам нужно объединить .NET с Java для Birt или Jasper, что нарушает развертывание xcopy, не говоря уже об огромном накладные расходы как в 2-3 форматах отчетов, так и во всей java JVM и birt / jasper bloatware, включая tomcat и / или другую подобную чушь.
и C) что ReportingService использует встроенную проверку подлинности Windows. Таким образом, даже если вы используете Windows, вам необходимо добавить настраиваемую аутентификацию за пределами интрасети, что означает, что вам нужен доступ для изменения к ReportingServices, и ваши модификации могут нарушить работу другого программного обеспечения, поэтому любой здравомыслящий клиент должен установить новый экземпляр SSRS / SQL-Server (который стоит денег).
также D) что параметры ReportingService невозможно локализовать без изменения ReportViewer.aspx, см. C)
а также E), что любая версия SSRS <2016 Renders quirks-html (и хотя 2016+ лучше, но в этом отношении он далек от совершенства, кстати)
Однако, поскольку старые версии 2008 года все еще существуют в 2018 году, может потребоваться еще 5-10 лет, чтобы все, что было ниже 2016 года, исчезло. К тому времени SSRS 2016 уже безнадежно устареет. Если к тому времени Microsoft все еще существует, то это так.

Докер приходит на помощь - к счастью. Но это все равно лажа.

и добавьте небольшую библиотеку custom-authentication + W3C-header и языковой локализатор в Reportingservices.

@ststeiger какой-либо онлайн-образец для помещения средства просмотра SSRS в iframe с передачей пользовательской аутентификации с основного сайта и заголовков W3C?

@adopilot : Вот примерное руководство:

Добавить пользовательскую аутентификацию в SSRS

https://github.com/Microsoft/Reporting-Services/tree/master/CustomSecuritySample

(вам нужно немного изменить его, чтобы он использовал ОДНОГО пользователя для каждой базы данных.
Вы же не хотите запускать синхронизацию пользователей SSRS и разрешений с вашими пользователями форм!
Дайте этому пользователю права на папку только для этой базы данных.
)

Добавьте http-модуль в SSRS , который устанавливает заголовок p3p, и перезапишите context.Request.UserLanguages ​​[i] на выбранный вами язык (в противном случае средство выбора даты не будет работать)

Измените страницу входа в ReportServer, чтобы она реагировала на получение и отправку параметров, и установите login_cookie, а затем перенаправьте на отчет, который был опубликован.

Код в Page_Load в классе FormsAuthentication_RS2012.LogOn в сборке FormsAuthentication_RS2012

Опубликуйте данные, зашифрованные PGP / RSA с временной меткой unix (чтобы они не могли быть воспроизведены), зашифрованные с помощью открытого ключа в ваших формах, расшифруйте пост-данные в FormsAuthentication_RS2012 на странице page_load.

(не могу предоставить вам код FormsAuthentication_RS2012, потому что он содержит закрытый ключ и пароль администратора, жестко закодированный)


<%@ Page Language="C#" AutoEventWireup="true" Inherits="FormsAuthentication_RS2012.LogOn, FormsAuthentication_RS2012" %>

<!DOCTYPE html PUBliC "-//W3C//DTD Xhtml 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" /> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>SSRS Login</title>

    <style type="text/css" media="all">

        html, body
        {
            width: 100%;
            height: 100%;
            margin: 0px;
            padding: 0px;
            overflow: auto;
        }


        .divLayout 
        {
            float: left;
            height: 100%;
            background-color: #d4d4d4;
        }


        .spnTitle 
        {
            color: #0060a6;
            font-size: 45px;
            margin: 0;
            font-weight: normal;
            padding-top: 10%;
        }


        .spnLogin 
        {
            font-family: '?Segoe', 'Segoe UI', Segoe, Arial, sans-serif;
            font-size: 26px;
            vertical-align: middle;
            padding-left: 10px;
        }


        .btnLogin 
        {
            border: none;
            width: 204px;
            height: 64px;
            background-color: #d4d4d4;
            vertical-align: middle;
            text-align: center;
            color: #525252;
        }


        .btnLogin:hover
        {
            color: #FFFFFF;   
        }


        .btnLogin:hover .spnLoginSymbol 
        {
            /* http://stackoverflow.com/questions/7217244/style-child-element-when-hover-on-parent */
            background-image: url('<%=FormsAuthentication_RS2012.LogonHelper.GetPageName() %>?image=whiteForward_37x36.png');
        }


        .spnLoginSymbol
        {
            display: inline-block;
            width: 37px;
            height: 36px;
            background-image: url('<%=FormsAuthentication_RS2012.LogonHelper.GetPageName() %>?image=82Forward_37x36.png');
            background-repeat: no-repeat;
            background-size: 100% auto;
            vertical-align: middle;

            color: #525252;
        }


        .spnLoginSymbol:hover
        {
            background-image: url('whiteForward_37x36.png');
        }


        .lblCaption 
        {
            font-family: '☺Segoe', "Segoe UI", Segoe, Arial, sans-serif;
            font-size: .9em;
            display: block;
        }


        input[type=text]
        {
            border: 2px solid rgb(187, 187, 187);
            <asp:Literal Id="litUserNameStyle" runat="server" />
        }


        input[type=password] 
        {
            border: 2px solid rgb(187, 187, 187);
            <asp:Literal Id="litPWStyle" runat="server" />
        }


        input[type=text]:hover, input[type=password]:hover 
        {
            border: 2px solid rgb(237, 206, 0);
        }


        .CorLink
        {
            color: #BF0A1E; 
        }


        .CorLink:hover
        {
            color: rgb(103, 12, 12);
        }

    </style>

</head>
<body>

    <div style="position: absolute; top: 0px; width: 100%; height: 1.5cm; line-height: 1.5cm; vertical-align: middle; text-transform: uppercase; font-weight: bold; background-color: #000000; color: #FFFFFF; text-align: center; font-size: 13px; font-family: '☺Segoe', 'Segoe UI', Segoe, Arial, sans-serif; ">
        <asp:Literal Id="litAuthentication" Text="Forms-Authentication" runat="server" />
    </div>


    <div class="divLayout" style="background-color: #0060A6; width: 30%; text-align: center;">
        <img src="<%=FormsAuthentication_RS2012.LogonHelper.GetPageName() %>?image=mydb3.png" style="margin-top: 40%; margin-left: -50px;" alt="logo" />

        <!-- 

        <img src="accountsicon.png" style="margin-top: 30%;" alt="logo" />
        <img src="mydb3.png" style="margin-top: 30%;" alt="logo" />
        <img src="reportsicon.png" style="margin-top: 30%; width: 20%;" alt="logo" />

        <img src="hap-logo-128.png" style="margin-top: 30%;" alt="logo" />
        -->
    </div>

    <div class="divLayout" style="background-color: #F3F3F3; width: 70%;">





        <div class="greenBorder" style="display: table; width: 100%; height: 100%; #position: relative; overflow: hidden;">

            <div style=" #position: absolute; #top: 50%;display: table-cell; vertical-align: middle;">
                <div style=" #position: relative; #top: -50%">


                    <div style="display: table; margin-right: auto; margin-left: auto;padding-left: 1cm; padding-right: 1cm;">
                        <!--
                        <b>TEST environment</b>
                        -->

                        <span class="spnTitle">
                            SQL Server Reporting Services 2012
                        </span>

                        <div style="display: block; height: 30px;"></div>

                          <form id="form1" target="_self" method="post" runat="server">

                            <div>
                                <label for="txtUserName" class="lblCaption"><asp:Literal Id="litlblUserName" runat="server" />:</label>
                                <input id="txtUserName" name="txtUserName" type="text" style="width: 300px;" />
                            </div>


                            <div>
                                <label for="txtPassword" class="lblCaption"><asp:Literal Id="litlblPassword" runat="server" />: </label>
                                <input id="txtPassword" name="txtPassword" type="password" style="width:300px;" />
                            </div>

                            <div style="display: block; height: 30px; clear: both;"></div>


                            <button type="submit" class="btnLogin" style="">
                                <!--
                                <img src="82Forward_37x36.png" alt="arrow" style="vertical-align: middle; margin-top: 0px;" />
                                -->
                                <span class="spnLoginSymbol"></span>
                                <span class="spnLogin">Login</span>
                            </button>

                        </form>

                    </div>

                </div>
            </div>
        </div>



    </div>
    <!-- End divLayout -->


    <div style="position: absolute; bottom: 0px; width: 100%; height: 1.5cm; line-height: 1.5cm; vertical-align: middle; background-color: #000000; color: #FFFFFF; text-align: center; font-family: '☺Segoe', "Segoe UI", Segoe, Arial, sans-serif; font-size: 13px;">
        Copyright &copy; 2013 

        <a href="http://www.cor-management.ch" target="_blank" class="CorLink" onclick="$('html, body').animate({ scrollTop: 0 }); return false;">
            COR Managementsysteme GmbH
        </a>

    </div>

</body>
</html>

</body>
</html>

Добавить в ReportViewer.aspx


<script type="text/C#" runat="server">

    protected override void InitializeCulture()
    {
        string sprache = System.Web.HttpContext.Current.Request.QueryString["in_sprache"];

        if(string.IsNullOrEmpty(sprache))
            sprache = "";

        switch(sprache.ToLowerInvariant())
        {
            case "de":
                sprache = "de-CH";
                break;
            case "fr":
                sprache = "fr-CH";
                break;
            case "it":
                sprache = "it-CH";
                break;
            case "en":
                sprache = "en-US";
                break;
            default:
                sprache = "";
                break;
        }

        // System.Web.HttpContext.Current.Response.Write(sprache);
        if(!String.IsNullOrEmpty(sprache))
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(sprache);
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(sprache);
        }

        base.InitializeCulture();
    }

</script>

Добавьте функцию преобразования параметров в reportviewer.aspx:
(
Параметр записан как немецкий / французский / итальянский / английский
)
разделить на / и по умолчанию на немецкий (возможно, вы захотите использовать английский)
добавьте параметр in_language (in_sprache) к URL-адресу отчета, и все готово, если вы поняли идею.


function initLanguage()
{
    var language = null;
    var StyleSheetSet = null;
    var BrowserLanguage = <%= System.Web.HttpContext.Current.Request.UserLanguages != null ? "\"" + System.Convert.ToString(System.Web.HttpContext.Current.Request.UserLanguages[0]) + "\"" : "null" %>;

    if(BrowserLanguage == null)
        BrowserLanguage = window.navigator.userLanguage || window.navigator.language;

    if(BrowserLanguage != null)
        BrowserLanguage = BrowserLanguage.substr(0,2).toLowerCase();



    var dictParameters = getUrlVars(this.location.href);

    if (dictParameters != null && dictParameters.contains("rc:Stylesheet"))
        StyleSheetSet = true;

    if (dictParameters != null && dictParameters.contains("in_sprache"))
        language = dictParameters["in_sprache"];

    if(language == null)
        language = BrowserLanguage;

    if(language == null)
        language = "de";

    language = language.toLowerCase();

    return language;
} // End function initLanguage


function TranslateParameterPrompts(iLanguageIndex)
{
    var eles = document.getElementsByTagName("table");
    var strParamTableId = "ParametersGridReportViewerControl";
    var tblParameters = null;
    var ParamLabels = null;


    for(var j = 0; j < eles.length; ++j)
    {
        // console.log(eles[j]);

        if(eles[j] != null && eles[j].id != null)
        {
            if(eles[j].id.slice(0, strParamTableId.length) == strParamTableId) // if startswith str
            {
                // console.log(eles[j].id);
                tblParameters = eles[j];
                break;
            }
            // else console.log(eles[j].id);
        } // End if(eles[j] != null && eles[j].id != null)

    } // Next j


    if(tblParameters != null)
        ParamLabels = tblParameters.getElementsByTagName("span");

    // var ParamLabels = document.querySelectorAll("table[id^='ParametersGridReportViewerControl'] span");
    if(ParamLabels != null)
    {
        for(var i = 0; i < ParamLabels.length; ++i)
        {
            var strText = ParamLabels[i].innerHTML;

            if (strText != null && strText.indexOf('/') != -1 && strText.indexOf('<input') == -1 ) 
            {
                strText = strText.split('/');
                if (iLanguageIndex < strText.length)
                    strText = strText[iLanguageIndex];
                else 
                { 
                    if(strText.length > 0)
                        strText = strText[0];
                }

                ParamLabels[i].innerHTML = strText;
            } // End if (strText != null && strText.indexOf('/') != -1) 

        } // Next i

    } // End if(ParamLabels != null)

}


function fixReportingServices(container)
{
    var language = initLanguage();

    switch (language)
    {
        case "fr":
            iLanguageIndex = 1;
            break;
        case "it":
            iLanguageIndex = 2;
            break;
        case "en":
            iLanguageIndex = 3;
            break;
        default: // "DE" 
            iLanguageIndex = 0;
    } // End Switch

    TranslateParameterPrompts(iLanguageIndex);
}


// needed when AsyncEnabled=true. 
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function () { fixReportingServices('rpt-container'); });

  </script>

Теперь, чтобы использовать это на какой-нибудь веб-странице, создайте iframe с именем ifrmSSRS_Login (или настройте по своему вкусу) и сделайте сообщение формы при щелчке по ссылке:

var data = 
{
    "issued" : datetime 
   ,"databaseName" : "foo" // name of SSRS-user 
   ,parameters : [{ "name":"forms_userid", value: 123},{ "name": "parameter1", "value": "uid1,uid2,uid3" }]
}


var valueToPost = rsa(data, public_key)

post this value with JavaScript to the cross-domain SSRS-url 



    _postSSRS: function(o){
        this._Trace('_postSSRS');

        try{
            if(!!o.SSRS_Link){
                var tF = document.body.appendChild(document.createElement('form'));
                tF.setAttribute('id', 'frm_' + Date.now());
                tF.setAttribute('method', 'post');
                tF.setAttribute('action', o.SSRS_Link + 'logon.aspx');
                tF.setAttribute('style', 'display: none;');
                tF.setAttribute('target', 'ifrmSSRS_Login');

                var HttpPostVariables = {
                     'data': o.SSRS_Data 
                    ,'SSO': 'FMS'
                };

                for(var k in HttpPostVariables){
                    var tH = tF.appendChild(document.createElement('input'));
                    tH.setAttribute('name', k);
                    tH.setAttribute('value', HttpPostVariables[k])
                };

                tF.submit()
            }
        }
        catch(err){this._Log(err, '_postSSRS')}
    },

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

Обратите внимание, что uid необходимо передавать в нижнем регистре, потому что в противном случае SSRS откажется работать правильно / взорвется, как дрянная часть программного обеспечения.

Заметка:
Этот код накапливался в течение более длительного периода времени для нескольких версий SSRS, и, возможно, переопределение page-initialize-culture больше не требуется, если http-модуль переопределяет язык пользовательского агента (что я понял только после того, как понял, что переопределяющая страница -initialize-culture недостаточно для datepicker SSRS).
Кроме того, использование косой черты в качестве разделителя для перевода было неудачным. попробуйте использовать символ, который вам никогда не понадобится, например £ или ¦.

Заголовок P3P необходим, поэтому IE 11 на компьютерах, отличных от Windows-10, не отказывается от auth-cookie (поскольку ssrs работает в междоменном iframe, он обрабатывается IE как сторонний cookie).

Кроме того, используйте SSRS 2016+, потому что в противном случае вам понадобятся функции режима причуд, такие как ширина границы, высота, поля, скрытие функции печати и все другие «интересные вещи, специфичные для IE8» и т. Д.

Как следует из названия сборки, это было сделано для нашего производственного сервера (SSRS 2012), и все это развилось из уродливых взломов SSRS 2005.

Сохраняйте ссылки в поле таблицы навигации, например, как поле NA_Link в T_Navigation.
'{@report} Budget_SNB & in_user = {@ user} & in_sprache = {@ language} & rc: Stylesheet = COR_RS2012_v7'
используйте заполнители для baseLink, пользователя и языка и установите таблицу стилей (если у вас черный фон, вам нужно указать ssrs использовать вашу модификацию их таблицы стилей)

SELECT 
    REPLACE(
    REPLACE( 
    REPLACE(NA_Link, '{@report}', @reportServerBaseUrl) 
    , '{@user}', @user_id)
    , '{@language}', @user_language)
FROM T_Navigation 

И обратите внимание, что у .NET-Framework есть проблемы, если ему нужно перенаправить ссылку с двоеточием внутри.
Вы можете скопировать рабочий код для url-перенаправления из монопроекта.

Также обратите внимание, что вы не можете просто передать идентификатор пользователя как строку / число - он должен быть зашифрован (частный / общедоступный), чтобы никто не мог просто угадать идентификатор пользователя. Но для начала, md5-hash идентификатора пользователя может помочь.

@ststeiger @all
AspNetCore.ReportViewer заменен на AspNetCore.Reporting
это включает LocalReport и ServerReport

@ amh1979 : Отличная работа - я посмотрю.
Я беру это из зависимости AspNetCore.ReportingServices.dll, требующей WindowsBase, и pinvoke advapi32.dll / kernel32.dll / ReportingServicesService.exe, что это работает только в Windows с .NET с установленным Framwork 4?

PS: правильный английский: «AspNetCore.ReportViewer был> заменен на <AspNetCore.Reporting», а не «insteaded», но я понимаю, что вы имеете в виду;)
Или вы также можете сказать «был заменен», что может быть словом / фразой, которые вы ищете;)

@ amh1979 :
Я понимаю, MainStream - это результат / html, а SecondaryStream - это CSS.
Но получил его и запустил.
То, что HTML-код разбит на страницы, тоже хорошо.
Знаете ли вы: есть ли способ перебрать все результаты или получить один огромный HTML-файл без вызова функции рендеринга для каждой страницы?

@ALL : Хотя это работает под полным .net, я не могу заставить его работать под .NET Core под Windows.
Проблемы с System.Drawing.Color ToKnownColor, IsSystemColor и отсутствием KnownColor.
Исправлено это, но теперь он жалуется на то, что не может загрузить сборку System.Drawing.Graphics с подписью ...

Есть ли вообще способ запускать полные ПОЛНЫЕ сборки .NET в проекте .NET Core в Windows?

@ststeiger Я

@ amh1979 :

Если вы выполняете поиск и заменяете System.Array.Empty<T> на ArrayExtension.Empty<T> , то вы на 90% готовы заставить его работать с .NET 4.0.

    internal static class ArrayExtension
    {

        public static T[] Empty<T>()
        {
            return new T[0];
        }

    }

@ amh1979 :

Он использует следующие

System.Drawing.Color c; 
c.IsKnownColor
c.IsSystemColor 
c.ToKnownColor()
System.Drawing.KnownColor enum

который .NET Core System.Drawing.Common не реализует.
Вот замена System.Drawing.KnownColor.cs
(это не идеально из-за двусмысленности, но из-за отсутствия доступа к внутренним значениям System.Drawing.Color. это лучшее, что я мог сделать - возможно, используйте #ifs, чтобы полная структура .net вызывала фактические свойства, если она заполнена. NET Framework ... )


namespace AspNetCore.Reporting.Helpers
{

    // System.Drawing.KnownColor.cs replacement 
    internal class ReportColor
    {


        private static System.Collections.Generic.Dictionary<System.Drawing.Color
                    , AspNetCore.Reporting.Helpers.AllKnownColors> SetupKnownColorDictionary()
        {
            System.Collections.Generic.Dictionary<System.Drawing.Color
                , AspNetCore.Reporting.Helpers.AllKnownColors>
                dict = new System.Collections.Generic.Dictionary
                <System.Drawing.Color, AspNetCore.Reporting.Helpers.AllKnownColors>();

            dict.Add(System.Drawing.Color.FromArgb(255, 180, 180, 180), AllKnownColors.ActiveBorder);
            dict.Add(System.Drawing.Color.FromArgb(255, 153, 180, 209), AllKnownColors.ActiveCaption);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 0), AllKnownColors.ActiveCaptionText);
            dict.Add(System.Drawing.Color.FromArgb(255, 171, 171, 171), AllKnownColors.AppWorkspace);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 240, 240), AllKnownColors.Control);
            dict.Add(System.Drawing.Color.FromArgb(255, 160, 160, 160), AllKnownColors.ControlDark);
            dict.Add(System.Drawing.Color.FromArgb(255, 105, 105, 105), AllKnownColors.ControlDarkDark);
            dict.Add(System.Drawing.Color.FromArgb(255, 227, 227, 227), AllKnownColors.ControlLight);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 255), AllKnownColors.ControlLightLight);
            dict.Add(System.Drawing.Color.FromArgb(255, 109, 109, 109), AllKnownColors.GrayText);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 120, 215), AllKnownColors.Highlight);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 102, 204), AllKnownColors.HotTrack);
            dict.Add(System.Drawing.Color.FromArgb(255, 244, 247, 252), AllKnownColors.InactiveBorder);
            dict.Add(System.Drawing.Color.FromArgb(255, 191, 205, 219), AllKnownColors.InactiveCaption);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 225), AllKnownColors.Info);
            dict.Add(System.Drawing.Color.FromArgb(255, 200, 200, 200), AllKnownColors.ScrollBar);
            dict.Add(System.Drawing.Color.FromArgb(255, 100, 100, 100), AllKnownColors.WindowFrame);
            dict.Add(System.Drawing.Color.FromArgb(0, 255, 255, 255), AllKnownColors.Transparent);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 248, 255), AllKnownColors.AliceBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 250, 235, 215), AllKnownColors.AntiqueWhite);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 255, 255), AllKnownColors.Aqua);
            dict.Add(System.Drawing.Color.FromArgb(255, 127, 255, 212), AllKnownColors.Aquamarine);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 255, 255), AllKnownColors.Azure);
            dict.Add(System.Drawing.Color.FromArgb(255, 245, 245, 220), AllKnownColors.Beige);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 228, 196), AllKnownColors.Bisque);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 235, 205), AllKnownColors.BlanchedAlmond);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 255), AllKnownColors.Blue);
            dict.Add(System.Drawing.Color.FromArgb(255, 138, 43, 226), AllKnownColors.BlueViolet);
            dict.Add(System.Drawing.Color.FromArgb(255, 165, 42, 42), AllKnownColors.Brown);
            dict.Add(System.Drawing.Color.FromArgb(255, 222, 184, 135), AllKnownColors.BurlyWood);
            dict.Add(System.Drawing.Color.FromArgb(255, 95, 158, 160), AllKnownColors.CadetBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 127, 255, 0), AllKnownColors.Chartreuse);
            dict.Add(System.Drawing.Color.FromArgb(255, 210, 105, 30), AllKnownColors.Chocolate);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 127, 80), AllKnownColors.Coral);
            dict.Add(System.Drawing.Color.FromArgb(255, 100, 149, 237), AllKnownColors.CornflowerBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 248, 220), AllKnownColors.Cornsilk);
            dict.Add(System.Drawing.Color.FromArgb(255, 220, 20, 60), AllKnownColors.Crimson);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 139), AllKnownColors.DarkBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 139, 139), AllKnownColors.DarkCyan);
            dict.Add(System.Drawing.Color.FromArgb(255, 184, 134, 11), AllKnownColors.DarkGoldenrod);
            dict.Add(System.Drawing.Color.FromArgb(255, 169, 169, 169), AllKnownColors.DarkGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 100, 0), AllKnownColors.DarkGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 189, 183, 107), AllKnownColors.DarkKhaki);
            dict.Add(System.Drawing.Color.FromArgb(255, 139, 0, 139), AllKnownColors.DarkMagenta);
            dict.Add(System.Drawing.Color.FromArgb(255, 85, 107, 47), AllKnownColors.DarkOliveGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 140, 0), AllKnownColors.DarkOrange);
            dict.Add(System.Drawing.Color.FromArgb(255, 153, 50, 204), AllKnownColors.DarkOrchid);
            dict.Add(System.Drawing.Color.FromArgb(255, 139, 0, 0), AllKnownColors.DarkRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 233, 150, 122), AllKnownColors.DarkSalmon);
            dict.Add(System.Drawing.Color.FromArgb(255, 143, 188, 139), AllKnownColors.DarkSeaGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 72, 61, 139), AllKnownColors.DarkSlateBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 47, 79, 79), AllKnownColors.DarkSlateGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 206, 209), AllKnownColors.DarkTurquoise);
            dict.Add(System.Drawing.Color.FromArgb(255, 148, 0, 211), AllKnownColors.DarkViolet);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 20, 147), AllKnownColors.DeepPink);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 191, 255), AllKnownColors.DeepSkyBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 30, 144, 255), AllKnownColors.DodgerBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 178, 34, 34), AllKnownColors.Firebrick);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 250, 240), AllKnownColors.FloralWhite);
            dict.Add(System.Drawing.Color.FromArgb(255, 34, 139, 34), AllKnownColors.ForestGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 0, 255), AllKnownColors.Fuchsia);
            dict.Add(System.Drawing.Color.FromArgb(255, 220, 220, 220), AllKnownColors.Gainsboro);
            dict.Add(System.Drawing.Color.FromArgb(255, 248, 248, 255), AllKnownColors.GhostWhite);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 215, 0), AllKnownColors.Gold);
            dict.Add(System.Drawing.Color.FromArgb(255, 218, 165, 32), AllKnownColors.Goldenrod);
            dict.Add(System.Drawing.Color.FromArgb(255, 128, 128, 128), AllKnownColors.Gray);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 128, 0), AllKnownColors.Green);
            dict.Add(System.Drawing.Color.FromArgb(255, 173, 255, 47), AllKnownColors.GreenYellow);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 255, 240), AllKnownColors.Honeydew);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 105, 180), AllKnownColors.HotPink);
            dict.Add(System.Drawing.Color.FromArgb(255, 205, 92, 92), AllKnownColors.IndianRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 75, 0, 130), AllKnownColors.Indigo);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 240), AllKnownColors.Ivory);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 230, 140), AllKnownColors.Khaki);
            dict.Add(System.Drawing.Color.FromArgb(255, 230, 230, 250), AllKnownColors.Lavender);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 240, 245), AllKnownColors.LavenderBlush);
            dict.Add(System.Drawing.Color.FromArgb(255, 124, 252, 0), AllKnownColors.LawnGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 250, 205), AllKnownColors.LemonChiffon);
            dict.Add(System.Drawing.Color.FromArgb(255, 173, 216, 230), AllKnownColors.LightBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 128, 128), AllKnownColors.LightCoral);
            dict.Add(System.Drawing.Color.FromArgb(255, 224, 255, 255), AllKnownColors.LightCyan);
            dict.Add(System.Drawing.Color.FromArgb(255, 250, 250, 210), AllKnownColors.LightGoldenrodYellow);
            dict.Add(System.Drawing.Color.FromArgb(255, 211, 211, 211), AllKnownColors.LightGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 144, 238, 144), AllKnownColors.LightGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 182, 193), AllKnownColors.LightPink);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 160, 122), AllKnownColors.LightSalmon);
            dict.Add(System.Drawing.Color.FromArgb(255, 32, 178, 170), AllKnownColors.LightSeaGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 135, 206, 250), AllKnownColors.LightSkyBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 119, 136, 153), AllKnownColors.LightSlateGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 176, 196, 222), AllKnownColors.LightSteelBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 224), AllKnownColors.LightYellow);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 255, 0), AllKnownColors.Lime);
            dict.Add(System.Drawing.Color.FromArgb(255, 50, 205, 50), AllKnownColors.LimeGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 250, 240, 230), AllKnownColors.Linen);
            dict.Add(System.Drawing.Color.FromArgb(255, 128, 0, 0), AllKnownColors.Maroon);
            dict.Add(System.Drawing.Color.FromArgb(255, 102, 205, 170), AllKnownColors.MediumAquamarine);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 205), AllKnownColors.MediumBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 186, 85, 211), AllKnownColors.MediumOrchid);
            dict.Add(System.Drawing.Color.FromArgb(255, 147, 112, 219), AllKnownColors.MediumPurple);
            dict.Add(System.Drawing.Color.FromArgb(255, 60, 179, 113), AllKnownColors.MediumSeaGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 123, 104, 238), AllKnownColors.MediumSlateBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 250, 154), AllKnownColors.MediumSpringGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 72, 209, 204), AllKnownColors.MediumTurquoise);
            dict.Add(System.Drawing.Color.FromArgb(255, 199, 21, 133), AllKnownColors.MediumVioletRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 25, 25, 112), AllKnownColors.MidnightBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 245, 255, 250), AllKnownColors.MintCream);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 228, 225), AllKnownColors.MistyRose);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 228, 181), AllKnownColors.Moccasin);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 222, 173), AllKnownColors.NavajoWhite);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 128), AllKnownColors.Navy);
            dict.Add(System.Drawing.Color.FromArgb(255, 253, 245, 230), AllKnownColors.OldLace);
            dict.Add(System.Drawing.Color.FromArgb(255, 128, 128, 0), AllKnownColors.Olive);
            dict.Add(System.Drawing.Color.FromArgb(255, 107, 142, 35), AllKnownColors.OliveDrab);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 165, 0), AllKnownColors.Orange);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 69, 0), AllKnownColors.OrangeRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 218, 112, 214), AllKnownColors.Orchid);
            dict.Add(System.Drawing.Color.FromArgb(255, 238, 232, 170), AllKnownColors.PaleGoldenrod);
            dict.Add(System.Drawing.Color.FromArgb(255, 152, 251, 152), AllKnownColors.PaleGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 175, 238, 238), AllKnownColors.PaleTurquoise);
            dict.Add(System.Drawing.Color.FromArgb(255, 219, 112, 147), AllKnownColors.PaleVioletRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 239, 213), AllKnownColors.PapayaWhip);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 218, 185), AllKnownColors.PeachPuff);
            dict.Add(System.Drawing.Color.FromArgb(255, 205, 133, 63), AllKnownColors.Peru);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 192, 203), AllKnownColors.Pink);
            dict.Add(System.Drawing.Color.FromArgb(255, 221, 160, 221), AllKnownColors.Plum);
            dict.Add(System.Drawing.Color.FromArgb(255, 176, 224, 230), AllKnownColors.PowderBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 128, 0, 128), AllKnownColors.Purple);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 0, 0), AllKnownColors.Red);
            dict.Add(System.Drawing.Color.FromArgb(255, 188, 143, 143), AllKnownColors.RosyBrown);
            dict.Add(System.Drawing.Color.FromArgb(255, 65, 105, 225), AllKnownColors.RoyalBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 139, 69, 19), AllKnownColors.SaddleBrown);
            dict.Add(System.Drawing.Color.FromArgb(255, 250, 128, 114), AllKnownColors.Salmon);
            dict.Add(System.Drawing.Color.FromArgb(255, 244, 164, 96), AllKnownColors.SandyBrown);
            dict.Add(System.Drawing.Color.FromArgb(255, 46, 139, 87), AllKnownColors.SeaGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 245, 238), AllKnownColors.SeaShell);
            dict.Add(System.Drawing.Color.FromArgb(255, 160, 82, 45), AllKnownColors.Sienna);
            dict.Add(System.Drawing.Color.FromArgb(255, 192, 192, 192), AllKnownColors.Silver);
            dict.Add(System.Drawing.Color.FromArgb(255, 135, 206, 235), AllKnownColors.SkyBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 106, 90, 205), AllKnownColors.SlateBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 112, 128, 144), AllKnownColors.SlateGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 250, 250), AllKnownColors.Snow);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 255, 127), AllKnownColors.SpringGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 70, 130, 180), AllKnownColors.SteelBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 210, 180, 140), AllKnownColors.Tan);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 128, 128), AllKnownColors.Teal);
            dict.Add(System.Drawing.Color.FromArgb(255, 216, 191, 216), AllKnownColors.Thistle);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 99, 71), AllKnownColors.Tomato);
            dict.Add(System.Drawing.Color.FromArgb(255, 64, 224, 208), AllKnownColors.Turquoise);
            dict.Add(System.Drawing.Color.FromArgb(255, 238, 130, 238), AllKnownColors.Violet);
            dict.Add(System.Drawing.Color.FromArgb(255, 245, 222, 179), AllKnownColors.Wheat);
            dict.Add(System.Drawing.Color.FromArgb(255, 245, 245, 245), AllKnownColors.WhiteSmoke);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 0), AllKnownColors.Yellow);
            dict.Add(System.Drawing.Color.FromArgb(255, 154, 205, 50), AllKnownColors.YellowGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 185, 209, 234), AllKnownColors.GradientActiveCaption);
            dict.Add(System.Drawing.Color.FromArgb(255, 215, 228, 242), AllKnownColors.GradientInactiveCaption);

            return dict;
        } // End Function SetupKnownColorDictionary 


        private static System.Collections.Generic.HashSet<System.Drawing.Color> SetupSystemColorHashMap()
        {
            System.Collections.Generic.HashSet<System.Drawing.Color> hash =
                new System.Collections.Generic.HashSet<System.Drawing.Color>(
                    new System.Drawing.Color[] {
                        System.Drawing.Color.FromArgb(255, 180, 180, 180),
                        System.Drawing.Color.FromArgb(255, 153, 180, 209),
                        System.Drawing.Color.FromArgb(255, 0, 0, 0),
                        System.Drawing.Color.FromArgb(255, 171, 171, 171),
                        System.Drawing.Color.FromArgb(255, 240, 240, 240),
                        System.Drawing.Color.FromArgb(255, 160, 160, 160),
                        System.Drawing.Color.FromArgb(255, 105, 105, 105),
                        System.Drawing.Color.FromArgb(255, 227, 227, 227),
                        System.Drawing.Color.FromArgb(255, 255, 255, 255),
                        System.Drawing.Color.FromArgb(255, 109, 109, 109),
                        System.Drawing.Color.FromArgb(255, 0, 120, 215),
                        System.Drawing.Color.FromArgb(255, 0, 102, 204),
                        System.Drawing.Color.FromArgb(255, 244, 247, 252),
                        System.Drawing.Color.FromArgb(255, 191, 205, 219),
                        System.Drawing.Color.FromArgb(255, 255, 255, 225),
                        System.Drawing.Color.FromArgb(255, 200, 200, 200),
                        System.Drawing.Color.FromArgb(255, 100, 100, 100),
                        System.Drawing.Color.FromArgb(255, 185, 209, 234),
                        System.Drawing.Color.FromArgb(255, 215, 228, 242)
                    }
            );

            return hash;
        } // End Function SetupSystemColorHashMap 


        private static System.Collections.Generic.HashSet<string> SetupKnownColorHashMap()
        {
            System.Collections.Generic.HashSet<string> map =
                new System.Collections.Generic.HashSet<string>(new string[] {
 "ActiveBorder"
,"ActiveCaption"
,"ActiveCaptionText"
,"AppWorkspace"
,"Control"
,"ControlDark"
,"ControlDarkDark"
,"ControlLight"
,"ControlLightLight"
,"ControlText"
,"Desktop"
,"GrayText"
,"Highlight"
,"HighlightText"
,"HotTrack"
,"InactiveBorder"
,"InactiveCaption"
,"InactiveCaptionText"
,"Info"
,"InfoText"
,"Menu"
,"MenuText"
,"ScrollBar"
,"Window"
,"WindowFrame"
,"WindowText"
,"Transparent"
,"AliceBlue"
,"AntiqueWhite"
,"Aqua"
,"Aquamarine"
,"Azure"
,"Beige"
,"Bisque"
,"Black"
,"BlanchedAlmond"
,"Blue"
,"BlueViolet"
,"Brown"
,"BurlyWood"
,"CadetBlue"
,"Chartreuse"
,"Chocolate"
,"Coral"
,"CornflowerBlue"
,"Cornsilk"
,"Crimson"
,"Cyan"
,"DarkBlue"
,"DarkCyan"
,"DarkGoldenrod"
,"DarkGray"
,"DarkGreen"
,"DarkKhaki"
,"DarkMagenta"
,"DarkOliveGreen"
,"DarkOrange"
,"DarkOrchid"
,"DarkRed"
,"DarkSalmon"
,"DarkSeaGreen"
,"DarkSlateBlue"
,"DarkSlateGray"
,"DarkTurquoise"
,"DarkViolet"
,"DeepPink"
,"DeepSkyBlue"
,"DimGray"
,"DodgerBlue"
,"Firebrick"
,"FloralWhite"
,"ForestGreen"
,"Fuchsia"
,"Gainsboro"
,"GhostWhite"
,"Gold"
,"Goldenrod"
,"Gray"
,"Green"
,"GreenYellow"
,"Honeydew"
,"HotPink"
,"IndianRed"
,"Indigo"
,"Ivory"
,"Khaki"
,"Lavender"
,"LavenderBlush"
,"LawnGreen"
,"LemonChiffon"
,"LightBlue"
,"LightCoral"
,"LightCyan"
,"LightGoldenrodYellow"
,"LightGray"
,"LightGrey"
,"LightGreen"
,"LightPink"
,"LightSalmon"
,"LightSeaGreen"
,"LightSkyBlue"
,"LightSlateGray"
,"LightSteelBlue"
,"LightYellow"
,"Lime"
,"LimeGreen"
,"Linen"
,"Magenta"
,"Maroon"
,"MediumAquamarine"
,"MediumBlue"
,"MediumOrchid"
,"MediumPurple"
,"MediumSeaGreen"
,"MediumSlateBlue"
,"MediumSpringGreen"
,"MediumTurquoise"
,"MediumVioletRed"
,"MidnightBlue"
,"MintCream"
,"MistyRose"
,"Moccasin"
,"NavajoWhite"
,"Navy"
,"OldLace"
,"Olive"
,"OliveDrab"
,"Orange"
,"OrangeRed"
,"Orchid"
,"PaleGoldenrod"
,"PaleGreen"
,"PaleTurquoise"
,"PaleVioletRed"
,"PapayaWhip"
,"PeachPuff"
,"Peru"
,"Pink"
,"Plum"
,"PowderBlue"
,"Purple"
,"Red"
,"RosyBrown"
,"RoyalBlue"
,"SaddleBrown"
,"Salmon"
,"SandyBrown"
,"SeaGreen"
,"SeaShell"
,"Sienna"
,"Silver"
,"SkyBlue"
,"SlateBlue"
,"SlateGray"
,"Snow"
,"SpringGreen"
,"SteelBlue"
,"Tan"
,"Teal"
,"Thistle"
,"Tomato"
,"Turquoise"
,"Violet"
,"Wheat"
,"White"
,"WhiteSmoke"
,"Yellow"
,"YellowGreen"
,"ButtonFace"
,"ButtonHighlight"
,"ButtonShadow"
,"GradientActiveCaption"
,"GradientInactiveCaption"
,"MenuBar"
,"MenuHighlight"

}, System.StringComparer.OrdinalIgnoreCase);

            return map;
        } // End Function SetupKnownColorHashMap 


        private static System.Collections.Generic.HashSet<string> m_knownColors = SetupKnownColorHashMap();
        private static System.Collections.Generic.HashSet<System.Drawing.Color> m_systemColors = SetupSystemColorHashMap();

        private static System.Collections.Generic.Dictionary<System.Drawing.Color
                , AspNetCore.Reporting.Helpers.AllKnownColors> m_knownColorDictionary = SetupKnownColorDictionary();


        // System.Drawing.Color c; c.IsKnownColor
        public static bool IsKnownColor(string color)
        {
            return m_knownColors.Contains(color);
        } // End Function IsKnownColor


        // System.Drawing.Color c; c.ToKnownColor()
        // AspNetCore.Reporting.Helpers.ReportColor.ToKnownColor(c);
        public static AspNetCore.Reporting.Helpers.AllKnownColors ToKnownColor(System.Drawing.Color c)
        {
            //System.Drawing.KnownColor knownColor = c.ToKnownColor();
            if (m_knownColorDictionary.ContainsKey(c))
                return m_knownColorDictionary[c];

            return AspNetCore.Reporting.Helpers.AllKnownColors.Unknown;
        } // End Function ToKnownColor 


        // System.Drawing.Color c; c.IsSystemColor 

        /// <include file='doc\Color.uex' path='docs/doc[@for="Color.IsSystemColor"]/*' />
        /// <devdoc>
        ///     Determines if this color is a system color.
        /// </devdoc>
        public static bool IsSystemColor(System.Drawing.Color color)
        {
            if (m_systemColors.Contains(color))
                return true;

            // return color.IsKnownColor;
            // return IsKnownColor && ((((KnownColor)knownColor) <= KnownColor.WindowText) || (((KnownColor)knownColor) > KnownColor.YellowGreen));
            return false;
        } // End Function IsSystemColor 


    } // End Class ReportColor 



    // https://raw.githubusercontent.com/mono/sysdrawing-coregraphics/master/System.Drawing/KnownColor.cs
    public enum AllKnownColors
    {
        Unknown = 0,

        ActiveBorder = 1,
        ActiveCaption = 2,
        ActiveCaptionText = 3,
        AppWorkspace = 4,
        Control = 5,
        ControlDark = 6,
        ControlDarkDark = 7,
        ControlLight = 8,
        ControlLightLight = 9,
        ControlText = 10,
        Desktop = 11,
        GrayText = 12,
        Highlight = 13,
        HighlightText = 14,
        HotTrack = 15,
        InactiveBorder = 16,
        InactiveCaption = 17,
        InactiveCaptionText = 18,
        Info = 19,
        InfoText = 20,
        Menu = 21,
        MenuText = 22,
        ScrollBar = 23,
        Window = 24,
        WindowFrame = 25,
        WindowText = 26,
        Transparent = 27,
        AliceBlue = 28,
        AntiqueWhite = 29,
        Aqua = 30,
        Aquamarine = 31,
        Azure = 32,
        Beige = 33,
        Bisque = 34,
        Black = 35,
        BlanchedAlmond = 36,
        Blue = 37,
        BlueViolet = 38,
        Brown = 39,
        BurlyWood = 40,
        CadetBlue = 41,
        Chartreuse = 42,
        Chocolate = 43,
        Coral = 44,
        CornflowerBlue = 45,
        Cornsilk = 46,
        Crimson = 47,
        Cyan = 48,
        DarkBlue = 49,
        DarkCyan = 50,
        DarkGoldenrod = 51,
        DarkGray = 52,
        DarkGreen = 53,
        DarkKhaki = 54,
        DarkMagenta = 55,
        DarkOliveGreen = 56,
        DarkOrange = 57,
        DarkOrchid = 58,
        DarkRed = 59,
        DarkSalmon = 60,
        DarkSeaGreen = 61,
        DarkSlateBlue = 62,
        DarkSlateGray = 63,
        DarkTurquoise = 64,
        DarkViolet = 65,
        DeepPink = 66,
        DeepSkyBlue = 67,
        DimGray = 68,
        DodgerBlue = 69,
        Firebrick = 70,
        FloralWhite = 71,
        ForestGreen = 72,
        Fuchsia = 73,
        Gainsboro = 74,
        GhostWhite = 75,
        Gold = 76,
        Goldenrod = 77,
        Gray = 78,
        Green = 79,
        GreenYellow = 80,
        Honeydew = 81,
        HotPink = 82,
        IndianRed = 83,
        Indigo = 84,
        Ivory = 85,
        Khaki = 86,
        Lavender = 87,
        LavenderBlush = 88,
        LawnGreen = 89,
        LemonChiffon = 90,
        LightBlue = 91,
        LightCoral = 92,
        LightCyan = 93,
        LightGoldenrodYellow = 94,
        LightGray = 95,
        LightGreen = 96,
        LightPink = 97,
        LightSalmon = 98,
        LightSeaGreen = 99,
        LightSkyBlue = 100,
        LightSlateGray = 101,
        LightSteelBlue = 102,
        LightYellow = 103,
        Lime = 104,
        LimeGreen = 105,
        Linen = 106,
        Magenta = 107,
        Maroon = 108,
        MediumAquamarine = 109,
        MediumBlue = 110,
        MediumOrchid = 111,
        MediumPurple = 112,
        MediumSeaGreen = 113,
        MediumSlateBlue = 114,
        MediumSpringGreen = 115,
        MediumTurquoise = 116,
        MediumVioletRed = 117,
        MidnightBlue = 118,
        MintCream = 119,
        MistyRose = 120,
        Moccasin = 121,
        NavajoWhite = 122,
        Navy = 123,
        OldLace = 124,
        Olive = 125,
        OliveDrab = 126,
        Orange = 127,
        OrangeRed = 128,
        Orchid = 129,
        PaleGoldenrod = 130,
        PaleGreen = 131,
        PaleTurquoise = 132,
        PaleVioletRed = 133,
        PapayaWhip = 134,
        PeachPuff = 135,
        Peru = 136,
        Pink = 137,
        Plum = 138,
        PowderBlue = 139,
        Purple = 140,
        Red = 141,
        RosyBrown = 142,
        RoyalBlue = 143,
        SaddleBrown = 144,
        Salmon = 145,
        SandyBrown = 146,
        SeaGreen = 147,
        SeaShell = 148,
        Sienna = 149,
        Silver = 150,
        SkyBlue = 151,
        SlateBlue = 152,
        SlateGray = 153,
        Snow = 154,
        SpringGreen = 155,
        SteelBlue = 156,
        Tan = 157,
        Teal = 158,
        Thistle = 159,
        Tomato = 160,
        Turquoise = 161,
        Violet = 162,
        Wheat = 163,
        White = 164,
        WhiteSmoke = 165,
        Yellow = 166,
        YellowGreen = 167,
        ButtonFace = 168,
        ButtonHighlight = 169,
        ButtonShadow = 170,
        GradientActiveCaption = 171,
        GradientInactiveCaption = 172,
        MenuBar = 173,
        MenuHighlight = 174
    } // End enum AllKnownColors 


}

Компилировал под NetStandard 2.0

КАК:
Возьмите System.CoreFX.Forms и преобразуйте его в NetStandard 2.0. Затем добавьте System.Drawing.Common и System.Reflection.Emit.

Берем AspNetCore.ReportingServices и добавляем

Microsoft.Win32.Registry
System.CodeDom
System.ComponentModel
System.ComponentModel.TypeConverter
System.Configuration.ConfigurationManager
System.Data.Common
System.Data.SqlClient
System.Drawing.Common 
System.IO.Packaging
System.Runtime.Serialization.Primitives
System.Security.Permissions

Добавьте ссылку на System.CoreFX.Forms (NetStandard)

Получите следующие файлы из mono / corefx

AssemblyRef.cs (corefx System.Drawing)
ColorConverter.cs (corefx System.Drawing)
ColorConverterCommon.cs (corefx System.Drawing)
ColorTable.cs (corefx System.Drawing)
FontConverter.cs (mono System.Drawing.FontConverter.cs)
ImageFormatConverter.cs (mono System.Drawing.ImageFormatConverter.cs)
PaintValueEventArgs.cs (corefx System.Drawing.Design)
PointConverter.cs (corefx System.Drawing.Design)
SizeConverter.cs (corefx System.Drawing.Design)
UITypeEditor.cs  (corefx System.Drawing.Design "Primitives")
UITypeEditorEditStyle.cs  (corefx System.Drawing.Design "Primitives")

И добавляем класс-оболочку для System.Web


namespace System.Web
{

    public class HttpRequest
    {
        public System.Collections.Specialized.NameValueCollection Headers { get; set; }
    }

    public class HttpResponse
    {
        public string ContentType { get; set; }
        public int StatusCode { get; set; }
    }

    public class HttpContext
    {
        // public HttpRequest Request;
        // public HttpRequest Response;

        public HttpRequest Request { get; set; }
        public HttpResponse Response { get; set; }


        public static HttpContext Current;
    }
}

И разрешите небезопасный код в новом проекте netstandard 2.0.

Теперь добавьте AssemblyInfo.cs с

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AspNetCore.Reporting, PublicKey=00240000048000009400000006020000002400005253413100040000010001003736e45ce2a56cd06bc9ab2e7eeeeffd2533eaafbc1abc68561da0f512412bf1c7d2bd0c4422565a4f35818a205b4d54af1d0fef14fb8d7249bc37913e53a3313c2f26ca838849c5ef766082ed02db74e6459e77840dfe5eb01574aa0722876b2a9f714c5d03fbcea6e88345ccf55a87d57d9653a5913a826008b1d3ac557aab", AllInternalsVisible = true)]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AspNetCore.Reporting", AllInternalsVisible = true)]

И теперь он компилируется на NetStandard 2.0.

Привет @ Все отличные новости:

Я работаю с .NET Core в Windows!
100% NetStandard, 0% NetFramework

Html, Pdf, Excel, Excel2007 +, Word, Word2007 + и tiff - все они отлично работали с 57-страничным табличным отчетом с varchars, int, tinyint2, битами и вычисляемыми столбцами.
Все форматы вывода работают, кроме RDL, что немного забавно, но кого это волнует.
В конце концов, мы найдем проблему, не так ли?

AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);
lr.AddDataSource("DataSet1", dt);

var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");

// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");

System.Console.WriteLine(rr.TotalPages);

// System.IO.File.WriteAllBytes(@"d:\foo.htm", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.css", rr.SecondaryStream);
// System.IO.File.WriteAllBytes(@"d:\foo.pdf", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.xls", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.xlsx", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.doc", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.docx", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.tiff", rr.MainStream);

// System.IO.File.WriteAllBytes(@"d:\foo.rpl", rr.MainStream); // BOOM 

И еще хорошие новости:
WindowsBase (также известная как WPF) использовалась только для System.IO.Packaging, доступной в .NET Core.
Теперь это означает, что если мы сможем избавиться от пинвоксов, не будет никаких серьезных препятствий, чтобы заставить это работать и на Linux / Mac!

Теперь кто-нибудь быстро приступит к написанию веб-редактора RDL!
Тогда у нас могут быть и «динамические» (генерируемые пользователями) отчеты.
Скоро PostgreSQL-ReportingServices для Linux;)
(хорошо, на такой штуке есть дамоклов меч, но если бы мы могли просто опубликовать его из Китая, где права интеллектуальной собственности «смягчены» ...) :)

Ладно, может это слишком зло.
Подумайте вместо этого Microsoft ReportingServices для Oracle / SAP!
Или ReportingServices для Cassandra / Spark: ухмылка:

@ amh1979 :
Там нет рендерера PowerPoint?
Вы собрали его из последней версии reportviewer? (SSRS 2017)
Последняя известная мне версия на nuget:
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
(140.1000.523, 10 месяцев назад)
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WinForms
(140.1000.523)
https://www.nuget.org/packages/Microsoft.SqlServer.Types
(14.0.314.76)

Вот реализация CoreFX WinForms для NetStandard:
https://github.com/ststeiger/System.CoreFX.Forms

Обратите внимание на пробел, поскольку я добавил дополнительный проект NetCore и переименовал System.CoreFX.Forms в System.NetStandard.Forms, у него могут возникнуть трудности с загрузкой встроенных ресурсов, если это произойдет.

Файлы можно найти здесь:

AssemblyRef.cs
ColorConverter.cs
ColorConverterCommon.cs
ColorTable.cs
FontConverter.cs
ImageFormatConverter.cs
PaintValueEventArgs.cs
PointConverter.cs
SizeConverter.cs
UITypeEditor.cs
UITypeEditorEditStyle.cs

@ amh1979 :
А, я вижу, этого нет в Microsoft.ReportViewer.Common.dll.
Но это в каталоге ReportServer:
Microsoft.ReportingServices.PowerPointRendering.dll
и для CSV / XML / Atom:
Microsoft.ReportingServices.DataRendering.dll

C: \ Program Files \ Службы отчетов Microsoft SQL Server \ SSRS \ ReportServer \ bin

@ALL : Дамы, средство визуализации HTML работает в Linux на .NET Core / NetStandard 2.0!
А также WordOpenXML и средство визуализации ExcelOpenXML!
(не тестировалось с изображениями / графикой - только текст и код)

У средства рендеринга PDF есть проблемы с пинвоками встраивания шрифтов.
(Средство визуализации Word / Excel-2003 использует пинвоки и поэтому не работает.)
Если вы используете версию Aspose Cells / Words eval, вы можете преобразовать xlsx в xls, а docx в doc.
Вы также можете сгенерировать PDF из файла word:
soffice --headless --convert-to pdf filename.docx
(или снова с помощью aspose eval)
Если подумать, средство рендеринга PPTX тоже должно быть простым, потому что все, что он делает, - это берет изображения из файла TIFF и помещает каждое изображение страницы tiff в формате jpg / png на слайд pptx.
Похоже, что обработчик изображений - это сложнее всего.
Или вы можете взять wkhtmltoX и преобразовать каждую HTML-страницу в изображение / pdf.
Хотя это, вероятно, было бы немного медленным.

Удивительный !

HTML for report

@ALL : Atom / CSV / XML работает. Как и NULL-рендерер.
В Linux тоже.

Визуализация PowerPoint работает только в Windows - пинвоксы

Интересный факт: похоже, там есть средство визуализации JSON.
Но по какой-то причине эта чушь работает только в случае useSharedDataSetTableHandler, что бы это ни значило

ParseDeviceInfo(deviceInfo);

if (!useSharedDataSetTableHandler)
{
    throw new ReportRenderingException(StringResources.rrJsonRenderOutputNotSupported);
}

Кто-нибудь наверняка знает, как использовать JSON-рендерер?

@ amh1979 Я попытался использовать отчет сервера, но похоже, что параметры, которые я добавил для отчета, не сохраняются на сервере в LoadReport. Есть ли шанс, что вы можете настроить его так, чтобы они отправлялись на сервер в вашей следующей сборке?

Привет, @ststeiger и @ amh1979! Отличная работа над этим, есть ли какие-нибудь учебники по использованию этой библиотеки? Я пытаюсь понять, как / поддерживает ли он в настоящее время многозначные параметры и поддерживается ли детализация.
Я все время пытаюсь зайти на сайт, ссылка на который есть в описании пакета nuget (http://www.amhx.org/), чтобы увидеть его, но у меня все время истекает.

@DavidHayesCoding :
Вот мой тестовый код для AspNetCore.Reporting.LocalReport, это все, что меня интересует:
Заметка:
Типы рендеринга Rpl, RGDI, Atom, Xml, Json, Csv, null, pptx
не будут вам доступны, так как их нет в сборке amh1979.
(они являются частью SSRS, но не входят в распространяемый компонент ReportViewer)

Также обратите внимание, что общий источник данных (* .rds) должен находиться в том же каталоге, что и * .rdl, иначе вы получите исключение с нулевой ссылкой на LocalReport.Execute.

По дополнительным вопросам:
https://github.com/icsharpcode/ILSpy/releases/tag/v4.0-beta2
(Примечание: в правильном коде вам необходимо удалить datatable после его использования)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace NetCoreReporting
{


    public class Program
    {


        public static void Main(string[] args)
        {
            System.Data.SqlClient.SqlConnectionStringBuilder csb = new System.Data.SqlClient.SqlConnectionStringBuilder();
            csb.InitialCatalog = "TestDB";

            if ("COMPANY_NAME".Equals(System.Environment.UserDomainName, System.StringComparison.InvariantCultureIgnoreCase))
                csb.DataSource = System.Environment.MachineName + @"\SQLEXPRESS";
            else
                csb.DataSource = System.Environment.MachineName;

            if(System.Environment.OSVersion.Platform == System.PlatformID.Unix)
                csb.IntegratedSecurity = false;
            else
                csb.IntegratedSecurity = true;

            if (!csb.IntegratedSecurity)
            {
                csb.UserID = TestPlotly.SecretManager.GetSecret<string>("DefaultDbUser");
                csb.Password = TestPlotly.SecretManager.GetSecret<string>("DefaultDbPassword");
            }



            string sql = "SELECT * FROM T_Sites";
            // sql = "SELECT * FROM T_Users";

            System.Data.DataTable dt = new System.Data.DataTable();

            using (System.Data.Common.DbDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, csb.ConnectionString))
            {
                da.Fill(dt);
            }

            string fn = "wwwroot/Report1.rdl";
            fn = "wwwroot/Report2.rdl";

            AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);


            System.Collections.Generic.Dictionary<string, string> parameters = 
                new System.Collections.Generic.Dictionary<string, string>();

            // parameters.Add("in_logo", "base64");

            lr.AddDataSource("DataSet1", dt); // DataSet1 is the name of the DataSet in the report




            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 1, null, "");

            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Atom, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Xml, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Json, 1, null, "");// KABOOM 
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Csv, 1, null, "");

            var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pptx, 1, parameters, "");

            System.Console.WriteLine(rr.TotalPages);


            string dir = @"d:\";
            if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
                dir = "/opt/";

            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.css"), rr.SecondaryStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pdf"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xls"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xlsx"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.doc"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.docx"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.tiff"), rr.MainStream);

            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.atom.xml"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xml"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.json"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.csv"), rr.MainStream);

            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.rpl"), rr.MainStream); // BOOM 
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
            System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pptx"), rr.MainStream);

            BuildWebHost(args).Run();
        }


        public static IWebHost BuildWebHost(string[] args)
        { 
            return WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
        }


    }


}

@ALL : Кто-нибудь хочет помочь?
Ответьте на этот вопрос:
https://stackoverflow.com/questions/52093440/how-to-call-wine-dll-functions-from-c

Могу ли я предположить, что публикация большого количества кодов и длинных комментариев - это действительно сложный для восприятия и чтения способ отслеживания этой проблемы?

Я вижу много активности, много кода, но на самом деле мне не известно, какими были недавние (казалось бы, отличные) разработки.

Могу я предложить держать здесь все в порядке и использовать другие репо / соответствующие инструменты для совместного использования кода? Есть ли простое и понятное обновление статуса, которым можно поделиться здесь?

как @kierenj, я думаю, что

@kierenj @figuerres : Меня бы это

iii. Ограничения распространения. Вы не можете
• распространять Вторично распространяемый код для работы на платформе, отличной от платформы Windows;
• код должен быть раскрыт или распространен в форме исходного кода; или же
• другие имеют право изменять его.

@ststeiger
и вы можете работать с репо прямо здесь, чтобы создать ветку и поместить код в эту ветку.
тогда они имеют это и знают об этом и т.

@figuerres : я сделал репо на gitlab, где частный репозиторий бесплатный.

@MaximRouiller :
У меня была бы версия ReportViewer (локальные отчеты), примерно работающая под ASP.NET Core.
Около 75% из них будет работать даже под Linux, для которого Microsoft опубликовала SQL-Server.
Компоненты, которые работают под Linux, скорее всего, работают и под MacOS.

Однако эта версия ReportViewer основана на коде
https://www.nuget.org/packages/AspNetCore.Reporting
который, похоже, основан на коде из
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
который подпадает под эту лицензию
http://go.microsoft.com/fwlink/?LinkId=826162

Эта лицензия не позволяет
• распространять Вторично распространяемый код для работы на платформе, отличной от платформы Windows;
• код должен быть раскрыт или распространен в форме исходного кода; или же
• другие имеют право изменять его.
• обходить любые технические ограничения в программном обеспечении;
•> обратное проектирование запрещено <

Я хотел бы (публично) поделиться этим кодом с сообществом здесь, в github, в месте, которое еще предстоит определить, с целью улучшения кода и устранения любых возможных оставшихся ошибок, чтобы перенести ReportViewer в .NET Core.
Однако я бы не хотел идти на такой шаг в одностороннем порядке, учитывая текущую лицензию ReportViewerControl.WebForms.

Я думаю, что многое изменилось с тех пор, как эта лицензия была впервые написана / обновлена.
Например, не имеет смысла публиковать ReportViewer для .NET Core, если результат будет работать только на платформе Windows - также учитывая, что Microsoft выпустила SQL-Server для Linux, что означает, что в какой-то момент SSRS должен все равно следовать.

А учитывая, что ASP.NET-Core не реализует WebForms, переход с ReportViewer-WebForms на ReportViewer-NetCore в любом случае будет критическим изменением.

Не могли бы вы дискретно спросить власть предержащих, дадут ли они, учитывая обстоятельства, зеленый свет на такое начинание - что, кстати, сэкономило бы ИМ время и людские ресурсы, - и хорошо ли согласуется с природой открытого исходного кода .NET-Core / NetStandard 2.0.

С момента выпуска .NET-Core прошло уже более 2-х ГОДОВ, а решения для широких и отдаленных отчетов все еще не существует. Пора это исправить.
Если мы сделаем это вместе, мы все будем быстрее и лучше.

http://go.microsoft.com/fwlink/?LinkId=826162
Что меня беспокоит.
Если нет, я исключу пакеты из NuGet.

@ALL :
Таким образом, XLS / DOC-Renderer теперь работает как в Linux, так и в Windows.
Сейчас 85% работает на Linux.

Похоже, у нас осталось 3 WinAPI-вызова для PDFWriter и 13 WinAPI-вызовов для ImageRenderer / Graphics.
Я думаю, что сам PdfWriter может быть довольно простым.

Привет, @ststeiger, я не могу запустить AspNetCore.Reporting в функции Azure с планом потребления, потому что он заблокировал функцию GDI +. У вас есть какие-то решения? Благодарю.

Еще нет - он делает несколько вызовов GDI + и usp10.dll, в основном для получения информации о шрифтах.
Кроме того, он передает указатели GDI +, и простой замены нет, потому что mono libgdi + решил действовать по-другому (по уважительной причине).

Мне удалось переписать функцию GetFontData на C #, прочитав исходный код Wine на C, но мне нужен freetype, чтобы получить информацию о шрифте TrueType (вино также использует FreeType).
SixLabors.Fonts и LayoutFarm просто еще нет (с большим отрывом).
Вот:
https://gist.github.com/ststeiger/273341aebd29009f2b272b822b69563f

Также заменил размеры текста на freetype.

Теперь мне нужно заменить каждый дескриптор устройства GDI на собственный класс.
Затем этот класс должен содержать информацию о шрифте / графике / freetype-face / handle и т. Д., Поэтому мне не нужно переписывать средство визуализации.

Когда это будет сделано, мне нужно снова взглянуть на вино, поскольку оно превращается из бумаги в мир и из мира в бумагу.
И тогда это должно быть сделано.
Я думаю, что преобразования бумаги в мир и из мира в бумагу уже могут быть в System.Drawing.Graphics.
Похоже, что часть кода когда-то была написана с использованием .NET Framwork 1.0.

Кроме того, мне все еще нужно как-то сопоставить шрифт .NET и шрифт freetype.

Привет, ребята,
С уважением к:

@ALL :
Таким образом, XLS / DOC-Renderer теперь работает как в Linux, так и в Windows.
Сейчас 85% работает на Linux.

Office Open XML

честно говоря, я думаю, что было бы лучше использовать новые документы XML, чем вообще не нужна форма OLE.
Хорошо, если кто-то все еще использовал действительно старые приложения Office, не очень хорошо для обратной совместимости. но Office Open XML существует примерно с 2002-2006 гг., поэтому любой, кто использовал word или excel за последние 10 лет, сможет без проблем использовать форматы файлов docx и xlsx.
просто моя мысль об этом ...

Просто чтобы мы не поняли нас неправильно:
Конечно, средство визуализации OpenXml Excel тоже работает.

Я просто говорю, что XLS / DOC тоже работает, если нужно.
Теперь о том, следует ли раскрывать XLS / DOC или его можно безопасно удалить - это другой вопрос. Возможно, все еще существуют некоторые старые программы, которые не могут работать с XLSX.

UBS, например, до сих пор использует программы COBOL.
И есть много других.
Так что, наверное, на всякий случай лучше оставить функции XLS подольше.

@RaymondHuy :
Если Azure заблокировал функцию GDI +, работает ли System.Drawing.Common?
Или это относится только к вызовам DllImport, вызываемым внешней структурой?

Хм, только что погуглил.
Похоже, библиотеки System.Drawing доступны в облачной службе Azure (в основном это просто виртуальная машина), но не в веб-приложении Azure (в основном общий хостинг?).
Это могло быть проблемой.
Итак, как только это будет запущено в Linux, нам нужно будет заменить что-либо System.Drawing на SixLabors.ImageSharp позже, чтобы запустить его в веб-приложении Azure.

Это будет стоить времени и усилий.
@RaymondHuy :
Не могли бы вы проверить, работает ли FreeType (оболочка SharpFont) в Azure?
https://github.com/Robmaister/SharpFont

Заметка:
В x64-Windows вам необходимо заменить предложение using для FT_Long и FT_ULong этим

#if WINDOWS
    using FT_Long = System.Int32;
    using FT_ULong = System.UInt32;    
#else // Linux, MacOS
    using FT_Long = System.IntPtr;
    using FT_ULong = System.UIntPtr;
#endif

потому что пропатченные dll freetype не работают в x64-Windows.

Вот как я это сделал:
https://gist.github.com/ststeiger/9e2eb98e29a3c987aca739045af1d2ce

(Примечание: определите WINDOWS в параметрах сборки)

с некоторым тестовым кодом:

SharpFont.Native.Init();

SharpFont.Library lib = new SharpFont.Library();

string font = @"C:\Windows\Fonts\tahoma.ttf";
if(System.Environment.OSVersion.Platform == System.PlatformID.Unix)
    font = "/usr/share/wine/fonts/tahoma.ttf";

SharpFont.Face fontFace = new SharpFont.Face(lib, font);


float size = 12;
if (fontFace!= null)
    // fontFace.SetCharSize(0, size, 0, 96);
    fontFace.SetCharSize(size, size, 96, 96);

System.Console.WriteLine(fontFace.Size.Metrics.Ascender.ToDouble());

fontFace.Size.Metrics.Ascender выдаст исключение, если это произойдет, если исправление WINDOWS не применяется.

когда я пытаюсь использовать файл .rdlc, я получаю исключение
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable 'недоступен в этом контексте, потому что он' Friend '.'. в localreport.Execute ()
Помогите мне, пожалуйста

        string sql = "SELECT * FROM employee";
        // sql = "SELECT * FROM T_Users";

        System.Data.DataTable dt = new System.Data.DataTable();

        using (System.Data.Common.DbDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, csb.ConnectionString))
        {
            da.Fill(dt);
        }

        string fn = "wwwroot/Report1.rdl";
        fn = "wwwroot/InOutTab31.rdlc";

        AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);


        System.Collections.Generic.Dictionary<string, string> parameters =
            new System.Collections.Generic.Dictionary<string, string>();
        parameters["TEN_ID"]="45";
        parameters["START_DATE"]="2018";
        parameters["END_DATE"]= "2018";

        // parameters.Add("in_logo", "base64");

        lr.AddDataSource("DsDayStatusTab31", dt); // DataSet1 is the name of the DataSet in the report




        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 1, null, "");

        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Atom, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Xml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Json, 1, null, "");// KABOOM 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Csv, 1, null, "");

        var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, parameters, "");

        System.Console.WriteLine(rr.TotalPages);


        string dir = @"d:\";
        if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
            dir = "/opt/";

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.css"), rr.SecondaryStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pdf"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xls"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xlsx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.doc"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.docx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.tiff"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.atom.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.json"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.csv"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.rpl"), rr.MainStream); // BOOM 
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pptx"), rr.MainStream);

        BuildWebHost(args).Run();

Похоже, у вас проблема со встроенными выражениями VB.
В любом случае есть несколько проблем.

В Microsoft.VisualBasic1 \ VBCodeGenerator.cs
UseShellExecute должен иметь значение false.

System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(cmd)
{
    WorkingDirectory = currentDir,
    RedirectStandardOutput = true,
    RedirectStandardInput = true,
    UseShellExecute = false  // <== or else it can't redirect output
};

И FromFileBatch необходимо заменить на roslyn, если он скомпилирован для netstandard (провайдер CodeDom не может скомпилировать для netstandard - забавные исключения, если используются VB-выражения, например, в параметрах)


        protected override System.CodeDom.Compiler.CompilerResults FromFileBatch(System.CodeDom.Compiler.CompilerParameters options, string[] fileNames)
        {

#if NETSTANDARD2_0
            return NetStandardFromFileBatch(options, fileNames);
#else
            return OldFromFileBatch(options, fileNames);
#endif
        }




#if NETSTANDARD2_0         



        protected System.CodeDom.Compiler.CompilerResults NetStandardFromFileBatch(System.CodeDom.Compiler.CompilerParameters options, string[] fileNames)
        {
            //// C:\Program Files\dotnet\sdk\2.0.0\Roslyn

            //string sysver = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion();
            //System.Console.WriteLine(sysver);


            //string pf64 = System.Environment.ExpandEnvironmentVariables("%ProgramW6432%");
            //string pf32 = System.Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%");
            //string pf = pf32;

            //if (System.IntPtr.Size * 8 == 64)
            //    pf = pf64;

            //// compilerDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles);
            ////compilerDirectory = System.IO.Path.Combine(compilerDirectory, "dotnet", "sdk", "2.0.0", "Roslyn");
            //compilerDirectory = System.IO.Path.Combine(pf32, "MSBuild", "14.0", "Bin");
            //if (System.IntPtr.Size * 8 == 64)
            //    compilerDirectory = System.IO.Path.Combine(compilerDirectory, "amd64");

            string assemblyName = System.IO.Path.GetFileNameWithoutExtension(options.OutputAssembly);

            Microsoft.CodeAnalysis.SyntaxTree[] syntaxTrees = new Microsoft.CodeAnalysis.SyntaxTree[fileNames.Length];

            for (int i = 0; i < fileNames.Length; ++i)
            {
                string fileContent = System.IO.File.ReadAllText(fileNames[i], System.Text.Encoding.UTF8);

                Microsoft.CodeAnalysis.VisualBasic.VisualBasicParseOptions op = null;

                // ERR_EncodinglessSyntaxTree = 37236 - Encoding must be specified... 
                syntaxTrees[i] = Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxTree.ParseText(
                    fileContent, op, fileNames[i], System.Text.Encoding.UTF8
                );

            }

            Microsoft.CodeAnalysis.MetadataReference[] references =
                new Microsoft.CodeAnalysis.MetadataReference[options.ReferencedAssemblies.Count];

            for (int i = 0; i < references.Length; ++i)
            {
                references[i] = Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(
                    options.ReferencedAssemblies[i]
                );
            }



            Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions co =
                new Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions
            (
                Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary
            );

            co.WithOptionStrict(Microsoft.CodeAnalysis.VisualBasic.OptionStrict.Off);
            co.WithOptionExplicit(false);
            co.WithOptionInfer(true);

            Microsoft.CodeAnalysis.Compilation compilation = Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation.Create(
                assemblyName,
                syntaxTrees,
                references,
                co
            );


            System.CodeDom.Compiler.CompilerResults compilerResults = new System.CodeDom.Compiler.CompilerResults(options.TempFiles);

            compilerResults.NativeCompilerReturnValue = -1;

            // using (var dllStream = new System.IO.MemoryStream())
            using (System.IO.FileStream dllStream = System.IO.File.Create(options.OutputAssembly))
            {
                using (System.IO.MemoryStream pdbStream = new System.IO.MemoryStream())
                {
                    Microsoft.CodeAnalysis.Emit.EmitResult emitResult = compilation.Emit(dllStream, pdbStream);
                    if (!emitResult.Success)
                    {

                        foreach (Microsoft.CodeAnalysis.Diagnostic diagnostic in emitResult.Diagnostics)
                        {
                            // options.TreatWarningsAsErrors
                            if (diagnostic.IsWarningAsError || diagnostic.Severity == Microsoft.CodeAnalysis.DiagnosticSeverity.Error)
                            {
                                string errorNumber = diagnostic.Id;
                                string errorMessage = diagnostic.GetMessage();

                                string message = $"{errorNumber}: {errorMessage};";
                                string fileName = diagnostic.Location.SourceTree.FilePath;

                                Microsoft.CodeAnalysis.FileLinePositionSpan lineSpan = diagnostic.Location.GetLineSpan();
                                string codeInQuestion = lineSpan.Path;
                                int line = lineSpan.StartLinePosition.Line;
                                int col = lineSpan.StartLinePosition.Character;

                                compilerResults.Errors.Add(
                                    new System.CodeDom.Compiler.CompilerError(fileName, line, col, errorNumber, errorMessage)
                                );
                            } // End if 

                        } // Next diagnostic 

                        // emitResult.Diagnostics
                        // CheckCompilationResult(emitResult);
                    }
                    else
                    {
                        compilerResults.PathToAssembly = options.OutputAssembly;
                        compilerResults.NativeCompilerReturnValue = 0;
                    }
                }
            }

            // compilerResults.CompiledAssembly = System.Reflection.Assembly.Load(array3, null);

            return compilerResults;
        }
#endif

В https://github.com/aspnet/RoslynCodeDomProvider есть RoslynCodeDomProvider, но они все равно используют Roslyn за кулисами. И компиляция относительно жестко запрограммирована с помощью "C: \ WINDOWS \ Microsoft.NET \ Framework\\ vbc.exe "в любом случае плохая идея.

Теперь у меня работает полноценный рендерер HTML4, HTML5 и MHTML.
Не только разбитый на страницы.

Привет, я использую [https://www.nuget.org/packages/AspNetCore.Reporting], и он отлично работает в локальном IIS.
Но как только я разверну его на сервере Windows 2012 R2, я столкнулся с проблемой.

Журналы ошибок.

сбой: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]
Произошло необработанное исключение при выполнении запроса.
AspNetCore.Reporting.LocalProcessingException: произошла ошибка во время обработки локального отчета.; Определение отчета «D: \ Apps \ BillingApproval \ ReportFiles \ ReleaseProcess.rdl» недействительно.
При компиляции выражений произошла непредвиденная ошибка. Возвращаемое значение собственного компилятора: -1073741819'. ---> AspNetCore.Reporting.DefinitionInvalidException: The definition of the report 'D:\Apps\BillingApproval\ReportFiles\ReleaseProcess.rdl' is invalid. An unexpected error occurred while compiling expressions. Native compiler return value: -1073741819 '. ---> AspNetCore.ReportingServices.ReportProcessing.ReportPublishingException: при компиляции выражений произошла непредвиденная ошибка. Возвращаемое значение собственного компилятора: -1073741819'. at AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat(Stream definitionStream, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat(Byte[] definition, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport(PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String& reportDescription, String& reportLanguage, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat(PublishingContext reportPublishingContext) at AspNetCore.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot) --- End of inner exception stack trace --- at AspNetCore.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot) at AspNetCore.Reporting.LocalService.GetCompiledReport(PreviewItemContext itemContext, Boolean rebuild, ControlSnapshot& snapshot) at AspNetCore.Reporting.LocalService.CompileReport() at AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport() at AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession() --- End of inner exception stack trace --- at AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession() at AspNetCore.Reporting.InternalLocalReport.SetParameters(IEnumerable 1 параметры)
в AspNetCore.Reporting.Report.SetParameters (параметр ReportParameter)
в AspNetCore.Reporting.LocalReport.Execute (RenderType renderType, Int32 pageIndex, Dictionary 2 parameters, String findString) at BA.UI.WebV2.Extension.AspNetCoreReportingExtension.ExecuteToMemoryStreamResult(LocalReport localreport, RenderType rendertype, Int32 index, Dictionary 2 параметры, String searchString) в D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Extension \ AspNetCoreReportingExtension.cs: строка 27
в BA.UI.WebV2.Controllers.ReportsController.ReleaseProcessToPDF (DateTime from, DateTime to) в D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Controllers \ ReportsController.cs: строка 65
в lambda_method (Closure, Object, Object [])
в Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute (сопоставитель IActionResultTypeMapper, исполнитель ObjectMethodExecutor, контроллер объекта, аргументы Object [])
в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync ()
в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync ()
в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (контекст ActionExecutedContext)
в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (состояние и следующий, область и область действия, объект и состояние, логическое значение и isCompleted)
в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (контекст ResourceExecutedContext)
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (Состояние и следующий, Область и область действия, Объект и состояние, Логическое значение и isCompleted)
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync ()
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
в Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext)
в Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (контекст HttpContext)
в Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (контекст HttpContext)
в Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke (контекст HttpContext)

@jfmjason : это вызвано, когда компилятор кода CodeDom (.NET 4.0) пытается скомпилировать несколько файлов во временном пути в ExprHostCompiler. Он хочет скомпилировать сборки NetStandard / NetCore с поставщиком .NET 4.0. Это не работает. Когда он пытается скомпилировать эти файлы, csc.exe молча терпит неудачу с возвращаемым значением -1073741819.
Поскольку вы не можете скомпилировать код .NET Core с помощью компилятора .NET 4.0, вам необходимо использовать RoslynCompilers, которых нет в System.CodeDom. Мой вышеупомянутый NetStandardFromFileBatch устраняет именно эту проблему (и использует CodeDom, если он компилируется для NetFramework 4).

Однако обратите внимание, что среда выполнения VB в .NET Core серьезно ограничена.
По сути, .NET Core не поддерживает VB.NET ..

Если вы посмотрите на базовые вещи VB, такие как около 50 строковых функций VB, таких как Replace, Trim, AscW, ChrW, LCase, Len, Mid, в Microsoft.VisualBasic.Strings - .NET Core 2.0 поддерживает ровно 2 из них, AscW и ChrW ...

Если вы посмотрите на текущий источник на github, вы увидите, что прямо сейчас они есть, но все это заглушки, которые выдают null.
https://github.com/dotnet/corefx/blob/master/src/Microsoft.VisualBasic/ref/Microsoft.VisualBasic.cs

Так что в дополнение к этому вам, возможно, придется немного отредактировать код VB в ваших отчетах - для поддержки как .NET Core, так и NetFramework.

Итак, @ALL : вот идея:
Если вы хотите, чтобы ваш отчет с кодом, работающим на .NET Core без изменений, начал реализовывать строковые функции в Microsoft.VisualBasic.cs.
Или удалите материал, специфичный для среды выполнения VB, и попробуйте использовать классы и функции-члены, предоставляемые с C #, такие как string.Length вместо Len, IndexOf вместо InStr, Subtring вместо Mid, «BLA» .ToLower () вместо LCase («БЛА») и т. Д.

Кроме того, VB-код в целом, а не только в .NET Core, имеет проблемы с синтаксисом, допускающим значение NULL?
Поэтому используйте System.Nullable (Of Double) вместо Double ?, если вам нужно объявить, например, возвращаемое значение функции.

NuGets:
Microsoft.CodeAnalysis.Common, Microsoft.CodeAnalysis.CSharp, Microsoft.CodeAnalysis.VisualBasic

Также вам необходимо изменить ссылки на сборки в ExprHostCompiler.cs:
(AspNetCore.ReportingServices.RdlExpressions \ ExprHostCompiler.cs)

   private static System.Reflection.Assembly GetNetStdAssembly()
        {
            System.Reflection.Assembly nsAssembly = null;

            System.Reflection.AssemblyName[] asms = typeof(Microsoft.VisualBasic.Constants).Assembly.GetReferencedAssemblies();


            foreach (System.Reflection.AssemblyName asm in asms)
            {
                if (asm.FullName.StartsWith("netstandard,", System.StringComparison.OrdinalIgnoreCase))
                {
                    nsAssembly = System.Reflection.Assembly.Load(asm.FullName);
                    break;
                }
            }

            return nsAssembly;


            //System.Reflection.Assembly[] asms = System.AppDomain.CurrentDomain.GetAssemblies();
            //
            //foreach (System.Reflection.Assembly asm in asms)
            //{
            //    if (asm.FullName.StartsWith("netstandard,", System.StringComparison.OrdinalIgnoreCase))
            //    {
            //        nsAssembly = asm;
            //        break;
            //    }
            //}

            // return nsAssembly;
        }



        private byte[] InternalCompile(System.AppDomain compilationTempAppDomain, bool refusePermissions)
        {
            if (m_builder.HasExpressions)
            {
                System.CodeDom.Compiler.CompilerParameters compilerParameters = new System.CodeDom.Compiler.CompilerParameters();
                compilerParameters.OutputAssembly = System.IO.Path.Combine(System.IO.Path.GetTempPath(), m_expressionHostAssemblyHolder.ExprHostAssemblyName, "ExpressionHost.dll");
                compilerParameters.TempFiles = new System.CodeDom.Compiler.TempFileCollection(System.IO.Path.GetDirectoryName(compilerParameters.OutputAssembly));
                compilerParameters.GenerateExecutable = false;
                compilerParameters.GenerateInMemory = false;
                compilerParameters.IncludeDebugInformation = false;

                compilerParameters.ReferencedAssemblies.Add(typeof(AspNetCore.Reporting.InternalLocalReport).Assembly.Location);

                // Real reportServer
                // compilerParameters.ReferencedAssemblies.Add("System.dll");
                // compilerParameters.ReferencedAssemblies.Add(typeof(AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.ReportObjectModelProxy).Assembly.Location);
                // compilerParameters.ReferencedAssemblies.Add(typeof(Microsoft.SqlServer.Types.SqlGeography).Assembly.Location);

#if NETSTANDARD2_0

                // Assemblies: mscorlib.dll, netstandard.dll, System.Threading.Thread.dll
                // System.Threading.Thread.dll, not netstandard.dll ...
                //// compilerParameters.ReferencedAssemblies.Add(typeof(System.LocalDataStoreSlot).Assembly.Location);

                // compilerParameters.ReferencedAssemblies.Add(System.Linq.Enumerable.FirstOrDefault(System.Linq.Enumerable.Where(System.AppDomain.CurrentDomain.GetAssemblies(), (System.Reflection.Assembly t) => t.FullName.Contains("netstandard,"))).Location);

                // netstandard.dll
                compilerParameters.ReferencedAssemblies.Add(GetNetStdAssembly().Location);

                // System.Private.CoreLib.dll
                compilerParameters.ReferencedAssemblies.Add(typeof(System.MarshalByRefObject).Assembly.Location);

                // System.Runtime.dll
                compilerParameters.ReferencedAssemblies.Add(typeof(System.IO.FileAttributes).Assembly.Location);

                // Microsoft.VisualBasic.dll
                compilerParameters.ReferencedAssemblies.Add(typeof(Microsoft.VisualBasic.Constants).Assembly.Location);

                //compilerParameters.ReferencedAssemblies.Add(typeof(string).Assembly.Location);
                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Uri).Assembly.Location);

                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Drawing.RectangleF).Assembly.Location);
                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Drawing.Graphics).Assembly.Location);

                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Data.Common.DbCommand).Assembly.Location);
                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Data.SqlClient.SqlCommand).Assembly.Location);

                //// compilerParameters.ReferencedAssemblies.Add(typeof(System.LocalDataStoreSlot).Assembly.Location);
#else

                // mscorlib
                compilerParameters.ReferencedAssemblies.Add(typeof(string).Assembly.Location); 

                // System.Core
                // Already contains reference to System.Core
                // compilerParameters.ReferencedAssemblies.Add(typeof(System.IO.Pipes.PipeSecurity).Assembly.Location);

                // Microsoft.CSharp
                // compilerParameters.ReferencedAssemblies.Add(typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.Location); 

                // Microsoft.VisualBasic.Constants
                compilerParameters.ReferencedAssemblies.Add(typeof(Microsoft.VisualBasic.Constants).Assembly.Location); 

                // System
                // Already contains reference to System
                // compilerParameters.ReferencedAssemblies.Add(typeof(System.Uri).Assembly.Location); 
                // Already contains reference to System.Drawing
                // compilerParameters.ReferencedAssemblies.Add(typeof(System.Drawing.Graphics).Assembly.Location);
                // Already contains reference to System.Data 
                // compilerParameters.ReferencedAssemblies.Add(typeof(System.Data.DataTable).Assembly.Location);
#endif

                compilerParameters.CompilerOptions += m_langParser.GetCompilerArguments();

@ amh1979 : Я еще не смотрел на это, но в постраничной версии средства просмотра отображаются ли изображения в отчете в постраничном рендеринге HTML?
Потому что, когда я взял полный рендерер html4 & 5 от ReportServer, изображения, кажется, были делегированы обработчику axd или ashx службы ReportingServices. Однако они появились в версии MHT.

Вероятно, их следует изменить на url ("data: image / png; base64, SOME_BASE64_IMAGE"); вместо этого, чтобы они были встроены в HTML.
То есть, если они перейдут на внешнюю ссылку.
Не проверял, влияет ли это и на зрителя.

@ststeiger

Спасибо за ответ. Интересно, почему он отлично работает, когда я публикую релизную версию своего веб-приложения (.net core 2.1) в локальном IIS.

Возможно, он работает локально, потому что у вас локально установлена ​​.NET Framework.
Или потому, что ваш локальный веб-сервер не находится в интегрированном режиме, работает под другим пользователем или попадает в другой логический путь, настройки пула приложений, настройки безопасности, перенаправления сборки и т. Д.
Кроме того, ServicePacks, CumulativeUpdates и другие интересные «функции».

Сделал небольшое тестовое приложение.
После добавления System.Drawing.Common под Win10 он работает нормально.
Запуск в Ubuntu 16.04 приводит к ошибке.
AspNetCore.Reporting.LocalProcessingException: произошла ошибка во время обработки локального отчета.; Определение отчета '/opt/testReportViewer/bin/Debug/netcoreapp2.1/Reports/Report1.rdlc' недействительно.
При обработке отчета произошла непредвиденная ошибка.
Невозможно загрузить общую библиотеку kernel32.dll или одну из ее зависимостей. Чтобы помочь диагностировать проблемы с загрузкой, рассмотрите возможность установки переменной среды LD_DEBUG: libkernel32.dll: невозможно открыть файл общих объектов: нет такого файла или каталога ---> AspNetCore.Reporting.DefinitionInvalidException: определение отчета '/ opt / testReportViewer /bin/Debug/netcoreapp2.1/Reports/Report1.rdlc 'недействителен.
При обработке отчета произошла непредвиденная ошибка.
Невозможно загрузить общую библиотеку kernel32.dll или одну из ее зависимостей. Чтобы помочь диагностировать проблемы с загрузкой, рассмотрите возможность установки переменной среды LD_DEBUG: libkernel32.dll: невозможно открыть файл общих объектов: нет такого файла или каталога ---> AspNetCore.ReportingServices.ReportProcessing.ReportProcessingException: при обработке отчета произошла непредвиденная ошибка.
Невозможно загрузить общую библиотеку kernel32.dll или одну из ее зависимостей. Чтобы помочь диагностировать проблемы с загрузкой, рассмотрите возможность установки переменной среды LD_DEBUG: libkernel32.dll: невозможно открыть файл общих объектов: нет такого файла или каталога ---> System.DllNotFoundException: невозможно загрузить общую библиотеку 'kernel32.dll' или одну его зависимостей. Чтобы помочь в диагностике проблем с загрузкой, рассмотрите возможность установки переменной среды LD_DEBUG: libkernel32.dll: невозможно открыть файл общих объектов: нет такого файла или каталога
на AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat (поток definitionStream, String & описание, String и языка, ParameterInfoCollection и параметров, DataSourceInfoCollection & DataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, Boolean & hasExternalImages, Boolean & hasHyperlinks, байт [] & dataSetsHash)
на AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat (байт [] определение, String & описание, String и языка, ParameterInfoCollection и параметров, DataSourceInfoCollection & DataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, булевы & hasExternalImages, булевы & hasHyperlinks, байт [] & dataSetsHash)
на AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport (PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String & reportDescription, String & reportLanguage, ParameterInfoCollection & параметров, DataSourceInfoCollection & DataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, булевы & hasExternalImages, булевы & hasHyperlinks, байт [] & dataSetsHash)
в AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
--- Конец трассировки внутреннего стека исключений ---
в AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
в AspNetCore.Reporting.ReportCompiler.CompileReport (контекст ICatalogItemContext, Byte [] reportDefinition, логическое значение generateExpressionHostWithRefusedPermissions, ControlSnapshot и моментальный снимок)
--- Конец трассировки внутреннего стека исключений ---
в AspNetCore.Reporting.ReportCompiler.CompileReport (контекст ICatalogItemContext, Byte [] reportDefinition, логическое значение generateExpressionHostWithRefusedPermissions, ControlSnapshot и моментальный снимок)
в AspNetCore.Reporting.LocalService.GetCompiledReport (PreviewItemContext itemContext, логическая перестройка, ControlSnapshot и моментальный снимок)
в AspNetCore.Reporting.LocalService.CompileReport ()
в AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport ()
в AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession ()
--- Конец трассировки внутреннего стека исключений ---

@ststeiger есть новости о библиотеке AspNetCore.Reporting? Я искал решение для создания PDF-файлов из файла RDL в .NET Core уже несколько дней, и единственным решением, которое я нашел, был AspNetCore.Reporting, который, как я позже обнаружил, работает только в Windows, и изменения, которые вы сделали и сообщили здесь, очень привлекательны , также потому, что у меня довольно много проблем с использованием вложенных отчетов, и я не могу отлаживать AspNetCore.Reporting без источника, который у вас есть :) ... Мне было бы очень интересно помочь вам с этой библиотекой для улучшения недостающих бит ( и, наконец, отладить его ...)

@OkunevPY : возможно, это вызвано одной из функций управления памятью, которые используются для безопасного хранения данных источника данных. В Linux я просто отключил это - хранить данные в незашифрованном виде. Потом работает, хотя и небезопасно. Однако вы должны сделать это в коде ReportViewer. Код производственного уровня должен реализовывать метод шифрования / дешифрования, что несложно, но я бы предпочел сначала заставить все функции работать,

@zillemarco;
PDF-создание пока не работает (работает только в Windows).
Кроме того, если вы создаете какое-либо приложение, которое развертываете с помощью этой переработанной dll, технически вы делаете что-то незаконное.

Если вам нужен сгенерированный PDF-файл в Linux, я рекомендую сгенерировать его из HTML с помощью wkHtmlToPdf.
Вот вариант .NET-Core:
https://github.com/ststeiger/libWkHtml2X
Используйте только исполняемый вариант (wkhtmltopdf.exe, wkhtmltoimage.exe через поток ввода / вывода)
libWkHtmlToX.ProcessManager(opts)
потому что wkhtmltox.dll не работает в многопоточных сценариях, к тому же мой интерфейс C # еще не совсем без ошибок.

Некоторые примеры использования (converter.telerik.com для преобразования в C #):

  • SVG в PDF:
Dim pngBytes As Byte() = Nothing
Dim paper_maxWidth As Double = 1024 ' pixel
Dim paper_maxHeight As Double = 768 ' pixel
Dim svgInfo As cSvgInfo = Portal_Convert.wkHtmlHelper.SvgToPaperSize(svg, paper_maxWidth, paper_maxHeight, False)

Dim opts As New libWkHtmlToX.WkHtmlToImageCommandLineOptions()
opts.ExecutableDirectory = Portal_Convert.wkHtmlHelper.GetWkHtmlToXPath()

opts.DisableSmartWidth = True
opts.ScreenWidth = System.Math.Ceiling(svgInfo.NewWidth)
opts.ScreenHeight = System.Math.Ceiling(svgInfo.NewHeight)

' svgInfo.HTML = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.MapPath("~/External/1506414857353.svg"), System.Text.Encoding.UTF8)

Using p As New libWkHtmlToX.ProcessManager(opts)
    p.Start()
    p.WriteStandardInput(svgInfo.HTML)
    pngBytes = p.ReadOutputStream()

    Dim b As Boolean = p.WaitForExit(5000)
End Using ' p 
  • HTML в PDF:
        Dim opts As New libWkHtmlToX.WkHtmlToPdfCommandLineOptions()
        opts.ExecutableDirectory = Portal_Convert.wkHtmlHelper.GetWkHtmlToXPath()

        ' Dim measure As String = value.Replace(Number.ToString(), "")

        'Dim dblWidth As Double = Double.Parse(System.Text.RegularExpressions.Regex.Match(width, "[\d.]+").Value)
        'Dim dblHeight As Double = Double.Parse(System.Text.RegularExpressions.Regex.Match(height, "[\d.]+").Value)

        'If dblHeight > dblWidth Then
        '    opts.Orientation = libWkHtmlToX.Orientation_t.Portrait
        'Else
        '    opts.Orientation = libWkHtmlToX.Orientation_t.Landscape
        '    Dim x As String = width
        '    width = height
        '    height = x
        'End If

        opts.Width = width
        opts.Height = height
        opts.DisableSmartShrinking = True

        ' dpi is not working in wkhtmltopdf version 0.12.4
        ' opts.DPI = 300
        ' zoom setting with value 96/300 = 0.32
        ' opts.ZoomFactor = 96.0 / opts.DPI
        ' opts.ZoomFactor = 1.0 - 96.0 / opts.DPI
        ' opts.ZoomFactor = (1.0 / opts.DPI) / (1.0 / 96.0)
        opts.DPI = 96

        Dim pdfBytes As Byte() = Nothing

        Using p As New libWkHtmlToX.ProcessManager(opts)
            p.Start()
            p.WriteStandardInput(html)
            pdfBytes = p.ReadOutputStream()

            Dim b As Boolean = p.WaitForExit(5000)
        End Using ' p 

        Return pdfBytes

В качестве альтернативы вы можете использовать PdfSharp для .NET-Core
https://github.com/ststeiger/PdfSharpCore

Я также перенес на NetStandard полную PDF-библиотеку, которую можно найти здесь:
https://github.com/ststeiger/PdfSharpNetStandard
(если вам не нужен Azure-хостинг, рекомендую выбрать PdfSharpNetStandard)

Что касается ReportViewer-PDF в Linux:
Сначала вам нужно будет реализовать

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

@ststeiger Я знаю, что развертывание приложения с этой библиотекой было бы незаконным, и я не собираюсь этого делать, но с исходным кодом я мог бы хотя бы отладить его, понять, почему я не могу загрузить вложенный отчет и передать ему данные (я пробовал с resharper, но это кошмар). Если вы хотите предоставить мне доступ для чтения к репо, мне бы это понравилось :) Мое имя пользователя gitlab - zillemarco (как здесь, на github)

@zillemarco : Вас
Вы должны были получить электронное письмо от gitlab, предположительно со ссылкой на репо.

Попробуйте ILSpy 4.0 Beta 2 вместо Resharper:
https://github.com/icsharpcode/ILSpy/releases

Если вам нужно отлаживать внутри .NET Framework, попробуйте live-декомпилировать и отладить с помощью Rider, EAP бесплатный:
https://www.jetbrains.com/rider/eap/

@ststeiger получил письмо, спасибо :) Спасибо и за совет!

@ststeiger Можно дать доступ к репозиторию AspNetCore.Reporting для okunevpy?

@OkunevPY : Вас добавили. См. Почту.

@ststeiger Спасибо.

        string sql = "SELECT * FROM employee";
        // sql = "SELECT * FROM T_Users";

        System.Data.DataTable dt = new System.Data.DataTable();

        using (System.Data.Common.DbDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, csb.ConnectionString))
        {
            da.Fill(dt);
        }

        string fn = "wwwroot/Report1.rdl";
        fn = "wwwroot/InOutTab31.rdlc";

        AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);


        System.Collections.Generic.Dictionary<string, string> parameters =
            new System.Collections.Generic.Dictionary<string, string>();
        parameters["TEN_ID"]="45";
        parameters["START_DATE"]="2018";
        parameters["END_DATE"]= "2018";

        // parameters.Add("in_logo", "base64");

        lr.AddDataSource("DsDayStatusTab31", dt); // DataSet1 is the name of the DataSet in the report




        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 1, null, "");

        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Atom, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Xml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Json, 1, null, "");// KABOOM 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Csv, 1, null, "");

        var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, parameters, "");

        System.Console.WriteLine(rr.TotalPages);


        string dir = @"d:\";
        if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
            dir = "/opt/";

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.css"), rr.SecondaryStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pdf"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xls"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xlsx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.doc"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.docx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.tiff"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.atom.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.json"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.csv"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.rpl"), rr.MainStream); // BOOM 
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pptx"), rr.MainStream);

        BuildWebHost(args).Run();

AspNetCore.Reporting.LocalProcessingException: «Произошла ошибка во время обработки локального отчета.; Для кодировки 1252 нет данных. Для получения информации об определении пользовательской кодировки см. Документацию по методу Encoding.RegisterProvider».

@Jhonnybmx : есть веб-сайт google.com, на котором вы помещаете сообщение об ошибке, а решение - первая ссылка ...

https://stackoverflow.com/questions/49215791/vs-code-c-sharp-system-notsupportedexception-no-data-is-available-for-encodin

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

Привет, меня интересует LocalReport на .NET Core для экспорта отчета rdlc в PDF.
Мне пока подходит только версия для Windows.

Я наткнулся на NuGet-пакет AspNetCore.ReportingServices от @ amh1979, который мне и нужен.
Проблема в том, что класс InternalLocalReport в этом пакете является внутренним, и мне нужно получить доступ ко всему API (как в исходной реализации MS LocalReport) для eq. чтобы использовать событие SubreportProcessing, вызовите методы LoadSubreportDefinition () или GetParameters ().

Эти методы не реализованы в классе AspNetCore.Reporting.LocalReport (в AspNetCore.Reporting NuGet), поэтому мне нужно вызывать их напрямую.

Сборка AspNetCore.ReportingServices.dll установила InternalsVisibleTo для сборки AspNetCore.Reporting.dll.
Могу ли я как-то использовать это, как в https://github.com/amh1979/Reporting/tree/master/AspNetCore.Reporting с сертификатом Reporting.pfx (к которому у меня нет пароля).

Не могли бы вы мне помочь пожалуйста? Какое решение для этого?

@ststeiger Вы можете предоставить мне доступ к репозиторию GitLab AspNetCore.Reporting тоже. Мое имя пользователя GitLab - holajan.
благодаря

AspNetCore.ReportingServices под этой лицензией
http://go.microsoft.com/fwlink/?LinkId=826162
Я закрыл это

Может ли кто-нибудь предоставить документацию / подсказки или подсказки о том, как использовать / реализовать этот пакет? Большое спасибо.

@ststeiger Не могли бы вы предоставить мне доступ к репозиторию AspNetCore.Reporting? Я пытаюсь заставить его работать в Linux с помощью PDF.

@holajan , @skivsoft :
Извините, был в отпуске - была хорошая поездка в Сингапур и Таиланд.
Доступ предоставлен, вы должны были получить электронное письмо на адрес, указанный для gitlab.

@azharuddinsayed :

когда я пытаюсь использовать файл .rdlc, я получаю исключение
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable 'недоступен в этом контексте, потому что он' Friend '.'. в localreport.Execute ()
Помогите мне, пожалуйста

Мне удалось воспроизвести ту ошибку.
Требуются следующие изменения:


ReportingServices/AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel/CustomCodeProxyBase.cs

internal AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.IReportObjectModelProxyForCustomCode Report => m_reportObjectModel;
==>
internal protected AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.IReportObjectModelProxyForCustomCode Report => m_reportObjectModel;



internal CustomCodeProxyBase(AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.IReportObjectModelProxyForCustomCode reportObjectModel)
==> 
internal protected CustomCodeProxyBase(AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.IReportObjectModelProxyForCustomCode reportObjectModel)

и

ReportingServices/AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel/IReportObjectModelProxyForCustomCode.cs
internal interface IReportObjectModelProxyForCustomCode
==> 
public interface IReportObjectModelProxyForCustomCode

Кроме того, следующее исправление в
AnyWebReporting \ ReportingServices \ Microsoft.VisualBasic1 \ VBCodeGenerator.cs

System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + cmd)
==>
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c \"" + cmd + "\"")

Тогда кастомный код работает, по крайней мере, в моем случае.
Обновился в мастере.

@ststeiger Спасибо за доступ. Вы знаете, как визуализировать PDF в Linux? Слишком много перемычек, которые нужно заменить.

@skivsoft : Пока нет.
Вам нужно будет заменить все пинвоки на эквивалент freetype, что требует больших усилий.

Если вам просто нужно создать PDF-файл в Linux, вы можете попробовать PdfSharpCore или PdfSharpNetStandard:
https://github.com/ststeiger/PdfSharpCore
https://github.com/ststeiger/PdfSharpNetStandard
Я использую их оба в Linux.
PdfSharpNetStandard более полный, но также использует GDI + / libGDIplus, в то время как PdfSharpCore избегает System.Drawing.

@ststeiger Спасибо за доступ к репо.

Мне удалось заставить свой отчет работать (экспорт в PDF) в моем приложении Windows .NET core 2.2.
Я сделал это на копии вашего проекта ReportViewer_NetStandard, потому что я удалил LocalReports и изменил InternalLocalReport на LocalReport и сделал класс общедоступным (мне нужен был доступ к исходному API LocalReport).

В своем отчете я исправил две проблемы:
Некоторые выражения Visual Basic:
IIf - я добавил Импорт в Microsoft.VisualBasic.Interaction в _ExprHostBuilder_, Изменен netcoreapp2.2 где класс Microsoft.VisualBasic.Interaction в _Microsoft.VisualBasic.dll_ является внутренним и добавил мой класс Microsoft.VisualBasic.Interaction к Microsoft.VisualBasic1.

Формат - добавлен импорт в Microsoft.VisualBasic.StringsEx в _ExprHostBuilder_, добавлен класс Microsoft.VisualBasic.StringsEx в Microsoft.VisualBasic1 (поскольку исходный класс Microsoft.VisualBasic.Strings является общедоступным, но без функции форматирования)

System.Environment.NewLine - добавлена ​​ссылка на System.Runtime.Extensions.dll в _ExprHostCompiler_.

Вот эти изменения в коде:

In AspNetCore.ReportingServices.RdlExpressions\ExprHostBuilder.cs:
AspNetCore.ReportingServices.RdlExpressions.ExprHostBuilder.GetExprHost(AspNetCore.ReportingServices.ReportIntermediateFormat.ProcessingIntermediateFormatVersion version, bool refusePermissions)
+                codeNamespace.Imports.Add(new System.CodeDom.CodeNamespaceImport("Microsoft.VisualBasic.StringsEx"));
+                codeNamespace.Imports.Add(new System.CodeDom.CodeNamespaceImport("Microsoft.VisualBasic.Interaction"));

In AspNetCore.ReportingServices.ReportProcessing\ExprHostBuilder.cs:
AspNetCore.ReportingServices.ReportProcessing.ExprHostBuilder.GetExprHost(AspNetCore.ReportingServices.ReportProcessing.IntermediateFormatVersion version, bool refusePermissions)
+                codeNamespace.Imports.Add(new System.CodeDom.CodeNamespaceImport("Microsoft.VisualBasic.StringsEx"));
+                codeNamespace.Imports.Add(new System.CodeDom.CodeNamespaceImport("Microsoft.VisualBasic.Interaction"));

In AspNetCore.ReportingServices.RdlExpressions\ExprHostCompiler.cs:
AspNetCore.ReportingServices.RdlExpressions.ExprHostCompiler.InternalCompile(System.AppDomain compilationTempAppDomain, bool refusePermissions)
+                // System.Runtime.Extensions.dll
+                compilerParameters.ReferencedAssemblies.Add(typeof(System.Environment).Assembly.Location);

Added file Microsoft.VisualBasic1\Interaction.cs:
using Microsoft.VisualBasic.CompilerServices;

namespace Microsoft.VisualBasic
{
    /// <summary>The <see langword="Interaction" /> module contains procedures used to interact with objects, applications, and systems. </summary>
    [StandardModule]
    public sealed class Interaction
    {
        public static T IIf<T>(bool condition, T truePart, T falsePart)
        {
            return !condition ? falsePart : truePart;
        }
    }
}






Added file Microsoft.VisualBasic1\StringsEx.cs in (StringsEx.zip)
Added file Microsoft.VisualBasic1\UtilsEx.cs in (StringsEx.zip)
Added file Microsoft.VisualBasic1\Information.cs in (StringsEx.zip)
Added file Microsoft.VisualBasic1\Symbols.cs in (StringsEx.zip)
Added file Microsoft.VisualBasic1\ExceptionUtils.cs in (StringsEx.zip)

StringsEx.zip

Исправьте подотчеты с выражениями:
Я заметил, что элементы вложенного отчета использовали вложенного отчета , поэтому выражения в вложенных отчетах не работали. Мне удалось найти ошибку в ReportRuntime.LoadExprHostAssembly , где сборки ExpressionHost.dll были кэшированы по имени, но имя для всех отчетов и вложенных отчетов всегда одно и то же «_ExpressionHost_». Я удалил это кеширование.
Изменения в коде:

In AspNetCore.ReportingServices.RdlExpressions\ReportRuntime.cs:
-                private static readonly System.Collections.Hashtable ExpressionHosts = new System.Collections.Hashtable();

AspNetCore.ReportingServices.RdlExpressions.ReportRuntime.LoadExprHostIntoCurrentAppDomain(byte[] exprHostBytes, string exprHostAssemblyName, System.Security.Policy.Evidence evidence, bool includeParameters, bool parametersOnly, AspNetCore.ReportingServices.ReportProcessing.OnDemandReportObjectModel.OnDemandObjectModel objectModel, System.Collections.Generic.List<string> codeModules)
-                System.Reflection.Assembly assembly = LoadExprHostAssembly(exprHostBytes, exprHostAssemblyName, evidence);
+                System.Reflection.Assembly assembly = LoadExprHostAssembly(exprHostBytes);

            private static System.Reflection.Assembly LoadExprHostAssembly(byte[] exprHostBytes)
            {
                try
                {
                    new System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityPermissionFlag.ControlEvidence).Assert();
                    return System.Reflection.Assembly.Load(exprHostBytes);
                }
                finally
                {
                    System.Security.CodeAccessPermission.RevertAssert();
                }
            }

Просмотрите эти изменения и, если это имеет для вас смысл, внесите эти изменения и в свое репо.

Спасибо.

@holajan : Если я добавлю System.String в пространства имен, я получу:
Ambigous call to Replace - cannot resolve call
и если я добавлю класс Microsoft.VisualBasic.Interaction, я получу:
ambigous call to Microsoft.VisualBasic.Interaction
когда я запускаю его в NetCore или .NET Framework 4.
Возможно, это работает только в .NET Core 2.2.

Если кеширует неправильно, то лучше не кешировать.
Согласитесь с этим изменением.
Я поместил старый код в #ifdef false (вместо того, чтобы удалить его).

@ststeiger Я отредактировал свой комментарий, использование System.String было неправильным, теперь я реализовал Microsoft.VisualBasic.StringsEx вместо Format и других функций. Простите за это.

Да Microsoft.VisualBasic.Interaction работает только в .NET Core 2.2, потому что класс Microsoft.VisualBasic.Interaction находится в Microsoft.VisualBasic.dll для внутреннего .NETCoreApp v2.2 , в Microsoft.VisualBasic.dll для .NETCoreApp v2.09 - общедоступный, но с внутренним методом IIf .
Я не знаю, как решить эту проблему лучше, но с .NET core 3.0 это, вероятно, все равно будет изменено.

@holajan : Пока, подождем до 3.0
Я сделал InternalLocalReport общедоступным.
Странное название теперь относительно его публичности;)

@holajan : Добавлен Microsoft.VisualBasic.StringsEx, теперь работает
Пришлось добавить IReadOnlyDictionary для .NET 4, но это столь же незначительное замечание.
Не могли бы вы проверить, работает ли это с вами.

@ststeiger Я это тестировал.
Я должен изменить #if false на #if true в Microsoft.VisualBasic1._Interaction.cs, чтобы выражение IIf работало.
В противном случае все работает нормально.
Спасибо

@holajan : Хорошо, так и должно быть. может быть, определение в решении было бы лучше.

Все участники этой ветки должны проголосовать за добавление этого предложения здесь: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- ядро

По состоянию на 2019/03 год он занимает 7-е место в списке самых популярных функций: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Изменить: по состоянию на 2019/05 его 5-е место сверху

Изменить: по состоянию на 2019/07 год 4-й сверху

        string sql = "SELECT * FROM employee";
        // sql = "SELECT * FROM T_Users";

        System.Data.DataTable dt = new System.Data.DataTable();

        using (System.Data.Common.DbDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, csb.ConnectionString))
        {
            da.Fill(dt);
        }

        string fn = "wwwroot/Report1.rdl";
        fn = "wwwroot/InOutTab31.rdlc";

        AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);


        System.Collections.Generic.Dictionary<string, string> parameters =
            new System.Collections.Generic.Dictionary<string, string>();
        parameters["TEN_ID"]="45";
        parameters["START_DATE"]="2018";
        parameters["END_DATE"]= "2018";

        // parameters.Add("in_logo", "base64");

        lr.AddDataSource("DsDayStatusTab31", dt); // DataSet1 is the name of the DataSet in the report




        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 1, null, "");

        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Atom, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Xml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Json, 1, null, "");// KABOOM 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Csv, 1, null, "");

        var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, parameters, "");

        System.Console.WriteLine(rr.TotalPages);


        string dir = @"d:\";
        if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
            dir = "/opt/";

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.css"), rr.SecondaryStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pdf"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xls"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xlsx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.doc"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.docx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.tiff"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.atom.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.json"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.csv"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.rpl"), rr.MainStream); // BOOM 
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pptx"), rr.MainStream);

        BuildWebHost(args).Run();

AspNetCore.Reporting.LocalProcessingException: «Произошла ошибка во время обработки локального отчета.; Для кодировки 1252 нет данных. Для получения информации об определении пользовательской кодировки см. Документацию по методу Encoding.RegisterProvider».

Добавьте ниже код:
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
Это решает мою проблему

Привет,

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

.rdl файл содержит диаграмму

Я прикрепил снимок экрана Html

Мы очень признательны, если вы поможете нам решить эту проблему.

благодаря

Платформа: ASP.NET Core

публичная строка _reportPath = @ ".. \ RenderReportAPI \ employeeChart.rdl";

строка mimtype = "";
int extension = 1;

       LocalReport localReport = new LocalReport(_reportPath);

    _dataSourceName = "DataSet1";
    _dataSourceList = Employee.GetEmployees();                                   
    localReport.AddDataSource(_dataSourceName, _dataSourceList);



    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    var result = localReport.Execute(RenderType.Html, extension, null, findString: mimtype);

Chart_html

@chinturathod : Что показывает URL-адрес элемента "диаграмма отчета"?
У html-renderer есть вторичный поток вывода для CSS.
Содержит ли он изображение в кодировке base64? Или это просто ссылка на обработчик изображений?

@ststeiger
Привет, пожалуйста, найдите HTML и CSS ниже
HTML:

\"Report
19-03-2019 12:08:25







CSS:

"#rsoReportDiv .A97993c8d452f40d4910a317776d607f616xBc {
граница: 1pt нет Черный;
цвет фона
}

rsoReportDiv .A97993c8d452f40d4910a317776d607f616xB {

border:1pt none Black;
background-color:Transparent;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f69 {

word-wrap:break-word;
word-break:break-word;
white-space:pre-wrap;
min-width:139.70mm;
overflow:hidden;
width:139.70mm;
border:1pt none Black;
background-color:Transparent;
font-style:normal;
font-family:'Segoe UI Light';
font-size:28pt;
font-weight:400;
text-decoration:none;
unicode-bidi:normal;
color:Black;
vertical-align:top;
text-align:left;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f614 {

border:1pt none #d3d3d3;
background-color:White;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f65c {

border:1pt none Black;
background-color:Transparent;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f65 {

min-width:152.40mm;
min-height:65.14mm;
width:152.40mm;
border:1pt none Black;
background-color:Transparent;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f63 {

word-wrap:break-word;
word-break:break-word;
white-space:pre-wrap;
padding-left:2pt;
padding-top:2pt;
padding-right:2pt;
padding-bottom:2pt;
border:1pt none Black;
background-color:Transparent;
font-style:normal;
font-family:'Segoe UI';
font-size:10pt;
font-weight:400;
text-decoration:none;
unicode-bidi:normal;
color:Black;
vertical-align:top;
text-align:right;

}

rsoReportDiv .rsr1 {

height:100%;
width:100%

}

rsoReportDiv .rsr2 {

height:100%;
width:100%;
overflow:hidden

}

rsoReportDiv .rsr3 {

height:100%

}

rsoReportDiv .rsr4 {

border-style:none

}

rsoReportDiv .rsr5 {

border-left-style:none

}

rsoReportDiv .rsr6 {

border-right-style:none

}

rsoReportDiv .rsr7 {

border-top-style:none

}

rsoReportDiv .rsr8 {

border-bottom-style:none

}

rsoReportDiv .rsr10 {

border-collapse:collapse

}

rsoReportDiv .rsr9 {

border-collapse:collapse;
table-layout:fixed

}

rsoReportDiv .rsr11 {

width:100%;
overflow-x:hidden

}

rsoReportDiv .rsr12 {

position:absolute;
display:none;
background-color:white;
border:1px solid black;

}

rsoReportDiv .rsr13 {

text-decoration:none;
color:black;
cursor:pointer;

}

rsoReportDiv .rsr14 {

font-size:0pt

}

rsoReportDiv .rsr15 {

direction:RTL;
unicode-bidi:embed

}

rsoReportDiv .rsr16 {

margin-top:0pt;
margin-bottom:0pt

}

rsoReportDiv .rsr17 {

height:100%;
width:100%;
display:inline-table

}

rsoReportDiv .rsr18 {

height:100%;
display:inline-table

}

rsoReportDiv * {

 box-sizing: border-box;

}

Элемент диаграммы отчета
Report chart
я думаю, что эта ошибка вызывает проблему

Благодаря..

@ststeiger

Привет, есть обновления?

@chinturathod :
В настоящее время я работаю над CEF-pdf как заменой wkhtml2X и над отчетами SwissRe.

У меня будет время изучить этот проект не раньше, чем через две недели.

Есть ли репозиторий (частный или иной) для пакета AspNetCore.ReportingServices, к которому мне мог бы быть предоставлен доступ?

@clintb : Мне нужно ваше имя учетной записи git LAB , чтобы я мог предоставить вам доступ.
Затем вы получите электронное письмо на адрес электронной почты учетной записи git lab, содержащее доступ к репо.

Привет, Стефан, мой gitLab - c_l_i_n_t. Благодаря!

В пятницу, 26 апреля 2019 г., в 12:18 Stefan Steiger [email protected]
написал:

@clintb https://github.com/clintb : Мне нужно ваше имя учетной записи git LAB , поэтому
Я могу предоставить вам доступ.
Затем вы получите электронное письмо на адрес электронной почты лаборатории git.
счет, содержащий доступ к репо.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/aspnet/AspNetCore/issues/1528#issuecomment-487133308 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ABURO5ILQUEGMZARNW2HNALPSM2M5ANCNFSM4CFRN7MQ
.

@clintb : Вас добавили.

Привет, @ststeiger , пожалуйста, предоставьте доступ репо к дереву лотов. Спасибо за вашу работу и помощь.

@lotsatrees : Вы добавлены.

Спасибо, Стефан, в любое время рад купить тебе хорошего пива.

Привет, @ststeiger , мой gitlab - edgardoreyes. Спасибо.

@ststeiger
Мой гитлаб - ikourfaln
Спасибо

@ikourfaln , @edgardoreyes : Вас двоих

@ststeiger , можно ли еще добавить себя (Mhirji на gitlab)?

Благодаря!!

@Mhirji : Готово.

Благодаря!!!

Почему бы просто не создать проект сервера отчетов и не использовать его как службу для любого типа проекта?
Вашему проекту ASP.NET Core потребуется только URL-адрес службы отчетов для отображения отчетов.
Есть проблемы с таким подходом?

@ststeiger, могу ли я получить доступ? (ConstantDisaster на gitlab) заранее спасибо

@ConstantDisaster : добавлено.
@mshwf : Нет, на самом деле это именно то, что я хочу сделать - чтобы мы могли запускать отчеты в нашем собственном приложении, и сервер отчетов не нужен (всегда проблема с аутентификацией Windows - по некоторым причинам ИТ-отделы не могут добавлять новых пользователей в группу - плюс всегда проблема с неустановленными пакетами обновлений, нежелание обновляться до последней версии SQL-сервера, потому что клиенты хотят пропустить версию, рендеринг несоответствий между ReportViewer и ReportServer, наш собственный системный администратор слишком ленив для установки чего-либо и т. д.). Как всегда, просто не хватает времени. К тому же здесь, в Северо-Западной Европе, первые солнечные дни лета, и я не хочу их пропустить.

@ststeiger Есть ли альтернативы получше? (Я пробовал читать эту ветку, но она очень длинная!)
также не могли бы вы предоставить мне доступ к репозиторию GitLab (mshwf)?
благодаря

Пожалуйста, поддержите этот запрос , надеюсь, Microsoft нас прислушается!

Привет, @ststeiger, не
Мое имя пользователя gitlab - k3flo
огромное спасибо
Велен Данк 😊

@ststeiger, спасибо за добавление, как мне снова начать использовать это? в проекте ядра asp net? думал, что у него есть ридми или что-то в этом роде, еще раз спасибо.

@ConstantDisaster : в AnyWebReporting\Any_TestCode\TestReport.cs есть "пример".
Он показывает, как визуализировать отчет с параметрами и наборами данных в формате PDF.

В двух словах:
1) Создайте словарь для параметров отчета:

System.Collections.Generic.Dictionary<string, string> parameters =
                new System.Collections.Generic.Dictionary<string, string>();

2) Добавьте все параметры, которые есть в вашем отчете, в словарь, например

parameters.Add("in_language", "DE");
parameters.Add("in_something_uid", "9A892D4B-B4E3-4804-AAB6-97EAB37B7849");

3) Создайте новый основанный на LocalReport и загрузите отчет

string fn = "/full/path/to/SomeReport.rdl";
AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);

Затем для всех наборов данных, которые используются только в параметрах, вы можете добавить пустую таблицу данных (не NULL)
lr.AddDataSource("SEL_Standort", new System.Data.DataTable());

И для каждого используемого набора данных вам необходимо заполнить таблицу данных результатом запроса для этого набора данных и добавить набор данных в источники данных:

lr.AddDataSource("DATA_Schluesselbestandeskontrolle", dt);

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

var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, parameters, "");
System.IO.File.WriteAllBytes(System.IO.Path.Combine(@"d:\", "Bestandeskontrolle.pdf"), rr.MainStream);

Я добавил пример HTML-страницы, которая имитирует дизайн интерфейса отчетов ReportViewer 2014 и 2017, который у меня был в черновой версии. Если вы снова выполните выборку из git, вы найдете его в:

AnyWebReporting\AnyWebReporting\wwwroot
AnyWebReporting/AnyWebReporting/wwwroot/index.htm
AnyWebReporting/AnyWebReporting/wwwroot/index2014.htm
AnyWebReporting/AnyWebReporting/wwwroot/logon.htm

Вот и все.
Если вам нужно отобразить отчет в Интернете, вы можете выполнить рендеринг в html, передав соответствующий Enum в lr.Execute (RenderType.HTML5_0 или HTML4_0 или Mhtml) и передав правильный номер страницы. Результат (HTML) находится в MainStream, а CSS - в SecondaryStream.

Однако, соединяя index.htm ReportViewer с lr.Execute с помощью JavaScript, на данный момент вам нужно сделать это самостоятельно. Пока не дошел до этого. На данный момент он мне нужен для создания PDF-файлов для добавления в электронные письма.

@ k3flo @mshwf : Добавлено.

@mshwf :

@ststeiger Есть ли альтернативы получше? (Я пробовал читать эту ветку, но она очень длинная!)

Насколько мне известно, иначе я бы использовал его.
Возможно, мы увидим что-то в этом отношении после выпуска .NET Core 3.1 (LTS) , потому что тогда будет свободна возможность создания ReportViewer только для Windows на основе .NET Core.

Однако такая вещь была бы такой же бриколажей, как и этот проект, так что, возможно, они потратят время на то, чтобы удалить весь код System.Drawing (и вызовы WinAPI в GDI +) и сделать это правильно, то есть кроссплатформенность. Хотя, на мой взгляд, это маловероятно. Однако не расстраивайтесь, когда будете приятно удивлены (кашель).

Дело в том, что отчеты могут содержать VB-код, а поддержка VB в .NET Core (<3) пока сомнительна - в лучшем случае. Это будет (= теоретически должно быть) исправлено .NET Core 3, и если они сделают ReportViewer, они, скорее всего, дождутся, по крайней мере, выпуска LTS.

@mshwf :
Вам не нужно читать всю эту ветку.
Все, что вам нужно сделать, это выполнить git-clone проекта и просмотреть пример отчета (хотя у вас не будет базы данных для его запуска).

Не могли бы вы добавить меня в gitlab?
DCGA

@dcga : Добавлено.

Привет, не могли бы вы добавить меня в свой gitlab? Сейчас я конвертирую отчет в проект ASP.net Core.

@ ericyu67 : Полагаю, ваше имя учетной записи gitlab - ericyu? В таком случае вас добавили.

Правильно, спасибо.

@ststeiger, не могли бы вы добавить меня?
Rodrigorrl

@rodrigorrl : добавлено.

@ststeiger, не могли бы вы добавить меня?

@myersBR : Готово.

@ststeiger, можешь добавить меня, пожалуйста?

@acofalc : добавлен @ aco.mit

Привет, @ststeiger, пожалуйста, добавьте меня: oblin228, спасибо.

Есть новости по этому поводу? Я использую ASP.NET Core и отказываюсь возвращаться к веб-формам. У меня есть проект отчетов, и я загружаю URL-адрес с сервера отчетов в свое приложение, чтобы загрузить файл. Проблема в том, что он постоянно запрашивает аутентификацию Windows, и я бы хотел этого избежать ...

@oblin : Добавлено.

@jfcaldeira : пока вы запускаете приложение в Windows, средство просмотра отчетов на gitlab должно работать более или менее (пока нерешенная проблема с изображениями в HTML-выводе). Запустите его в Linux, и он должен работать до тех пор, пока вы не используете PDF, TIFF или PowerPoint в качестве формата вывода (не знаю слова), но Excel, html, xml и json также работали в Linux (в мой тест с 1 отчетом - не могу сказать, взорвется ли что-нибудь, если вы используете полный набор функций).

Но если ваша проблема заключается в проверке подлинности Windows в SSRS, почему бы вам не использовать настраиваемую безопасность (также известную как проверка подлинности с помощью форм SSRS).

Для этого см. Здесь:
https://www.codeproject.com/Articles/675943/SSRS-2012-Forms-Authentication
https://github.com/ststeiger/SSRS-Localizer
https://github.com/ststeiger/CustomHttpHeaders
https://github.com/microsoft/Reporting-Services/tree/master/CustomSecuritySample

Возможно, вам потребуется войти в систему с помощью Form-Post в JavaScript и установить P3P-политику (в SSRS через модуль http), чтобы SSRS-auth-cookie сохранялся в IE в разных доменах ... (примечание: если вы используете виртуальные каталоги и у вас есть 2 приложения на одном SSRS, cookie-файл аутентификации из приложения1 [который находится в SSRS-домене] перезапишет cookie-файл аутентификации приложения2, который также находится в SSRS-домене)

@oblin : Добавлено.

@jfcaldeira : пока вы запускаете приложение в Windows, средство просмотра отчетов на gitlab должно работать более или менее (пока нерешенная проблема с изображениями в HTML-выводе). Запустите его в Linux, и он должен работать до тех пор, пока вы не используете PDF, TIFF или PowerPoint в качестве формата вывода (не знаю слова), но Excel, html, xml и json также работали в Linux (в мой тест с 1 отчетом - не могу сказать, взорвется ли что-нибудь, если вы используете полный набор функций).

Но если ваша проблема заключается в проверке подлинности Windows в SSRS, почему бы вам не использовать настраиваемую безопасность (также известную как проверка подлинности с помощью форм SSRS).

Для этого см. Здесь:
https://www.codeproject.com/Articles/675943/SSRS-2012-Forms-Authentication
https://github.com/ststeiger/SSRS-Localizer
https://github.com/ststeiger/CustomHttpHeaders
https://github.com/microsoft/Reporting-Services/tree/master/CustomSecuritySample

Возможно, вам потребуется войти в систему с помощью Form-Post в JavaScript и установить P3P-политику (в SSRS через модуль http), чтобы SSRS-auth-cookie сохранялся в IE в разных доменах ... (примечание: если вы используете виртуальные каталоги и у вас есть 2 приложения на одном SSRS, cookie-файл аутентификации из приложения1 [который находится в SSRS-домене] перезапишет cookie-файл аутентификации приложения2, который также находится в SSRS-домене)

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

Что касается аутентификации Windows, проблема в том, что у меня есть аутентификация пользователя с использованием аутентификации cookie в моих приложениях в ASP.NET Core, и обходной путь для получения доступа пользователей к отчету в основном заключается в передаче прямого URL-адреса с параметрами в href привязки и также выберите PDF в качестве формата. Я пытался найти способ не запрашивать аутентификацию у пользователя, потому что это раздражает конечного пользователя, который должен проходить аутентификацию дважды. Я уже использую конкретную учетную запись только для доступа к источникам данных, это одна из них.

Привет, @ststeiger, мой gitlab - арунпутран. Вы можете предоставить мне доступ, пожалуйста? огромное спасибо!

Публикуем это, потому что он был похоронен во всех запросах «дать мне доступ к gitlab».

Каждый, кто сталкивается с этой веткой, должен проголосовать за .NET Core SSRS, который будет добавлен здесь: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for -asp-net-core

Начал с 7-го сверху и поднялся на 4-е сверху, наиболее востребованная функция SQL Server (https://feedback.azure.com/forums/908035-sql-server?category_id=325159)

Изменить: из-за этого поста сейчас он занимает 3-е место

Не уверен, что это даже поможет ...

@arunputhrankyc : Добавлено.

@ k290 : Нет, как видите, темная тема для SQL Server Management Studio 2017 явно важнее: scream:: man_facepalming:: woman_facepalming:
Судя по всему, они еще не слышали о SQL-ops-studio / AzureDataStudio .

Я думаю, что в этом духе кто-то должен добавить плоский дизайн в список желаний, просто в шутку.
К сожалению, это еще не 1 апреля: wink:

кстати, я получаю отчеты в формате PDF из веб-API, и я не использую биты wcf.
просто вызовы мыла / asmx и вызовы http.
при их выполнении я сдаю верительные грамоты без каких-либо проблем.
мой код - asp.net 4.6 / web api 2
Если вы хотите увидеть, что я делаю, я могу выложить код на github на следующей неделе, чтобы вы могли его проверить.
Я звоню серверу отчетов 2016, но большая часть того, что я делаю, будет работать со старыми версиями SSRS.

Здравствуйте, я прочитал ваш комментарий, как вы обрабатываете SSRS. Я тоже делаю нечто подобное, у меня есть привязка к приложению ASP.NET Core, у которого есть URL-адрес непосредственно к отчету с включенными параметрами и расширением формата. Однако проблема в том, что он запрашивает аутентификацию Windows. Есть ли способ перестать спрашивать об этом, поскольку пользователи уже вошли в мое приложение с помощью проверки подлинности файлов cookie? Я даже не забочусь о том, чтобы показать отчет, пока он загружен, но было бы неплохо пропустить аутентификацию

@arunputhrankyc : Добавлено.

@ k290 : Нет, как видите, темная тема для SQL Server Management Studio 2017 явно важнее 😱 🤦‍♂ 🤦‍♀
Судя по всему, они еще не слышали о SQL-ops-studio / AzureDataStudio .

Я думаю, что в этом духе кто-то должен добавить плоский дизайн в список желаний, просто в шутку.
К сожалению, 1 апреля еще не наступило 😉

Ну, я бы наверняка убил темную тему для SSMS, но я бы съел свои голые руки для этого SSRS. Объем работы, сэкономленный за счет рендеринга сгруппированных данных непосредственно из SQL, впечатляет.

Отличное решение, добавьте меня в gitlab: @kholossok , спасибо

Добавьте меня тоже в gitlab: @EMaderbacher

@kholossok, @EMaderbacher: Added.

Добавьте и меня, пожалуйста, @jfcaldeira

@jfcaldeira : Вам нужно предоставить мне учетную запись git lab .
Это учетная запись git- хаба .
Это бесплатно. https://gitlab.com
В то время частные репозитории на github не были бесплатными.

@ststeiger
Частные репозитории теперь бесплатны на GitHub, ограничение на количество соавторов.

@jfcaldeira : Вам нужно предоставить мне учетную запись git lab .
Это учетная запись git- хаба .
Это бесплатно. https://gitlab.com
В то время частные репозитории на github не были бесплатными.

Я создал учетную запись с таким же именем пользователя

@jfcaldeira : добавлено. Вы должны были получить электронное письмо с информацией для доступа.
@ikourfaln : Я знаю. Однако не знал, что существует ограничение на 3 соавтора в частных репозиториях github. Приятно это знать, спасибо .

Ограничения Gitlab:

Чтобы отпраздновать сегодняшнюю хорошую новость, мы постоянно повышаем лимит хранилища для каждого репозитория на GitLab.com с 5 ГБ до 10 ГБ. Как и раньше, публичные и частные репозитории на GitLab.com не ограничены, не имеют ограничений на передачу и включают неограниченное количество соавторов.

Могу я тоже добавить? Моя учетная запись GitLab - barryjsilver. Благодаря!

Могу я добавить, пожалуйста? @jyanosu Спасибо!

@BarryJSilver : Добавлено.

@jyanosu : мне нужна учетная запись git lab .com, а не github.

@ststeiger Ой , просто настрой ... то же имя пользователя

@jyanosu : Добавлено.

@ststeiger, можешь добавить мою учетную запись gitlab @ kanichi123
Спасибо!

@ kanichi123 : Добавлено.

@ststeiger, пожалуйста, мой аккаунт тоже sheryever

@sheryever : Добавлено.

@ststeiger, пожалуйста, добавьте мою учетную запись gitlab @PentaTech
Спасибо!

@ststeiger, не могли бы вы добавить меня? @glebteterin
Спасибо!

@PentaTech , @ g-rad: добавлено.

@ststeiger хорошие усилия, не могли бы вы добавить учетную запись gitlab brad0000?

@ brad0000 : Готово.

Привет, @ststeiger , не могли бы вы добавить меня? учетная запись gitlab: wyepez. благодаря

@wyepez : Добавлено.

@ststeiger Не могли бы вы добавить и меня?

Имя пользователя Gitlab: choudeshell

@choudeshell : добавлено.

Не могли бы вы добавить меня? Благодаря!

Ваше решение работает с .rdlc (а также с .rld на стороне сервера)? благодаря

Ваше решение работает с .rdlc (а также с .rld на стороне сервера)? благодаря

@mpirritano : Да, на самом деле между RDL и RDLC нет большой разницы.
Но это только Интернет. Нет Windows-Forms.
Чтобы добавить вас, мне нужна учетная запись git lab , а не github.

@ststeiger Спасибо - я создал учетную запись GitLab: @mdpirrit

Это здорово - мне это нужно только для ASP .NET Core, ориентированного на .NET Core. Благодаря!

@mpirritano : добавлено, вы должны были получить письмо на адрес электронной почты, который вы использовали для регистрации gitlab.

Понял; благодаря!

@ststeiger отлично работает, за исключением того, что не может отображать диаграммы. - отображает область диаграммы с ошибкой: " Не удалось загрузить файл или сборку" System.Windows.Forms, Version = 4.0.0.0 "

Это известное ограничение или я что-то упускаю?

благодаря

@ststeiger Кроме того, похоже, что подотчеты не поддерживаются. то есть, похоже, нет обработчика событий обработки вложенного отчета для добавления источников данных в экземпляр вложенного отчета

благодаря

Не могли бы вы добавить меня? Благодаря! @ashabyralieva

Работает ли ваше решение с .rdlc (а также со стороны сервера .rld)? Спасибо

@mpirritano : Да, на самом деле, между RDL и RDLC нет большой разницы.
Но это только сеть. Нет Windows-форм.
Мне нужна учетная запись Git Lab, чтобы добавить вас, а не GitHub.

Можете ли вы добавить меня? Спасибо! @ashabyralieva

@azikaa : Готово. Добавлено;)

@mpirritano :

Это известное ограничение или я что-то упускаю?

Да, одно ограничение, о котором я знал, могло существовать.
Кроме того, у него есть проблема с выводом изображений в HTML.
Открытые точки.
Я пока даже не думал о вложенных отчетах.
К сожалению, у нас их тоже несколько, так что это тоже будет моей проблемой.
Говоря об этом, я даже не знаю, как подотчеты обрабатываются в обычном ReportViewer на полной платформе, особенно потому, что они могут быть рекурсивными.

Вероятно, где-то есть проблема, потому что «System.Windows.Forms, Version = 4.0.0.0» не существует в этой версии в .NET Core, а также сборка называется System.NetStandard.Forms вместо этого в ReportViewer для .NET Core. Может работать на полной структуре, потому что существует System.Windows.Forms, Version = 4.0.0.0.

Проблема с System.Windows.Forms, вероятно, может быть решена так же легко, как размещение имени сборки и версии (где бы она ни пряталась в исходном коде) в ifdef, а не в подотчетах, я думаю.

На этой неделе мне все еще нужно завершить службу отправки отчетов, так что, возможно, я смогу взглянуть на проблему System.Windows.Forms на следующей неделе.

Что касается вложенных отчетов: они все равно плохая идея, имеют тенденцию создавать проблемы с PDF и Excel, и, если у вас есть только 1 отчет, я бы рекомендовал посмотреть, невозможно ли каким-то образом каким-то образом полностью удалить вложенный отчет. , и сделать все, что содержится в одном отчете.

Добавлено
Как получить базу данных COR_Basic_SwissLife_UAT?

: rofl: Ха-ха, молодец, не знаешь, эта БД конфиденциальна.
Но вы можете составить свой собственный пример отчета, используя свою собственную базу данных.
Вы должны увидеть на примере, как его использовать.

@ststeiger Спасибо. На самом деле я вижу, что в AsNetCore.Reporting.InternalLocalReport есть событие SubreportProcessing. Я могу попробовать создать для этого общедоступный интерфейс и посмотреть, смогу ли я передать источники данных во вложенные отчеты. Возможно, я не дойду до этого до следующей недели ...

Я также стараюсь избегать вложенных отчетов, но считаю их необходимыми в тех случаях, когда вам нужен повторяющийся раздел внутри повторяющегося раздела. Что касается Excel, можно отобразить каждый экземпляр подотчета как рабочий лист в Excel с помощью rdlc / rdl

Репост для новичков.

Все участники этой ветки должны проголосовать за добавление этого предложения здесь: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- ядро

В марте этого года он был 7-м сверху.

Теперь у нас есть второе место в списке предложений SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Сможем ли мы победить темный режим?

@ststeiger Сегодня у меня было немного времени, и я смог успешно визуализировать отчеты с вложенными отчетами в форматах .docx, .xlsx и .pdf.

В качестве быстрой проверки моей локальной копии я изменил модификатор доступа свойства localReport класса LocalReport с «internal» на «public». Затем я мог бы написать обработчик для события «SubreportProcessing», как всегда (где я бы прочитал значение параметра в экземпляре вложенного отчета и использовал его для фильтрации набора данных, который я передал бы в источник данных экземпляра вложенного отчета)

Я понятия не имею, как исправить проблему отрисовки диаграмм с помощью .NET Core; так что, если вы когда-нибудь сможете найти решение, это будет потрясающе. Но кроме этого, я думаю, что ваше решение делает все, что мне нужно (я лично никогда не отображаю отчеты в формате HTML)

благодаря

экспорт- словом, excel не работает?
FormatException: заголовок содержит недопустимые значения в индексе 0: ''

обслуживание очень медленное. что можно сделать? Пожалуйста помоги....

Привет всем, я только что закончил писать настраиваемый порт элемента управления средства просмотра отчетов с использованием ReportExecutionService.asmx, встроенного в SSRS, и я ориентировался на ASP.NET MVC. Мне кто-то предлагал перенести его на .NetCore и MVC, поэтому я закончил. Попробуйте и дайте мне знать, что вы думаете: https://github.com/alanjuden/MvcReportViewer

Алан

экспорт- словом, excel не работает?
FormatException: заголовок содержит недопустимые значения в индексе 0: ''

обслуживание очень медленное. что можно сделать? Пожалуйста помоги....

@azikaa : Вы используете MvcReportViewer или AspNetCore.ReportViewer?

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

@ k290 «s ответ является наиболее действенные один здесь, поэтому , пожалуйста , следуйте его предложение здесь :

Репост для новичков.

Все участники этой ветки должны проголосовать за добавление этого предложения здесь: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- ядро

В марте этого года он был 7-м сверху.

Теперь у нас есть второе место в списке предложений SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Сможем ли мы победить темный режим?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги