Aspnetcore: Informes principales de Asp.Net (SSRS)

Creado en 2 jun. 2016  ·  269Comentarios  ·  Fuente: dotnet/aspnetcore

Estoy trabajando en la aplicación ASP.NET Core y no puedo encontrar una solución para mostrar informes SSRS. Con las ausencias de "Microsoft.Reporting.WebForm" ya no funciona. ¿Cuál es la mejor práctica para mostrar informes SSRS en la web en ASP.NET Core?

External

Comentario más útil

Casi 2 años. Se lanza Core 2.0. Equipo SSRS, despierta.

Todos 269 comentarios

Con Core todavía en RC (RTM a fin de mes), no creo que se planee un escenario SSRS dentro de los próximos 6 meses, pero no soy parte del equipo.

Generaría esos informes en el lado del cliente utilizando algunas bibliotecas de JavaScript o generaría previamente esos informes.

Si necesita algo más "integrado", puede consultar este paquete comunitario:

https://github.com/ilich/MvcReportViewer

Por el aspecto del problema https://github.com/ilich/MvcReportViewer/issues/121 , están interesados ​​en integrarlo pero sin éxito hasta ahora.

No entiendo por qué las iniciativas centrales de dotnet y ASP.net guardan silencio sobre este tema en todos los anuncios anteriores. Es como
[La generación de informes no es una preocupación importante para los desarrolladores y pueden lidiar con ella usando html y clases css de impresión]
Actualmente estamos migrando un pequeño erp con muchos archivos ssrs rdlc y el enfoque css no está haciendo ningún bien en los informes de navegadores cruzados.
por otro lado, la semana pasada microsoft lanzó ssrs 2016 con visor html5 puro que eliminó la necesidad de instalación de activex [que era el único inconveniente de usar ssrs en navegadores que no son ie]
El visor ssrs 2016 encaja perfectamente en el sistema eco central de asp.net perfectamente
pero no se declaró ninguna declaración oficial con respecto al soporte principal de asp.net.

¿Está todo bloqueado por System.Drawing? porque incluso itextsharp no había lanzado una biblioteca hasta ahora.
si es System.Drawing, al menos la implementación de Windows se puede completar antes [linux y OSX] para aumentar la adopción por parte del desarrollador de Windows actual en lugar de esperar la implementación multiplataforma completa para System.Drawing

Espero que esta publicación haga que el equipo reconsidere algunas prioridades para habilitar ssrs dentro del núcleo de asp.net

con respecto a MvcReportViewer mencionado en la publicación anterior (es un envoltorio alrededor del visor de formularios web) y ayudó a muchos desarrolladores de mvc en el pasado a superar la falta de visor de informes de mvc en mvc1 a mvc5 [Muchas gracias ilich], espero ver una solución completa porque ssrs no era una prioridad de primera clase y la gente se mantenía bastante al respecto en mvc pre-core.

Por favor, desarrolladores
reenvíe este tema a sus colegas para que puedan comentarlo.
esto podría darle una prioridad y motivar al equipo a hacer algo.

@ ddddddddeee22211 Es un V1.

Inicialmente, no envía con soporte SSRS. El soporte con SSRS probablemente provendrá del equipo de SSRS y no del equipo de .NET. Dado que aún no nos hemos quedado sin RC, no veo esto como una característica crítica en V1.

Si necesita hacer informes, ¿puedo recomendarle que ejecute la versión de formularios web? Si. Es viejo. Pero al menos funciona y es compatible.

Si necesita informes de X-Plat, le recomendaré algo como Chartist . Le permite generar gráficos directamente en el cliente. Agregue un archivo CSS para fines de impresión y auge. Tiene informes que se pueden imprimir.

desde tu perspectiva, puede que no sea crítico
pero algunos otros desarrolladores lo están considerando muy importante para sus proyectos porque una vez que desarrollan una aplicación y la ponen en funcionamiento, las tareas de desarrollo se retienen y las tareas de informes se convierten en tareas de rutina diaria. También algunos proyectos manejan la creación de informes para el equipo de BI (inteligencia empresarial) que sabe cómo usar SSR pero no tiene una idea sobre el núcleo de asp.net.

el objetivo de mi publicación era comprender la posición de las SSR dentro del ecosistema central de asp.net. o si se ignorará como en mvc1 a mvc5. El equipo de SSR está dentro de microsoft y el equipo central de asp.net puede discutir el problema con ellos.
Lo que me volvió loco fue cuando vi la nota de lanzamiento de SSR 2016 la semana pasada sin mencionar nada sobre el núcleo de asp.net. mientras que, por otro lado, ve un soporte continuo para azure dentro de asp.net core. Créame, si no aumentamos la demanda de ssrs, se ignorará como en el mvc 5 anterior.

su consejo sobre el uso de formularios web es un ejemplo sobre cómo ralentizar la adopción de la iniciativa central. al menos si tuviera una declaración sobre si será compatible o no, podré tomar decisiones estratégicas al respecto.

gracias por el consejo del chatista. Lo comprobaré y espero que hayas entendido mi punto de vista.

@ ddddddddeee22211 Ahhh ... entonces no puedo responder.

En este momento, la única forma de hacer que los componentes SSRS funcionen en ASP.NET es en WebForms.

Si desea su posición estratégica o si la apoyarán, tendremos que esperar a que responda un empleado de MS.

¿Quizás podamos / cc @coolcsh ? Puede que no responda aquí, pero una publicación de blog aclarando la posición estaría bien.

En el equipo de SSRS somos conscientes de las limitaciones de ASP.NET WebForms y estamos investigando y trabajando activamente en nuevas opciones para el control del Visor de informes.
Gracias

@jtarquino

¡Gracias por la respuesta, hombre!

Queríamos una alternativa desde MVC. : pegado_en_la_tongue_winking_eye:

Eso acaba de alegrarme el día. [~ final feliz ~]
Gracias @jtarquino , @MaximRouiller por todo el esfuerzo.

@jtarquino
Eso suena genial :-)

¿Puede decir algo acerca de cuándo espera lanzar la primera versión de la "nueva opción" para el Control del visor de informes?
(¿Existe alguna hoja de ruta / plan para esto?)

Br.
Boe

Desafortunadamente, no tengo una línea de tiempo para compartir en este momento.

¿Ha intentado usar una biblioteca instalando un paquete en la consola del administrador de paquetes y escriba el siguiente comando en la ventana de comandos?

PM> Paquete de instalación ReportViewerForMvc
aunque probé formularios web y se ven bastante bien.

untitled

@bethwellagat
de nuevo dispara el error " la dependencia ReportViewerForMvc no es compatible con el framework .NetCoreapp "
notas:
trabajando en el proyecto ASP.NET Core

@jtarquino ping en esto. Parece que hay más interés: https://github.com/aspnet/Mvc/issues/5332

@jtarquino Por cierto, si desea iniciar algunas conversaciones con mi equipo, envíeme un correo electrónico y podremos charlar.

Ohhh me gusta! ¡La pelota está rodando! 😀

Hola a todos, acabo de terminar de escribir un puerto personalizado del control del visor de informes utilizando ReportExecutionService.asmx que está integrado en SSRS y estaba apuntando a ASP.NET MVC. Alguien sugirió portarlo a .NetCore y MVC, así que lo completé. Pruébelo y háganme saber lo que piensan: https://github.com/alanjuden/MvcReportViewer

Alan

Parece que han pasado unos tres meses desde que ReportViewer en ASP Netcore MVC se discutió aquí. Estoy trabajando con la versión que Alan Juden ha proporcionado en un proyecto que estoy moviendo de WinForms a netcore. ¿Hay alguna señal de que Microsoft se está esforzando para proporcionar soporte SSRS ReportViewer de primera clase o han puesto SSRS en el mismo armario en el que pusieron Visual FoxPro hace unos años?

¿Algún progreso de EM? La mejor opción por ahora es utilizar una herramienta de terceros como Telerik Reports para la representación del navegador y el backend SSRS para las suscripciones de informes. Tal vez, como escribió ddddddddeee22211, SSRS 2016 ya tiene capacidad a través del motor de renderizado HTML5 pero no existe documentación.

Hola @Eilon.

¿Alguna noticia desde septiembre? Especialmente desde que ustedes lanzaron 1.0 (¡felicidades!), La presión debe bajar un poco.

¿Algo que puedas compartir?

/ cc @jtarquino

Nada que pueda compartir todavía, tan pronto tenga noticias para .NET core, serás el primero en saberlo.
Como mencionó, acabamos de lanzar el último nuget para ASP.NET Webforms y el control Winforms

También me gustaría agregar mi mensaje al equipo ... Este es un problema importante. Aprecio la solución de AlanJuden, pero necesitamos una solución "oficial" ... Dado que el núcleo 1 ha estado fuera durante meses, sería útil tener alguna información sobre el estado de esto. Si pudiera informarnos sobre la línea de tiempo para una solución, sería algo. Este problema es lo suficientemente grande como para evitar que usemos mvc core. Una nota. Realmente necesitamos una solución que evite la necesidad de que los usuarios inicien sesión en el servidor ssrs. Esta es la razón por la que mi proyecto tiene que usar el visor de informes actual (al usar el visor de informes, el proyecto mvc proporciona un inicio de sesión estándar en el servidor ssrs para todos los usuarios)

SQL Server 2017 es Community Preview2 ahora
Y
El lanzamiento de .net estándar 2.0 está cerca con el último anuncio
Y todavía no hay noticias sobre el visor del servicio de informes central nativo de asp.net
Invite a otros desarrolladores a este tema para que den sus comentarios y hagan que el equipo sea consciente de la necesidad de un esfuerzo de este tipo para un marco de obra maestra con el que sueña todo desarrollador.

@jtarquino : ¿hay un foro o una voz de usuario para SSRS?
¿Cómo pueden los usuarios ponerse en contacto con el equipo de SSRS?

Gracias, realmente me gustaría obtener ayuda para hacer que mi nueva aplicación funcione con SSRS.
¿Hay alguna forma de obtener el código utilizado por el control de formularios web para que se rompa una página aspx?
Me gustaría ver si puedo hacer una vista angular 2 que "funcione como" y "se parezca" al control de formularios web.

Hola,

Estamos buscando migrar algunos de nuestros sitios web, etc. al núcleo de asp.net, pero algunos incluyen un control de visor de informes SSRS. ¿Hay algún progreso en el control del visor de informes para .net core?

Gracias
Tim

Si su objetivo es Full .NET 4.xy no .NET Core, tenga en cuenta este número 2022 antes de pasar a ASP.NET Core.
ASP.NET Core 2 no admitirá .NET 4.x completo

@ikourfaln. Más bien es un punto discutible en esta etapa, ya que no hay un visor de informes en el núcleo de asp.net para romper. Con los próximos cambios en el tercer trimestre en asp.net core 2, así como .net estándar 2 con las calzas de compatibilidad que permiten apuntar al .net framework, creo que es muy poco probable que Microsoft escriba un visor de informes para el actual asp.net core. 1.1.

Actualmente intenté ingresar a las extensiones de autenticación para SSRS y descubrí que era un verdadero lío intentar cambiarlo, puede ingresar una nueva autenticación / inicio de sesión, pero luego, cuando intenta habilitar CORS para que una aplicación web pueda llamar a SSRS para ejecutar un informe, el navegador no puede obtener una solicitud de verificación previa OPTIONS para que funcione y eso termina con toda la idea.

así que ahora estoy creando una aplicación web de formularios web a la que estoy agregando compatibilidad con OpenId Connect para que pueda tener SSO funcionando entre mi nueva y brillante aplicación angular y mis informes

luego veré si puedo unirlos de alguna manera con la piratería de iframes o algún otro medio.

Desearía que microsoft actualizara ssrs para jugar mejor con la nueva tecnología web.

otra línea de pensamiento: KPI de SSRS e informes móviles: ¿hay alguna forma de usarlos en una aplicación web?

@alanjuden ¿ Alguna posibilidad de configurar su paquete para habilitar la representación de informes rdlc? Instalar Reporting Server y administrarlo para cada cliente es una verdadera molestia.

@IonRobu , puede que esté loco ... ¡pero no estoy tan loco! :PAGS

La verdadera razón por la que no lo haré es porque solo he creado el visor frontal del visor de informes. Confío completamente en SSRS para generar el informe y devolverme los datos del informe a través de la API de SSRS. Por lo que requiere tener el servidor de informes backend. Lo siento, pero eso sería mucho más trabajo del que espero hacer en este proyecto. Creé mi MvcReportViewer como una solución fácil para sortear los problemas de traer la versión ASP.NET WebForms del control en.

Servidor de informes o RDLC que se denomina "informes de clientes"
servidor de informes es más trabajo para configurar y administrar sí, eso es cierto.
pero tiene una serie de beneficios:

los informes se procesan en un servidor back-end, que elimina la carga de trabajo de los servidores web front-end.
los resultados de un informe se pueden cobrar y eso puede reducir la carga de trabajo de su servidor SQL de producciones.
Los informes complejos se pueden ejecutar en un horario y trabajar en un momento en que hay pocos usuarios en el sistema y
las solicitudes se pueden servir desde esa instantánea precompilada.
También al usar SSRS, las cadenas de conexión del servidor SQL permanecen en el servidor de informes y no es necesario administrarlas en el archivo de configuración del servidor web.
Además, el servidor SSRS se convierte en un punto central en el que los autores de informes pueden publicar y todos los usuarios pueden obtener los informes del servidor.
SSRS puede configurar el envío automático de informes por correo electrónico a los usuarios, puede enviar por correo electrónico un enlace al servidor de informes para algunos usuarios y un archivo PDF, Word o Excel para otros.

También escalando, si necesita atender a más usuarios, es posible que deba agregar más servidores web antes de necesitar más servidores de informes, no necesita copiar grandes cantidades de archivos rdlc a todos los servidores web.

así que sí, si solo tiene unos pocos informes y no necesita ninguno de los beneficios, puede optar por rdlc.
pero para un sistema más grande que necesitará entregar muchos informes a muchos usuarios, el servidor SSRS tiene algunos beneficios realmente buenos.
Además de que la API de SSRS es muy poderosa para trabajar, puede llamar a la API para devolver un informe en PDF, por ejemplo, sin la necesidad de tener formularios web del lado del cliente o controles de visor de mvc.
la api también puede administrar los informes, subirlos al servidor, establecer permisos y enumerar los informes.
En el trabajo, estoy usando la API para permitir que nuestra aplicación cliente enumere los informes que el usuario puede ejecutar, para verificar los parámetros que necesita el informe y luego ejecutar el informe para el usuario.

así que eche un vistazo a los beneficios, no solo a los gastos generales de administración.

@figuerres
Los informes de los clientes se destacan en un contexto diferente al que describió
Muchos clientes no utilizan el servidor de informes y no cuentan con personal calificado para administrar y mantener sus problemas.
Además, cuando envía un producto con informes personalizados (más de 60) para cada cliente, se enfrenta a una sobrecarga de implementación de aplicaciones + informes de implementación
Muchos usuarios no son técnicos que puedan comprender los informes generados por el servidor y renderizados según la respuesta sin tener una vista previa de ellos primero (la factura, por ejemplo, se puede verificar a través del visor fácilmente que descargar múltiples facturas corregidas en diferentes pestañas)

Como puede ver, es fácil para el usuario adaptarse a un visor de informes simple que a escenarios complejos
También se desarrollaron y dedicaron innumerables esfuerzos a desarrollar informes de clientes y ahora se vuelven inútiles en su verdadero uso

Espero que el equipo de Microsoft comprenda nuestro dolor

No estoy seguro de haber entendido todo lo que dijo, pero sí, los informes de los clientes son útiles, solo estaba describiendo las razones del servidor, por qué valdría la pena analizarlo. Su kilometraje puede variar y todo eso.

hoy se lanza net Standards 2 con más superficie api para system.drawing
¿Podría ser esta una oportunidad para unas palabras del equipo de srss sobre el visor de ssrs para el núcleo de asp.net?

Mi empresa depende en gran medida de los documentos de exportación de informes RDLC en formato PDF. No poder hacer esto en .net core es básicamente un bloqueo para nosotros al usar .net core y ejecutar en otras plataformas como Docker.

Espero que cada programador anime a sus colegas a comentar sobre este tema aquí.

Para aquellos que todavía buscan una solución:
Si Java está instalado, también puede incrustar Eclipse BIRT o JasperReports.
De los dos, JasperReports es definitivamente la mejor alternativa de SSRS (un poco más complicada, pero también mucho más poderosa / perfecta en píxeles).
Tiene un servidor de informes independiente e integrable, capaz de acceder a cualquier fuente de datos JDBC y también a BigData como Cassandra o Apache Spark (SparkSQL).

Proporciona informes y análisis que pueden integrarse en una aplicación web o móvil, además de funcionar como un centro de información central para la empresa al entregar información de misión crítica en tiempo real o programada al navegador, dispositivo móvil o bandeja de entrada de correo electrónico. en una variedad de formatos de archivo.

Puede realizar una implementación autónoma del tiempo de ejecución de Java proporcionando BIRT / Jasper a través de Launch4j.

@jtarquino ¿ alguna buena noticia para .Net Core?

No puedo creer que esto siga siendo un problema unos 15 meses después de que se planteó. Muy decepcionado.

Realmente necesitamos que esto funcione, incluso un simple punto en SSRS, ReportName y Params, abierto en DIV o algo así. Hemos invertido mucho tiempo en la creación de informes SSRS en SQL directamente y necesito una forma de mostrarlos en una aplicación Core2.0 MVC simple.

¿Algun consejo?

@cgountanis , esto funciona para mí:
https://github.com/aspnet/Home/issues/1528#issuecomment -259169426

@cgountanis
¿Necesita un pdf del informe o informes interactivos completos como muestra el portal web?

Puedo darte algunos principiantes sobre cómo los hago desde una aplicación angular

Esto es lo que estoy haciendo. Utiliza las credenciales del cliente que pueden no funcionar para la mayoría.
Cambiar el tamaño de la página más grande funciona, no hacerlo más pequeño.


<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>

una cosa es usar los servicios web del servidor de informes, de ellos puede obtener listas de informes, carpetas y fuentes de datos, etc. y usar esos datos para crear su propio portal / menús de informes y administrar qué informes pueden ver los usuarios tu aplicación.
Creamos un conjunto de usuarios de Windows en el servidor de informes y los usamos para limitar los informes que reciben,
asignó el rol de los usuarios de la aplicación a un usuario del servidor de informes.

cuando ejecutamos un informe, pasamos al usuario del servidor de informes como el usuario que está ejecutando el informe, algo que apesta, ya que eso significa que perdemos el "usuario real" a menos que lo registremos en nuestro código.
pero eso se ocupa de la dependencia del servidor de informes de las cuentas de usuario de Windows. si lo actualizaran para usar un token jwt y obtener roles del token, las cosas serían mejores para nosotros.

usamos un iframe para poner el control de formularios web en una vista angular de la aplicación, tampoco es la mejor, pero funciona.
el usuario realmente no puede ver los trucos detrás de escena que hacemos.

@ ctrl-brk Tengo este problema con Core 2.0, tal vez me perdí algo. https://github.com/alanjuden/MvcReportViewer/issues/43

@steelwil Gracias, pero necesito NetworkCredential personalizado.

@figuerres Mostramos informes de un SSRS con firewall, la aplicación WebForm hizo todo el trabajo duro con SSRS.ReportViewer, no solo para los usuarios de Windows. De acuerdo, JWT estaría bien. Los ejemplos serían geniales, tratando de igualar la funcionalidad ReportViewer que teníamos con WebForms / NUGET.

¡Gracias a todos!

Eventualmente lanzarán un NUGET oficial para esto, ¿verdad?

@cgountanis El "ellos" es el equipo de SQL Server, no el equipo de ASP.NET Core. Ahí yace el problema. Es un equipo diferente.

@giddev, la verdadera pregunta aquí es si este otro equipo al que te refieres todavía existe en Microsoft y tiene desarrolladores activos que todavía trabajan en el equipo y si están lo suficientemente orgullosos de su trabajo como para producir y publicar una solución de primera clase para incrustar SSRS. informes en una aplicación web ASP.Net Core 1 o 2. ¿Tienen una hoja de ruta publicada? ¿ASP.Net Core es parte del plan o se ha abandonado SSRS y se ha reemplazado con el material de POWER BI? Estoy empezando a ver señales de que SSRS se dirige al mismo agujero de rata en el que cayó Microsoft Visual FoxPro.

@wqwalter algo así .....
Tengo la impresión de que Microsoft tiene muchos equipos que siguen su propio mapa y no muchas personas se aseguran de que tengan un conjunto común de entregables y comunicación entre ellos.
es como arrear gatos, todos despegan en diferentes direcciones ...

si eso está mal, bueno, así parece.

Me cuesta creer que abandonarían SSRS, ya que los desarrolladores lo utilizan mucho ahora que Crystal Reports no es popular.

@cgountanis
Por mucho que me gusten algunas cosas de Microsoft, he visto una historia de 20 años en la que se detienen repetidamente los productos y hacen cosas que desafían mi comprensión. un ejemplo fue Virtual PC, adquirido por Microsoft, vendido por Microsoft por un tiempo, luego lo liberaron, luego lo mataron.
ese es solo uno de los muchos casos así ...

Escuché hablar sobre Power BI y algunos rumores de que podría ser el nuevo SSRS con el tiempo.
No estoy seguro si eso es seguro o solo un chisme. seguiría el modelo de impulsar los servicios basados ​​en Azure.

Me encanta ver que SSRS admite la autenticación basada en web, preferiblemente OpenID Connect, lista para usar. Un paso más allá: sería increíble si SSRS fuera un nuget para ASP.NET Core. Programación de informes y administración de usuarios: tal vez proporcione un proyecto de muestra, pero estaría bien si desarrollara esa parte con la documentación de la API de SSRS.

@Morgma
¡convenido!
OIDC encajaría perfectamente con lo que estoy haciendo.
los roles deben realizarse para que podamos proporcionar un mapeo de los roles del servidor de informes a nuestros roles de aplicación.

ahora mismo tengo una aplicación que está usando OIDC con un front-end Angular 4/5 que tiene que cargar una página de informes de formularios web en un iFrame y tiene que usar cuentas de usuario de Windows para controlar los permisos, así que si consulto la base de datos del servidor de informes, puedo En realidad, no veo qué usuarios ejecutan los informes. es un kluge que podemos usar pero lejos de ser ideal.

Este también es un problema importante para nosotros y realmente no puedo creer que todavía no hayamos escuchado NADA de Microsoft sobre esto. En este momento, nos hace considerar seriamente opciones que no son de Microsoft. Si al menos tuviéramos un cronograma, podríamos tomar una decisión informada.

Estoy de acuerdo, he seguido la ruta de usar ReportServer / ReportExecution2005.asmx directamente solo para que la exportación funcione directamente. Funciona muy bien cuando se aloja en IIS y obtiene errores extraños.

Ha sido frustrante.

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

ese error dice que falta el encabezado para la autorización, la solicitud http debe incluir el encabezado. ¿Solo la llamada es un problema?

Funciona bien hasta que esté alojado en IIS. Incluso mi máquina de desarrollo está hablando con el mismo servidor de informes y funciona, pero una vez publicado y alojado con II, aparece ese error. Creo que lo que está diciendo es que el servidor está respondiendo con algún tipo de error vacío, pero lo estoy enviando todo.

Recuerde que IIS Express se ejecuta con sus credenciales de usuario, por lo que el doble salto probablemente esté bien. Lo que probablemente está sucediendo es que no tiene Kerberos configurado en su servidor IIS e incluso si tiene la delegación activada, su informe no funcionará porque el informe se ejecuta de forma anónima.

Respuesta corta: no puede usar la delegación sin la configuración de Kerberos, que requiere la configuración en su controlador de dominio para la cuenta con la que se ejecuta el grupo de aplicaciones IIS.

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

Sé que este no es el lugar correcto, pero quería hacer un seguimiento. Hosting Core en IIS, no importa lo que establezca la configuración de IIS. Solo para S&G, hice el administrador de usuarios de appPool y funcionó. Imagínese ... Esto es sin configuraciones de autenticación de IIS habilitadas que no sean Anónimo. ¿Alguien explica esto? ¿Necesita acceder a una biblioteca para WCF en Core para la que necesita acceso especial? ¿Lo que da? ESTOY CONFUNDIDO ... y preocupado por la seguridad.

@cgountanis ¿puedes abrir un nuevo número con tu pregunta?

@jtarquino ¿Tiene alguna actualización para la línea de tiempo sobre el lanzamiento de un visor de informes basado en .net core? Estoy desesperado por tener al menos una línea de tiempo. ¿Estamos hablando de 6 meses? ¿12 meses? Básicamente, nos enfrentamos a la decisión de abandonar todos nuestros informes SSRS actuales e ir con otra solución, ya que no tenemos ninguna alternativa ni un cronograma de disponibilidad.

@ExcaliburVT está en nuestra cartera de pedidos, sin embargo, no tengo una línea de tiempo que pueda proporcionar en este momento.

El código abierto de

esta es el área donde la migración de Microsoft no es tan grande. Si nosotros, como clientes, no podemos obtener las respuestas correctas, ¿cuánto tiempo seguiremos regresando?

este mismo tipo de cosas está sucediendo en varios productos, no solo en este. ¿Por qué debería recomendar a mis gerentes que otorguen una licencia para la próxima versión de SQL Server y SSRS si no podemos obtener las actualizaciones que necesitamos para administrar el negocio?

@jtarquino Tengo que estar de acuerdo con @figuerres ya que, literalmente, acabo de pelear una batalla de 3 meses para obtener la aprobación para usar SQL sobre Oracle y descubrir que uno de mis puntos de venta clave no tiene soporte nativo. Estaba criticando a Oracle por no tener un controlador .Net Core disponible y al menos tenían una fecha de lanzamiento anunciada. SSRS es su propio producto y está completamente atrasado dos generaciones sin ni siquiera una fecha propuesta para la resolución.

El uso del nuevo servicio de conector WCF VS2017 (Core 2) le permite exportar los informes con parámetros a PDF, Word, Excel, CSV ... bastante fácil si desea ayuda antes de que se lance este paquete de visor NUGET. Sí, tienes que usar ReportExecution2005.asmx que viene con SSRS, pero también lo hará lo que creen. Decidimos deshacernos del aspecto del visor por ahora y descargar archivos directamente.

Editar: El único problema es enfrentarse a los permisos de AppPool que mencioné anteriormente.

por cierto, obtengo informes en formato pdf de una API web y no utilizo ningún bit de wcf.
solo llamadas soap / asmx y llamadas http.
al hacerlos paso credentails sin ningún problema.
mi código es asp.net 4.6 / web api 2
Si quieres ver lo que hago, puedo poner un código en un github la próxima semana para que lo revises.
Estoy llamando al servidor de informes 2016, pero la mayor parte de lo que estoy haciendo funcionará con las versiones anteriores de SSR.

¿Algo nuevo para Core 2 con SSRS (RDLC Designer)?

@figuerres si ha puesto algún código en la solicitud de github para compartir el enlace.

@apondu
publicará la próxima semana, no en la oficina hasta entonces. nadie pidió código hasta ahora.

Estoy trabajando en una aplicación de intranet Angular5 / .NetCore2 MVC5 (pila RC actual de MS), estamos usando SSRS 2012 y necesitamos crear suscripciones de informes basados ​​en el tiempo para los usuarios que no son la cuenta de Windows registrada.

@figuerres ¿ Quizás tienes algunas ideas?

Puede usar SSRS y el servicio de ejecución de informes que está integrado para escupir archivos PDF durante todo el día.

@cgountanis Gracias por una respuesta tan rápida, me ayudaste a darme cuenta de que no era lo suficientemente descriptivo / preciso al describir lo que tengo que hacer. Actualicé mi comentario original para que diga "crear suscripciones a informes basados ​​en el tiempo"

Hmm, creo que hice algo así al insertar filas de programación de suscripción directamente en la base de datos de informes (adiviné cómo funcionaba el servicio de suscripción en función de la tabla y las filas existentes).

@ExcaliburVT He usado la API SOAP y un SP grande para interactuar con la base de datos hasta ahora, y me gustaría evitar modificar la base de datos directamente. Me alegra saber que hay una opción alternativa.

¿A qué te refieres con basado en el tiempo?

¿necesita ejecutar un informe en un momento determinado?
¿Necesita ejecutar un informe cuando un usuario hace algo?

@figuerres basado en el tiempo, es decir, en un horario recurrente, como todos los miércoles a las 8 a. m.

Sí, no pude encontrar una manera de hacerlo sin insertar un registro manualmente al menos de regreso a SQL 2012. Si recuerdo bien, no tiene que modificar el esquema ni nada, simplemente inserte una fila en la tabla de suscripciones y pude para enviar un informe a un grupo de distribución de esa manera.

bien, entonces el portal del servidor de informes puede ejecutar un informe en un programa planificado, puede guardarlo en un archivo o enviar un correo electrónico cuando llegue ese momento.
no es necesario que nadie inicie sesión cuando se ejecuta.

simplemente crea la suscripción desde el portal.

También puede hacer eso desde la API de soap, pero no estoy seguro del conjunto exacto de llamadas de API que se deben realizar.

Permítanme dar más contexto antes de hablar sobre lo que he visto en soapAPI.

Estoy escribiendo una aplicación web que usa la soapAPI SSRS y credenciales como "ssrsReportWebAdmin". En desarrollo en este momento, "ssrsReportWebAdmin" tiene todos los roles de seguridad, pero según la documentación, parece que el rol de Administrador de contenido es el que se necesita. Un usuario utilizará la aplicación web para crear suscripciones para otras personas y enviar esas solicitudes a través de soapAPI.

La llamada CreateSubscriptionAsync devuelve un error que indica que el usuario no tiene permisos.

Entonces, al llamar a la API, está pasando un objeto de crédito para el usuario "ssrsReportWebAdmin" que tiene todos los roles, pero obtiene un error de que no tiene permiso. interesante....

por lo que he leído, SSRS está configurado para que la única persona que puede crear suscripciones estándar (recurrentes, basadas en el tiempo) es el propio usuario. Las suscripciones basadas en datos se pueden configurar mediante el rol de Administrador de contenido.

Ver ContentManagerTasks - Administrar todas las suscripciones
https://technet.microsoft.com/en-us/library/ms159693 (v = sql.105) .aspx

Vea la primera oración debajo del encabezado que comienza "Reporting Services admite dos tipos de ..."
https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/subscriptions-and-delivery-reporting-services#bkmk_standard_and_datadriven

@figuerres @ExcaliburVT
Pude crear suscripciones estándar tanto para el correo electrónico como para los archivos compartidos utilizando una cuenta de AD con el rol de Administrador de contenido SSRS. Por lo que puedo ver, el problema de permisos con el que me encontré el viernes fue un efecto secundario de un parámetro MatchData en blanco / mal formado.

Casi 2 años. Se lanza Core 2.0. Equipo SSRS, despierta.

@ codehippie1 no seas tan grosero. todos somos seres humanos aquí. ¡crecer!

Era simplemente una broma en la cueva del desarrollador. Sin ofensas significadas en absoluto. Bromas aparte, ReportViewerForMVC tiene 72,799 descargas desde principios de 2014 (https://www.nuget.org/packages/ReportViewerForMvc). El equipo de SSRS ha ignorado ASP.NET MVC durante muchos años y ahora ignora ASP.NET Core durante 2 años. Hablando de ser grosero, 72,799 veces es mucho.

Me conformaría con una buena exportación a la biblioteca PDF con soporte oficial, sin necesidad de que el visor de estos días tenga requisitos de respuesta como son.

@cgountanis : Genere una plantilla HTML (tamaño de papel correcto: solo html, imágenes como base64, estilos en línea). Complete los marcadores de posición y no olvide establecer la codificación HTML en utf8. Enviar texto a StandardInput de wkhtmltopdf: recuperar la salida de StandardOutput de wkhtmltopdf. Y luego, tienes algo mucho mejor que SSRS.

@cgountanis He contemplado este enfoque, pero generar un informe perfecto en píxeles con encabezados / pies de página y saltos de línea en lugares lógicos no es fácil.

Para todos aquellos que comparten mi dolor de no tener el visor de informes local MS RDLC en el núcleo de aspnet; He intentado un enfoque alternativo con la ayuda de pdfJs y ViewerJs de mozilla - demostración de pdfJs con el visor de informes MS RDLC para escupir el informe como bytes. Para mí, esto es lo mejor de ambos mundos, ya que todavía podría usar archivos RDLC, usarlos para generar informes en el lado del servidor y tener el poderoso visor de documentos integrado en Firefox para mostrar el resultado. PdfJs todavía no es un visor de informes, pero para mi caso con navegación de página, vista previa de impresión, búsqueda y un montón de otras funcionalidades útiles, tampoco lo es menos.

En caso de que esté interesado, aquí hay una esencia para ayudarlo a usarlo dentro de la aplicación principal de aspnet (con el lado del cliente en angular 2 o superior, rxJs y Typescript). Para mí, esto simplemente es lo mejor de ambos mundos.

Cómo agregar pdf.js y viewer.html a la aplicación angular 2. (Con generación de informes de backend aspnet core / webapi / mvc opcional utilizando el visor de informes MS Local RDLC)

Creo que puede cambiar angular 2 con react o cualquier otra biblioteca del lado del cliente, pero los principios siguen siendo los mismos.

¿Funciona directamente con SSRS?

@cgountanis la publicación anterior es RDLC, lo que significa que no hay un servidor de informes, el servidor web genera el informe.

Una interesante actualización de Microsoft ...

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

Nos complace anunciar que hemos adquirido tecnología de Forerunner Software https://forerunnersw.com/ para acelerar nuestras inversiones en Reporting Services. Esta tecnología incluye, entre otras cosas, la representación del lado del cliente de informes de Reporting Services (* .rdl), widgets de interfaz de usuario receptivos para ver informes y un SDK de JavaScript para integrar informes en otras aplicaciones, un testimonio de lo que nuestros socios pueden lograr basándose en nuestra plataforma abierta.

Esta es una gran noticia para usted, ya que vemos oportunidades para aplicar esta tecnología a múltiples puntos de retroalimentación que hemos escuchado de usted:

  • Busca software como servicio (SaaS) o plataforma como servicio (PaaS) en la nube que puedan ejecutar informes SSRS. Como puede haber visto en nuestras Notas de la versión de Spring '18 https://aka.ms/businessappsreleasenotes , estamos trabajando activamente para llevar los informes SSRS al servicio en la nube de Power BI, y estamos construyendo sobre la representación del lado del cliente para haz eso posible.
  • Desea ver informes de SSRS en su teléfono, quizás usando la aplicación Power BI. Creemos que esta tecnología nos ayudará a ofrecer una interfaz de usuario mejor y más receptiva para proporcionar valores de parámetros de informes, navegar dentro de los informes y posiblemente incluso ver el contenido del informe.
  • Le encanta el control Visor de informes ... pero es un control ASP.NET Web Forms. Necesita algo que pueda integrar en su aplicación ASP.NET Core / MVC o en una aplicación que no sea ASP.NET. Con esta tecnología, esperamos ofrecer un visor de informes del lado del cliente / basado en JavaScript que pueda integrar en cualquier aplicación moderna.

Estas son grandes empresas y aún no tenemos plazos para compartir, pero estad atentos durante los próximos meses, ya que siempre nos esforzamos por compartir nuestro progreso con usted y escuchar sus comentarios tan pronto como podamos.

Saludos

Pablo


De: Denny Figuerres [[email protected]]
Enviado: viernes 23 de marzo de 2018 2:19 a.m.
Para: aspnet / Inicio
Cc: Paul Sheldon; Comentario
Asunto: Re: [aspnet / Home] Asp.Net Core Reporting (SSRS) (# 1528)

@cgountanis https://github.com/cgountanis la publicación anterior es RDLC, lo que significa que no hay un servidor de informes, el servidor web genera el informe.

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub https://github.com/aspnet/Home/issues/1528#issuecomment-375408680 , o silencie el hilo https://github.com/notifications/unsubscribe-auth/AEHciZa6- jjUl8kgdHtuCdH6lSwhoCyyks5tg-s6gaJpZM4IsW_Z .

Oh Dios, no esta mierda de jQuery otra vez.
Bloatware.
Y no solo bloatware, sino también slowwwwwww ...

Si necesita una definición de bloatware, esta sería una buena.
Para la perfección, básicamente solo carece de la interfaz de usuario de jQuery, pero estoy bastante seguro de que las personas que hacen cosas así encontrarán el tiempo para agregarlo para el selector de fechas.

Oh espera, acabo de ver

jquery-ui-1.10.3.forerunner.js

Mi mal, no importa.
Definitivamente es un ejemplo perfecto.
Por supuesto, no solo agregamos jQuery-UI, también lanzamos nuestra propia versión modificada.

Dios, esto parece una mierda. Informes en el teléfono, justo lo que necesitamos, justo después de los iPads y pantallas táctiles CrApple en el escritorio ...
Y todavía me conformaría con SSRS trabajando con un servidor proxy, o por poder hacer uso compartido de cookies de autenticación (alojamiento basado en nombre virtual de múltiples inquilinos - inclusión de iframe de directorios virtuales múltiples de un solo dominio sin sobrepasar la cookie de autenticación de otro directorio virtual). O si (en SSRS 2016+) representaría los bordes de las tablas por igual en IE y Chrome, y posiblemente en Firefox.
O simplemente por poder configurar la cultura manualmente a través de la cadena de consulta, hacer que los títulos de los parámetros se traduzcan y simplemente hacer ese selector de fechas yo mismo, porque MS no lo hará bien de todos modos ...

ESTA es LA definición de bloatware:

<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>

Qué tal si:

<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>

o mejor

<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>

Puntos de bonificación si agrega una marca de tiempo Unix a cada secuencia de comandos y hoja de estilo, por lo que los cambios / correcciones realmente surten efecto. Puntos de bonificación extendidos si pasa un valor de fecha y hora como unix-timestamp en lugar de una cadena específica de la cultura y no falla para una fecha> 2030 o 9999. O en caracteres UTF8. Ahora, en cuanto al soporte de idiomas de derecha a izquierda, no queremos estirar demasiado el límite de Microsoft. Fallan mucho antes de eso. Ya superarían mis expectativas si funcionara para más de un idioma europeo simultáneamente (por ejemplo, inglés, alemán, francés e italiano).

Estimado Microsoft, tal vez me gustaría probar también si un informe tiene todos los campos traducidos, y para eso, simplemente me gustaría iniciar sesión como un usuario diferente con un idioma diferente, sin tener que modificar la configuración de idioma de mi navegador cada vez (o decirle a un cliente cómo hacer esto, ese es su mayor logro hasta la fecha, una experiencia inolvidable [muy negativa] que podría agregar, especialmente después del cambio a Windows 8).
Si necesita algo con lo que USTED pueda identificarse, tal vez a veces también exista un usuario inglés que trabaja en una computadora que ha sido configurada para usuarios que no hablan inglés. Por lo tanto, sería bueno si yo, como desarrollador, pudiera configurar el idioma de visualización desde mi aplicación, no solo tenerlo determinado por la configuración de idioma del agente de usuario. Tal vez podrías tener al menos esto en cuenta ESTA vez.

Pero si miro la mierda anterior, ya puedo decir que no lo harás.

Por cierto, para establecer la cultura en la encarnación actual de SSRS, debe hacer lo siguiente:

llamar a un informe con & in_language = IETF-language-tag

\ nombre de máquina \ 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>

Luego, el idioma debe sobrescribirse en la solicitud http (módulo HTTP personalizado en SSRS)
(y la política de P3P es para que una publicación de inicio de sesión de formulario funcione cuando está en un iframe en un dominio diferente).

¿Podrías encargarte de no romper esto sin ofrecer un parámetro de idioma (DISPLAY)?
Su parámetro rs:ParameterLanguage solo afecta a los parámetros de la URL, no a la visualización del informe. Y no debería tener que existir en primer lugar, por ejemplo, si acaba de pasar datetime como unix-timestamp (UTC). Y, por supuesto, siempre debe tener el mismo encabezado de origen o el encabezado de permiso (el iframe está en un dominio diferente al de ReportServer). Por cierto, configurar el idioma de solicitud en el módulo HTTP es para configurar el selector de fecha con SSRS 2016 en el idioma requerido; de lo contrario, JavaScript falla si tiene un selector de fecha en-US. Genial, ¿no?

¿Qué tal: & rs: language = etiqueta de idioma 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 ¡POR FAVOR, no use ese código de ejecución inicial tal cual!
Las aplicaciones web modernas del lado del cliente se están alejando de la consulta j a los módulos es y demás.
no necesitamos ni queremos introducir un montón de código de consulta j.
Prefiero darle al cliente un pdf o el control asp.net actual en lugar de esta pila de consultas j.

Cree un paquete npm que funcione bien con Angular 2-6 y node y otros marcos de cliente web.
También siga trabajando con el renderizado SSRS, tiene muchos beneficios. solo obtenga un conjunto de API de servicios web actualizadas

¿Algún avance en esto?

Bueno, básicamente ya tendríamos todo lo que necesitamos.
Lo que necesitaríamos es una implementación de una versión REST / JSON de
http: //localhost/ReportServer/ReportExecution2005.asmx
(No estaría de más si nosotros / cualquiera pudiéramos personalizar la URL)
como paquete nuget, uno que también funciona en Linux / Mac.
Lo único que se debe hacer es migrar el código .NET a .NET Core / NetStandard y eliminar todos los pinvokes a las DLL de Windows. Luego, agregue la capacidad de generar html PAGADO a través del servicio web (que actualmente no existe, porque está en asp.net-render-control), por supuesto, y permita establecer el nombre del archivo de descarga.

La selección de parámetros la podríamos hacer nosotros mismos, leyendo el RDL con XmlDocument.
(algunos problemas con la opción explícita desactivada, la opción estricta desactivada, la opción inferir con VB-Code será probable)
Algo así como el control ASP.NET actual, pero sin todas las cosas ASP.NET-WebForms.

Así que no creo que exista un requisito para una sola línea de JavaScript, que de todos modos será diferente de un proyecto a otro, de una empresa a otra, de una persona a otra.
A algunos les gusta jQuery. A algunos les gusta Angular. A algunos les gusta Vue. A algunos les gusta React. A algunos les gusta NodeJS con NPM, a algunos les gusta bower, a algunos les gusta TypeScript, a algunos les gusta Babel, algunos fluyen, algunos incluso usan jQuery-UI para el selector de fechas.

Por ejemplo, odio en gran medida todos esos marcos (especialmente jquery-ui) con la vida útil de una mosca de la fruta, incompatibilidades entre versiones, hinchazón, no modularidad y una curva de aprendizaje de lo que sea, una comunidad de personas que no saben lo que están haciendo (nota: por la presente no quiero insinuar que siempre sé lo que hago), y un administrador de paquetes roto como npm / bower, que tiene las características desagradables de encontrar siempre una manera de crear nuevas alegrías cada vez que hubiera querido usarlos.

Entonces solo uso VanillaJS (con módulos ECMA y async, transpilado con babel o mecanografiado, y a quién le importa el transpiler.

Ahora, por supuesto, mucha gente no estará de acuerdo, y usted tiene derecho a estar en desacuerdo, ya que existen razones para no estar de acuerdo. Al final, no me importa lo que use, use coffeescript y emacs con jquery-ui y vue si lo desea absolutamente, simplemente no me obligue a seguir ese camino. No necesito / quiero jquery / angular / vue / react / bower / npm o nada de esa hinchazón y falta de fiabilidad.

Ahora, dicho esto, si desea proporcionar una biblioteca de JavaScript que cualquiera pueda poner en su sitio para seleccionar los parámetros automáticamente, como en ReportServer (a diferencia de RDLC), y a diferencia del control actual del visor de informes, estoy totalmente de acuerdo . Si lo hace, hágalo independiente del "control" del informe. Y use una estructura similar a un nodo para componer módulos ECMA, de modo que las personas que quieran usar node puedan usarlo con node / npm, y aquellos que no lo hagan no tienen que hacerlo.

Como nodo lateral, si la versión REST / JSON permitiera obtener los datos del filtro del servicio como json, al igual que los archivos renderizados, ni siquiera necesitaríamos leer el archivo RDL, y tendríamos un JS muy complicado de la ONU biblioteca. De todos modos, el código VB que está permitido en los parámetros no permitiría hacer esto en el lado del cliente.

O pensándolo bien, sería incluso mejor si el servicio permitiera obtener cada conjunto de datos en el informe como JSON. Supongo que también deberíamos poder leer los valores predeterminados para cada parámetro. ¡Entonces podríamos incluso hacer pruebas unitarias de la exactitud de los datos SQL utilizados en el informe!
(los informes de pruebas unitarias son actualmente bastante imposibles)

Una hoja de estilo adicional para el formato terminaría el truco (SASS, por favor). Y un sistema de complementos para renderizadores adicionales / alternativos redondearía eso. ¨

Pero en esencia, solo necesitamos una biblioteca de representación de informes multiplataforma.
Todo lo demás ya lo podría hacer la comunidad hoy.
Supongo que si las fuentes para los controles existentes estuvieran disponibles, la comunidad podría hacer todo o la mayor parte del trabajo requerido, lo que ni siquiera le costaría ni un centavo a Microsoft.

¿Es alanjuden MvcReportViewer funciona con SSRS 2017 y core 2. Puedo usar este enfoque para SSRS 2017 y core 2

No, no sin mucho dolor de cabeza. La solución más sencilla es exportar archivos PDF directamente utilizando reportexecution2005 directamente, en mi humilde opinión. Tratar de obtener cualquiera de los antiguos visores en un formato receptivo, especialmente para teléfonos y tabletas, es una molestia.

@Mahenbisht , tengo que compilarlo desde la fuente con paquetes actualizados a las últimas versiones para que funcione en el núcleo 2. Todavía no he probado 2017.

Estoy usando SQL Server 2017 con SSRS 2017 y core 2.
Si no puedo usar alanjuden.MvcReportViewer.NetCore, ¿hay algún otro enfoque?

@Mahenbisht , sé que no he estado muy activo en el mío en un tiempo ... sin embargo, aún podrías usar un enfoque similar. Siempre puede conectarse a la API de Reporting Service que estoy usando (que está integrada en SSRS) para ejecutar sus propios informes y ponerlos en el formato que desee.

@Mahenbisht : Aquí hay un paquete nuget de .NET Core:
https://www.nuget.org/packages/AspNetCore.ReportViewer/
Desafortunadamente, no hay fuentes de ningún tipo, por lo que no puede ver qué hace y cómo usarlo.
Así que lo descompillé aquí (compila).

Parece que son las clases generadas desde ReportExecution2005 & ReportService2010-WSDL para .NET Core.
Entonces, nada que le impida escribir su propio visor, si tiene acceso de red a una instancia en ejecución de SQL-server con SSRS.
Si mal no recuerdo, debe pasar deviceinfo para renderizar para que obtenga una salida html paginada.
Eso te deja haciendo los parámetros manualmente, que es en lo que estoy (teóricamente) trabajando actualmente.

@alanjuden : El problema con su enfoque es que requiere una instancia de SQL-Server con ReportingServices instalado. Si tiene eso, también puede poner un iframe en / ReportServer y agregar una pequeña autenticación personalizada + encabezado W3C y DLL de localizador de idioma a reportingservices. Entonces no necesitas tu trabajo en absoluto.

El problema con eso es que
R) Los clientes de N no siempre tienen la misma versión de SSRS instalada (con todas las actualizaciones acumulativas / servicepacks; en mi caso, actualmente van desde SSRS-2008R1 a 2016),
y B) que las instalaciones de SSRS-Express solo tienen acceso a las bases de datos en la máquina local. Y lo que realmente es una mierda es que no hay un control ReportViewer que funcione en PC que no sean Windows (Linux, Mac), por lo que debe combinar .NET con Java para Birt o Jasper, lo que rompe la implementación de xcopy, sin mencionar un enorme overhead en ambos 2-3 formatos de informe, y toda la JVM de java y el bloatware birt / jasper, incluido Tomcat y / u otra basura similar.
y C) que ReportingService utiliza autenticación de Windows integrada. Entonces, incluso si usa Windows, debe agregar autenticación personalizada para fuera de la intranet, lo que significa que debe tener acceso de modificación a ReportingServices, y sus modificaciones pueden romper otro software, por lo que cualquier cliente en su sano juicio debe instalar una nueva instancia SSRS / SQL-Server (que cuesta dinero).
también D) que los parámetros de ReportingService no se pueden localizar sin modificar ReportViewer.aspx, ver C)
y también E) que cualquier versión de SSRS <2016 Renders quirks-html (y aunque 2016+ es mejor, está lejos de ser perfecto en ese sentido, por cierto)
Sin embargo, dado que las versiones antiguas de 2008 todavía existen en 2018, podrían pasar otros 5 a 10 años antes de que desaparezcan las versiones inferiores a 2016. Para ese momento, SSRS 2016 estará irremediablemente desactualizado de todos modos. Si Microsoft todavía existe para entonces, claro.

Docker al rescate, afortunadamente. Pero sigue siendo una mierda.

y agregue una pequeña DLL de autenticación personalizada + encabezado W3C y localizador de idioma a reportingservices.

@ststeiger ¿ alguna muestra en línea para poner el visor SSRS en iframe con la autenticación personalizada del sitio principal y los encabezados W3C?

@adopilot : Aquí hay un

Agregar autenticación personalizada a SSRS

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

(Deberá modificarlo un poco para que use UN usuario por base de datos.
¡No desea comenzar a sincronizar los usuarios y permisos de SSRS con sus usuarios de formularios!
Otorgue a este usuario derechos sobre la carpeta solo para esta base de datos.
)

Agregue un módulo http a SSRS , que establece el encabezado p3p, y sobrescriba context.Request.UserLanguages ​​[i] con el idioma que elija (de lo contrario, el selector de fechas no funciona)

Modifique la página de inicio de sesión de ReportServer, para reaccionar para obtener y publicar parámetros, y configure login_cookie, luego redirigir al informe en el que se publicó.

Código en Page_Load en la clase FormsAuthentication_RS2012.LogOn en Assembly FormsAuthentication_RS2012

Publique los datos encriptados PGP / RSA con una marca de tiempo Unix (para que no se pueda reproducir) encriptados con la clave pública en sus formularios, desencripte los datos posteriores en FormsAuthentication_RS2012 en page_load.

(no puede darle el código FormsAuthentication_RS2012, porque contiene la clave privada y la contraseña de administrador codificada)


<%@ 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>

Agregar a 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>

Agregue la funcionalidad de traducción de parámetros a reportviewer.aspx:
(
El parámetro se ha escrito como alemán / francés / italiano / inglés
)
dividido en / y predeterminado en alemán (es posible que desee usar inglés)
agregue un parámetro in_language (in_sprache) a la URL del informe, y estará listo, si entendió la idea.


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>

Ahora, para usar esto en alguna página web, cree un iframe llamado ifrmSSRS_Login (o ajústelo a su gusto) y haga una publicación de formulario al hacer clic en el enlace:

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')}
    },

de esa manera, puede puentear la autenticación con SSRS, además de que los usuarios de cada cliente (nombre de la base de datos) vean solo sus informes (permisos en ssrs por nombre de la base de datos).

Tenga en cuenta que los uids deben pasarse en minúsculas, porque de lo contrario SSRS se niega a funcionar correctamente / explota como la pieza de software de mierda que es.

Nota:
Ese código acumulado durante un período de tiempo más largo, para múltiples versiones de SSRS, y tal vez anular la cultura de inicialización de página ya no es necesario si el módulo http anula el lenguaje del agente de usuario (que solo descubrí después de darme cuenta de que la página de reemplazo -initialize-culture no es lo suficientemente bueno para el selector de fechas de SSRS).
Además, el uso de la barra como separador para la traducción fue desafortunado. intente utilizar un carácter que nunca necesite, como £ o ¦.

El encabezado P3P es necesario para que IE 11 en computadoras que no sean Windows-10 no rechace la cookie de autenticación (dado que ssrs se ejecuta en un iframe entre dominios, IE lo maneja como una cookie de terceros).

Además, use SSRS 2016+, porque de lo contrario, necesita características de modo peculiar, como anchos de borde, alturas, márgenes, ocultar la función de impresión y todo tipo de "cosas interesantes específicas de IE8", etc.

Como dice el nombre del ensamblado, esto se hizo para nuestro servidor de producción (SSRS 2012) y todo evolucionó a partir de los horribles hacks de SSRS 2005.

Guarde los enlaces en un campo de su tabla de navegación, por ejemplo, como campo NA_Link en T_Navigation
'{@report} Budget_SNB & in_user = {@ user} & in_sprache = {@ language} & rc: Stylesheet = COR_RS2012_v7'
use marcadores de posición para el enlace base, el usuario y el idioma, y ​​configure la hoja de estilo (si tiene un fondo negro, debe decirle a ssrs que use la modificación de su hoja de estilo)

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

Y tenga en cuenta que .NET-Framework tiene problemas si necesita redirigir un enlace con dos puntos adentro.
Puede copiar el código de trabajo para la redirección de URL desde el mono-proyecto.

Además, tenga en cuenta que no puede simplemente pasar el ID de usuario como una cadena / número; debe estar encriptado (privado / público) para que nadie pueda adivinar el ID de usuario. Pero para empezar, el md5-hash del ID de usuario podría funcionar.

@ststeiger @todos
AspNetCore.ReportViewer ha sido reemplazado por AspNetCore.Reporting
eso incluye LocalReport y ServerReport

@ amh1979 : Buen trabajo. Lo echaré un vistazo.
Lo tomo de su dependencia AspNetCore.ReportingServices.dll que necesita WindowsBase y pinvoke advapi32.dll / kernel32.dll / ReportingServicesService.exe que esto solo funciona en Windows con .NET con Framwork 4 instalado.

PD: el inglés correcto es "AspNetCore.ReportViewer ha sido> reemplazado con <AspNetCore.Reporting", no "insteaded", pero entiendo lo que quieres decir;)
O también puede decir "ha sido reemplazado por", que podría ser la palabra o frase que está buscando;)

@ amh1979 : Bien hecho, tuve que trabajar un poco porque no tengo el marco 4.7.1 instalado.
Lo entiendo, MainStream es result / html y SecondaryStream es CSS.
Pero lo puso en marcha.
Que el HTML esté paginado también es bueno.
¿Sabe: hay alguna forma de recorrer todos los resultados o de obtener un archivo HTML enorme sin llamar a la función de renderizado para cada página?

@ TODOS : Si bien esto se ejecuta en .net completo, no puedo hacer que se ejecute en .NET Core en Windows.
Problemas con System.Drawing.Color ToKnownColor, IsSystemColor y no presente KnownColor.
Se corrigió eso, pero ahora se queja de que no se pudo cargar el ensamblaje System.Drawing.Graphics con firma ...

¿Existe alguna forma de ejecutar ensamblados .net COMPLETOS en un proyecto .NET Core en Windows?

@ststeiger Actualizaré y solucionaré estas preguntas en la próxima versión.

@ amh1979 :

Mientras lo hace, si busca y reemplaza System.Array.Empty<T> con ArrayExtension.Empty<T> , entonces está al 90% del camino para que funcione con .NET 4.0.

    internal static class ArrayExtension
    {

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

    }

@ amh1979 :

Utiliza lo siguiente

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

que System.Drawing.Common de .NET Core no implementa.
Aquí hay un reemplazo de System.Drawing.KnownColor.cs
(no es perfecto debido a la ambigüedad, pero en ausencia de acceso a los valores internos de System.Drawing.Color. esto es lo mejor que pude hacer, tal vez use #ifs para hacer que el framework .net completo llame a las propiedades reales si está lleno. 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 


}

Lo tengo compilando bajo NetStandard 2.0

CÓMO:
Tome System.CoreFX.Forms y conviértalo a NetStandard 2.0. Luego agregue System.Drawing.Common y System.Reflection.Emit.

Tome AspNetCore.ReportingServices y agregue

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

Agregar una referencia a System.CoreFX.Forms (NetStandard)

Obtenga los siguientes archivos de 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")

Y agregue una clase contenedora para 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;
    }
}

Y permitir código inseguro en el nuevo proyecto netstandard 2.0.

Ahora agregue AssemblyInfo.cs con

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

Y ahora se compila en NetStandard 2.0.

Hola @Todas las increíbles noticias:

¡Lo tengo funcionando con .NET Core en Windows!
100% NetStandard, 0% NetFramework

Html, Pdf, Excel, Excel2007 +, Word, Word2007 + y tiff funcionaron bien en un informe tabular de 57 páginas con varchars, ints, tinyint2, bits y columnas calculadas.
Todos los formatos de salida funcionan, excepto RDL, que es un poco divertido, pero a quién le importa.
Encontraremos el problema eventualmente, ¿no?

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 

Y hay más buenas noticias:
WindowsBase (también conocido como WPF) solo se usó para System.IO.Packaging, que está disponible en .NET Core.
Ahora, eso significa que si podemos deshacernos de los pinvokes, ¡no hay obstáculos importantes para que esto funcione también en Linux / Mac!

¡Ahora alguien empieza a escribir rápidamente un editor RDL basado en web!
Entonces también podríamos tener informes "dinámicos" (generados por el usuario).
Se acerca PostgreSQL-ReportingServices para Linux;)
(ok, existe una espada legal de Damocles en tal cosa, pero si pudiéramos publicarlo desde China, que tiene derechos de propiedad intelectual "más relajados" ...) :)

Bien, quizás eso sea demasiado malo.
¡Piense en Microsoft ReportingServices para Oracle / SAP en su lugar!
O ReportingServices para Cassandra / Spark: sonrisa:

@ amh1979 :
¿No hay ningún renderizador de PowerPoint ahí?
¿Lo creó a partir de la última versión de reportviewer? (SSRS 2017)
La última versión que conozco en nuget:
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
(140.1000.523, hace 10 meses)
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WinForms
(140.1000.523)
https://www.nuget.org/packages/Microsoft.SqlServer.Types
(14.0.314.76)

Aquí está la implementación de CoreFX WinForms para NetStandard:
https://github.com/ststeiger/System.CoreFX.Forms

Cuidado con la brecha, dado que agregué un proyecto NetCore adicional y renombré System.CoreFX.Forms a System.NetStandard.Forms, podría tener dificultades para cargar los recursos integrados, si lo hace.

Los archivos se pueden encontrar aquí:

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

@ amh1979 :
Ah, ya veo, eso no está en Microsoft.ReportViewer.Common.dll.
Pero está en el directorio ReportServer:
Microsoft.ReportingServices.PowerPointRendering.dll
y para CSV / XML / Atom:
Microsoft.ReportingServices.DataRendering.dll

C: \ Archivos de programa \ Microsoft SQL Server Reporting Services \ SSRS \ ReportServer \ bin

@ TODOS : ¡Señoras, el renderizador HTML está funcionando en Linux en .NET Core / NetStandard 2.0!
¡Y también lo es WordOpenXML y el renderizador ExcelOpenXML!
(no probado con imágenes / gráficos; solo texto y código)

El renderizador de PDF tiene problemas con los pinvokes de incrustación de fuentes.
(El renderizador de Word / Excel-2003 usa pinvokes y, por lo tanto, no funciona).
Si usa la versión eval de Aspose Cells / Words, puede convertir el xlsx en xls y el docx en doc.
También puede generar el PDF a partir del archivo de Word:
soffice --headless --convert-to pdf filename.docx
(o de nuevo, con aspose eval)
Pensando en ello, el renderizador PPTX también debería ser fácil de hacer, porque todo lo que hace es tomar las imágenes del archivo TIFF y poner cada imagen de página tiff como jpg / png en una diapositiva pptx.
Parece que el renderizador de imágenes es lo más difícil de hacer.
O puede tomar wkhtmltoX y convertir cada página HTML en una imagen / pdf.
Sin embargo, eso probablemente sería un poco lento.

Asombroso !

HTML for report

@ TODOS : Atom / CSV / XML en funcionamiento. También lo es el renderizador NULL.
También en Linux.

El renderizado de PowerPoint solo funciona en Windows - pinvokes

Dato curioso: parece haber un renderizador JSON ahí.
Pero por alguna razón, esa basura solo funciona en un caso useSharedDataSetTableHandler, lo que sea que eso signifique

ParseDeviceInfo(deviceInfo);

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

¿Alguien sabe por azar cómo usar el renderizador JSON?

@ amh1979 Intenté usar el informe del servidor, pero parece que los parámetros que agregué para el informe no persisten en el servidor en LoadReport. ¿Existe alguna posibilidad de que pueda configurarlo para que se envíen al servidor en su próxima compilación?

Hola @ststeiger y @ amh1979 ,
Sigo intentando acceder al sitio vinculado en la descripción del paquete nuget (http://www.amhx.org/) para ver, pero sigue agotando el tiempo.

@DavidHayesCodificación :
Aquí mi código de prueba para AspNetCore.Reporting.LocalReport, que es todo lo que me interesa:
Nota:
Los tipos de representación Rpl, RGDI, Atom, Xml, Json, Csv, null, pptx
no estarán disponibles para usted, ya que no están en la asamblea de amh1979.
(son parte de SSRS, pero no están presentes en el redistribuible ReportViewer)

También tenga en cuenta que la fuente de datos compartida (* .rds) debe estar en el mismo directorio que * .rdl; de lo contrario, obtendrá una excepción de referencia nula en LocalReport.Execute.

Para más preguntas:
https://github.com/icsharpcode/ILSpy/releases/tag/v4.0-beta2
(Nota: en el código correcto, debe desechar la tabla de datos después de terminar de usarla)

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();
        }


    }


}

@ TODOS : ¿Alguien quiere ayudar?
Responde esta pregunta:
https://stackoverflow.com/questions/52093440/how-to-call-wine-dll-functions-from-c

¿Puedo sugerir que publicar una gran cantidad de código y comentarios extensos es una forma realmente difícil de digerir y leer para rastrear este problema?

Puedo ver mucha actividad, mucho código, pero realmente no soy más sabio en cuanto a cuáles han sido los desarrollos recientes (aparentemente excelentes).

¿Puedo sugerir mantener las cosas ordenadas y ordenadas aquí, y usar otro repositorio / herramientas apropiadas para compartir código? ¿Existe una actualización de estado simple y simple que se pueda compartir aquí?

como @kierenj, creo que los listados de código como una publicación hacen que sea difícil de seguir. poner un github y luego compartir un enlace. vea si los administradores de este repositorio quieren hacer algunas ramas, etc.

@kierenj @figuerres : estaría bien con eso, pero si publica cantidades más grandes de código de Microsoft descompilado sin pedir permiso primero, probablemente se arriesga a cruzar la línea hacia donde ellos querrían hacer algo al respecto ...

iii. Restricciones de distribución. Tú quizás no
• distribuir código distribuible para que se ejecute en una plataforma que no sea la plataforma Windows;
• el código sea divulgado o distribuido en forma de código fuente; o
• otros tienen derecho a modificarlo.

@ststeiger
y puede trabajar con el repositorio aquí mismo para hacer una rama y poner código en esa rama.
luego lo tienen y lo saben, etc.

@figuerres : Hice el repositorio en gitlab, donde un repositorio privado es gratuito.

@MaximRouiller :
Tendría una versión de ReportViewer (informes locales) que funcione aproximadamente en ASP.NET Core.
Aproximadamente el 75% funcionaría incluso en Linux, para el cual Microsoft ha publicado SQL-Server.
Las partes que funcionan en Linux probablemente también funcionen en MacOS.

Sin embargo, esta versión de ReportViewer se basa en el código de
https://www.nuget.org/packages/AspNetCore.Reporting
que parece estar basado en el código de
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
que viene bajo esta licencia
http://go.microsoft.com/fwlink/?LinkId=826162

Esta licencia no permite
• distribuir código distribuible para que se ejecute en una plataforma que no sea la plataforma Windows;
• el código sea divulgado o distribuido en forma de código fuente; o
• otros tienen derecho a modificarlo.
• solucionar las limitaciones técnicas del software;
•> no se permite la ingeniería inversa <

Me gustaría compartir (públicamente) ese código con la comunidad aquí en github, en una ubicación aún por determinar, con el fin de mejorar el código y resolver los posibles errores restantes, para llevar ReportViewer a .NET Core.
Sin embargo, no me gustaría dar ese paso unilateralmente considerando la licencia actual de ReportViewerControl.WebForms.

Creo que muchas cosas han cambiado desde que se escribió o actualizó por última vez esa licencia.
Por ejemplo, no tendría mucho sentido publicar un ReportViewer para .NET Core cuando el resultado solo funcionaría en la plataforma Windows, también considerando que Microsoft ha lanzado SQL-Server para Linux, lo que significa que en algún momento SSRS tiene que seguir de todos modos.

Y dado que ASP.NET-Core no implementa WebForms, el cambio de ReportViewer-WebForms a ReportViewer-NetCore sería un cambio rotundo de todos modos.

¿Podría preguntar discretamente a los poderes fácticos, si, considerando las circunstancias, dan luz verde a tal esfuerzo, que por cierto les ahorraría tiempo y mano de obra, y se alinearía muy bien con la naturaleza de código abierto de .NET-Core / NetStandard 2.0.

Han pasado más de 2 AÑOS desde que se lanzó .NET-Core, y todavía no hay una solución para informes amplios y lejanos. Es hora de que esto se rectifique.
Si lo hacemos juntos, todos estaremos más rápidos y mejor.

http://go.microsoft.com/fwlink/?LinkId=826162
Lo que me preocupa.
De lo contrario, excluiré los paquetes de NuGet.

@ TODOS : Grandes noticias: Eliminó las llamadas COM-InterOP para XLS / DOC y lo reemplazó con OpenMcdf.
Por lo tanto, XLS / DOC-Renderer ahora funciona tanto en Linux como en Windows.
Ahora el 85% trabaja en Linux.

Parece que nos quedamos con 3 llamadas WinAPI para PDFWriter y 13 llamadas WinAPI para ImageRenderer / Graphics.
Creo que el propio PdfWriter podría ser bastante fácil.

Hola @ststeiger No puedo ejecutar AspNetCore.Reporting on Azure Function with Consumption Plan porque ha bloqueado la función GDI +. ¿Tiene alguna solución para ello? Gracias.

Todavía no; realiza varias llamadas a GDI + y usp10.dll, principalmente para obtener información de fuentes.
También está pasando punteros GDI +, y no hay un reemplazo simple, porque mono libgdi + eligió hacer las cosas de manera diferente (por una buena razón).

Pude volver a escribir la función GetFontData en C # leyendo la fuente C de Wine, pero necesito freetype para acceder a la información de la fuente TrueType (wine también usa FreeType).
SixLabors.Fonts y LayoutFarm todavía no están allí (por un amplio margen).
Aquí:
https://gist.github.com/ststeiger/273341aebd29009f2b272b822b69563f

Además, reemplacé las medidas de texto con freetype

Ahora necesito reemplazar cada identificador de dispositivo GDI con una clase personalizada.
Esa clase debe contener información de fuente / gráficos / freetype-face / handle, etc., por lo que no necesito volver a escribir el renderizador.

Cuando termine, necesito volver a mirar el vino, para las transformaciones del papel al mundo y del mundo al papel.
Y luego debería estar hecho.
Creo que las transformaciones de papel a mundo y de mundo a papel podrían estar ya en System.Drawing.Graphics.
Parece que una vez parte del código se escribió utilizando .NET Framwork 1.0.

Además, todavía necesito mapear entre la fuente .NET y la fuente de tipo libre de alguna manera.

Hola amigos @ALL y @ststeiger
respecto a:

@ TODOS : Grandes noticias: Eliminó las llamadas COM-InterOP para XLS / DOC y lo reemplazó con OpenMcdf.
Por lo tanto, XLS / DOC-Renderer ahora funciona tanto en Linux como en Windows.
Ahora el 85% trabaja en Linux.

XML abierto de Office

Honestamente, creo que sería mejor usar el material de documentación XML más nuevo, luego no se necesita ninguna forma de OLE.
De acuerdo, si alguien todavía estaba usando aplicaciones de Office realmente antiguas, no tan buenas para la compatibilidad con versiones anteriores. pero Office Open XML ha existido desde 2002-2006, por lo que cualquier persona que use Word o Excel de los últimos 10 años podrá usar los formatos de archivo docx y xlsx sin problemas.
solo mi pensamiento sobre eso ...

Para que no nos malinterpretemos:
Por supuesto, el renderizador de OpenXml Excel también funciona.

Solo digo que XLS / DOC también funciona, si es necesario.
Ahora, en cuanto a si XLS / DOC debería exponerse o no, o si eso podría eliminarse de forma segura, es otra cuestión. Es posible que todavía existan algunos programas antiguos que no funcionen con XLSX.

UBS, por ejemplo, todavía utiliza programas COBOL.
Y hay varios otros.
Por lo tanto, probablemente sea mejor dejar que la funcionalidad XLS entre un poco más, por si acaso.

@RaymondHuy :
Si Azure ha bloqueado la función GDI +, ¿System.Drawing.Common funciona?
¿O esto solo se aplica a las llamadas DllImport externas al marco?

Hmm, solo busqué en Google.
Parece que las bibliotecas System.Drawing están disponibles en Azure Cloud Service (básicamente una máquina virtual), pero no en Azure Web App (¿básicamente alojamiento compartido?).
Esto podría ser un problema.
Entonces, una vez que esto se ejecute en Linux, necesitaríamos reemplazar cualquier elemento System.Drawing con SixLabors.ImageSharp más tarde, para que se ejecute en Azure Web App.

Esto costará tiempo y esfuerzo.
@RaymondHuy :
¿Podría comprobar si FreeType (contenedor de SharpFont) funciona en Azure?
https://github.com/Robmaister/SharpFont

Nota:
En x64-Windows, debe reemplazar la cláusula using para FT_Long y FT_ULong con esto

#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

porque las DLL de freetype parcheadas no funcionan en x64-Windows.

Así es como lo hice:
https://gist.github.com/ststeiger/9e2eb98e29a3c987aca739045af1d2ce

(Nota: defina WINDOWS en las opciones de compilación)

con algún código de prueba:

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 producirá una excepción si no se aplica la corrección de WINDOWS.

cuando intento con el archivo .rdlc, obtengo una excepción
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable 'no es accesible en este contexto porque es' Friend '.'. ' en localreport.Execute ()
por favor, ayúdame

        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();

Parece que tiene un problema con las expresiones VB integradas.
De todos modos hay múltiples problemas.

En Microsoft.VisualBasic1 \ VBCodeGenerator.cs
UseShellExecute debe establecerse en falso.

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

Y FromFileBatch debe reemplazarse con roslyn si se compila para netstandard (el proveedor de CodeDom no puede compilar para netstandard; excepciones divertidas si se usan expresiones VB, por ejemplo, en parámetros)


        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

Hay RoslynCodeDomProviders en https://github.com/aspnet/RoslynCodeDomProvider , pero de todos modos usan Roslyn detrás de escena. Y compilar relativamente codificado con "C: \ WINDOWS \ Microsoft.NET \ Framework\\ vbc.exe "de todos modos es una mala idea.

Ahora tengo funcionando el renderizador HTML4, HTML5 y MHTML completo.
No solo el paginado.

Hola, estoy usando [https://www.nuget.org/packages/AspNetCore.Reporting] y funciona perfectamente en IIS local.
Pero una vez que lo implemento en el servidor de Windows 2012 R2, encuentro un problema.

Registros de errores.

falla: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]
Se ha producido una excepción no controlada al ejecutar la solicitud.
AspNetCore.Reporting.LocalProcessingException: se produjo un error durante el procesamiento del informe local.; La definición del informe 'D: \ Apps \ BillingApproval \ ReportFiles \ ReleaseProcess.rdl' no es válida.
Se produjo un error inesperado al compilar expresiones. Valor de retorno del compilador nativo: -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: Ocurrió un error inesperado al compilar expresiones. Valor de retorno del compilador nativo: -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 parámetros)
en AspNetCore.Reporting.Report.SetParameters (parámetro ReportParameter)
en 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 parámetros, String searchString) en D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Extension \ AspNetCoreReportingExtension.cs: línea 27
en BA.UI.WebV2.Controllers.ReportsController.ReleaseProcessToPDF (DateTime from, DateTime to) en D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Controllers \ ReportsController.cs: línea 65
en lambda_method (cierre, objeto, objeto [])
en Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute (mapeador IActionResultTypeMapper, ejecutor ObjectMethodExecutor, controlador de objeto, argumentos de Object [])
en Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync ()
en Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync ()
en Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (contexto ActionExecutedContext)
en Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
en Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()
en Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()
en Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (contexto ResourceExecutedContext)
en Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
en Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync ()
en Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
en Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext)
en Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (contexto HttpContext)
en Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (contexto HttpContext)
en Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke (contexto HttpContext)

@jfmjason : se produce cuando CodeDom Code Compiler (.NET 4.0) intenta compilar algunos archivos en una ruta temporal en ExprHostCompiler. Quiere compilar ensamblados NetStandard / NetCore con el proveedor .NET 4.0. Eso no funciona. Cuando intenta compilar esos archivos, csc.exe falla silenciosamente con el valor de retorno -1073741819.
Dado que no puede compilar código .NET Core con el compilador .NET 4.0, debe usar RoslynCompilers, que no están en System.CodeDom. Mi NetStandardFromFileBatch anterior soluciona exactamente ese problema (y usa CodeDom si se compila para NetFramework 4).

Sin embargo, tenga en cuenta que el tiempo de ejecución de VB en .NET Core está muy limitado.
Básicamente, .NET Core realmente no es compatible con VB.NET ..

Si observa cosas básicas de VB, como las 50 o más funciones de cadena VB, como Reemplazar, Recortar, AscW, ChrW, LCase, Len, Mid, en Microsoft.VisualBasic.Strings - .NET Core 2.0 admite exactamente 2 de ellas, AscW y ChrW ...

Si miras la fuente actual en github, verás que ahora mismo, están ahí, pero son todos los códigos auxiliares que arrojan null.
https://github.com/dotnet/corefx/blob/master/src/Microsoft.VisualBasic/ref/Microsoft.VisualBasic.cs

Entonces, además de eso, es posible que deba editar un poco su código VB en sus informes, para admitir tanto .NET Core como NetFramework.

Entonces @ TODOS : aquí hay una idea:
Si desea que su informe con código que se ejecute en .NET Core sin modificaciones, comience a implementar las funciones de cadena en Microsoft.VisualBasic.cs.
O elimine cosas específicas de VB-runtime e intente usar las clases y funciones miembro provistas con C #, como string.Length en lugar de Len, IndexOf en lugar de InStr, Subtring en lugar de Mid, "BLA" .ToLower () en lugar de LCase ("BLA") etc.

Además, el VB-Code en general, no solo en .NET Core, tiene problemas con la sintaxis anulable ?.
Entonces, use System.Nullable (Of Double) en lugar de Double ?, si necesita declarar, por ejemplo, un valor de retorno de función.

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

Además, debe cambiar las referencias de ensamblado en 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 : Todavía no lo he mirado, pero en la versión paginada del Visor, ¿las imágenes de un informe aparecen en la representación HTML paginada?
Porque cuando tomé el renderizador completo html4 & 5 de ReportServer, las imágenes parecen delegarse a un controlador axd o ashx de ReportingServices. Sin embargo, aparecieron en la versión MHT.

Probablemente deberían cambiarse a url ("data: image / png; base64, SOME_BASE64_IMAGE"); en su lugar, para que estén en línea en el HTML.
Es decir, si van a un enlace no externo.
No probé si eso también afecta al espectador.

@ststeiger

Gracias por la respuesta. Me pregunto por qué funciona perfectamente cuando publico una versión de lanzamiento de mi aplicación web (.net core 2.1) en IIS local.

Puede ser que funcione localmente porque tiene .NET Framework instalado localmente.
O porque su servidor web local no está en modo integrado, se ejecuta bajo otro usuario o llega a otra ruta lógica, configuración del grupo de aplicaciones, configuración de seguridad, redireccionamientos de ensamblado, etc.
Además, ServicePacks, CumulativeUpdates y otras "características" interesantes.

Hizo una pequeña aplicación de prueba.
Después de agregar System.Drawing.Common en Win10, funciona bien.
Ejecutar en Ubuntu 16.04 conduce a un error.
AspNetCore.Reporting.LocalProcessingException: se produjo un error durante el procesamiento del informe local.; La definición del informe '/opt/testReportViewer/bin/Debug/netcoreapp2.1/Reports/Report1.rdlc' no es válida.
Se produjo un error inesperado en el procesamiento de informes.
No se puede cargar la biblioteca compartida 'kernel32.dll' o una de sus dependencias. Para ayudar a diagnosticar problemas de carga, considere configurar la variable de entorno LD_DEBUG: libkernel32.dll: no se puede abrir el archivo de objeto compartido: no existe tal archivo o directorio ---> AspNetCore.Reporting.DefinitionInvalidException: la definición del informe '/ opt / testReportViewer /bin/Debug/netcoreapp2.1/Reports/Report1.rdlc 'no es válido.
Se produjo un error inesperado en el procesamiento de informes.
No se puede cargar la biblioteca compartida 'kernel32.dll' o una de sus dependencias. Para ayudar a diagnosticar problemas de carga, considere configurar la variable de entorno LD_DEBUG: libkernel32.dll: no se puede abrir el archivo de objeto compartido: no existe tal archivo o directorio ---> AspNetCore.ReportingServices.ReportProcessing.ReportProcessingException: se produjo un error inesperado en el procesamiento de informes.
No se puede cargar la biblioteca compartida 'kernel32.dll' o una de sus dependencias. Para ayudar a diagnosticar problemas de carga, considere configurar la variable de entorno LD_DEBUG: libkernel32.dll: no se puede abrir el archivo de objeto compartido: no existe ese archivo o directorio ---> System.DllNotFoundException: no se puede cargar la biblioteca compartida 'kernel32.dll' o una de sus dependencias. Para ayudar a diagnosticar problemas de carga, considere configurar la variable de entorno LD_DEBUG: libkernel32.dll: no se puede abrir el archivo de objeto compartido: no existe tal archivo o directorio
en AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat (Corriente definitionStream, cuerdas y descripción, cuerdas y lenguaje, y ParameterInfoCollection parámetros, DataSourceInfoCollection y dataSources, DataSetInfoCollection y sharedDataSetReferences, UserLocationFlags y userReferenceLocation, ArrayList y dataSetsName, Boolean y hasExternalImages, Boolean y hasHyperlinks, byte [] y dataSetsHash)
en AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat (Byte [] definición, Cadena y descripción, Cadena e idioma, ParameterInfoCollection y parámetros, DataSourceInfoCollection & dataSources, DataSetInfoCollection & sharedDataSetFlags & UserLocationist & amp; UserLocationLos enlaces de usuario, Nombre de usuario y referencia de usuario,
en AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport (PublishingContext reportPublishingContext, PublishingErrorContext errorContext, string & REPORTDESCRIPTION, string & ReportLanguage, ParameterInfoCollection y parámetros, DataSourceInfoCollection y dataSources, DataSetInfoCollection y sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList y dataSetsName, booleanos y hasExternalImages, booleanos y hasHyperlinks, Byte [] y dataSetsHash)
en AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
--- Fin del seguimiento de la pila de excepción interna ---
en AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
en AspNetCore.Reporting.ReportCompiler.CompileReport (contexto ICatalogItemContext, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
--- Fin del seguimiento de la pila de excepción interna ---
en AspNetCore.Reporting.ReportCompiler.CompileReport (contexto ICatalogItemContext, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
en AspNetCore.Reporting.LocalService.GetCompiledReport (PreviewItemContext itemContext, reconstrucción booleana, ControlSnapshot y snapshot)
en AspNetCore.Reporting.LocalService.CompileReport ()
en AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport ()
en AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession ()
--- Fin del seguimiento de la pila de excepción interna ---

@ststeiger alguna novedad sobre la biblioteca de informes de AspNetCore. He estado buscando una solución para crear archivos PDF a partir de archivos RDL en .NET Core desde hace días y la única solución que encontré fue AspNetCore.Reporting, que luego descubrí que solo funciona en Windows y las modificaciones que hizo e informó aquí son muy atractivas , también porque estoy teniendo bastantes problemas al usar subinformes y no puedo depurar AspNetCore.Reporting sin la fuente, que tiene :) ... Me interesaría mucho ayudarlo con esa biblioteca para mejorar los bits que faltan ( y para finalmente poder depurarlo ...)

@OkunevPY : Es posible que esto sea causado por una de las funciones de administración de memoria que se utilizan para almacenar los datos de origen de datos de forma segura. En Linux, acabo de apagarlo: almacenar datos sin cifrar. Entonces funciona, aunque no es seguro. Sin embargo, tienes que hacer eso en el código ReportViewer. El código de nivel de producción tendría que implementar un método de cifrado / descifrado, lo cual no es difícil, pero prefiero que todas las funciones funcionen primero.

@zillemarco;
La creación de PDF no funciona, todavía (solo funciona en Windows).
Además, si crea cualquier aplicación que implemente con esa dll de ingeniería inversa, técnicamente está haciendo algo ilegal.

Si necesita un PDF generado en Linux, le recomiendo generarlo a partir de HTML con wkHtmlToPdf.
Aquí hay una variante de .NET-Core:
https://github.com/ststeiger/libWkHtml2X
Use solo la variante ejecutable (wkhtmltopdf.exe, wkhtmltoimage.exe a través de input / output-stream)
libWkHtmlToX.ProcessManager(opts)
porque wkhtmltox.dll no funciona en escenarios de subprocesos múltiples, y mi interfaz C # todavía no está completamente libre de errores.

Algunos ejemplos de uso (convertidor.telerik.com para convertir a C #):

  • SVG a 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 a 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

Alternativamente, puede usar PdfSharp para .NET-Core
https://github.com/ststeiger/PdfSharpCore

También he portado la biblioteca PDF completa a NetStandard, que se puede encontrar aquí:
https://github.com/ststeiger/PdfSharpNetStandard
(si no necesita Azure-hosting, le recomiendo que elija PdfSharpNetStandard)

En lo que respecta a ReportViewer-PDF en Linux:
Primero deberá implementar

Solo he hecho GetFontData por el momento, ya que este es el más importante (incrustación de fuentes).
Si puede darme su nombre de cuenta de gitlab (no hub), puedo darle acceso de lectura al repositorio.

@ststeiger Sé que implementar una aplicación con esa biblioteca sería ilegal y no tengo la intención de hacerlo, pero con el código fuente al menos podría depurarlo, entiendo por qué no puedo cargar un subinforme y pasarle datos (lo he intentado con resharper pero es una pesadilla). Si desea darme acceso de lectura al repositorio, me encantaría :) Mi nombre de usuario de gitlab es zillemarco (como aquí en github)

@zillemarco : Te agregó.
Deberías haber recibido un correo electrónico de gitlab, presumiblemente con el enlace al repositorio.

Pruebe ILSpy 4.0 Beta 2 en lugar de Resharper:
https://github.com/icsharpcode/ILSpy/releases

Si necesita depurar dentro de .NET Framework, intente descompilar y depurar en vivo con Rider, el EAP es gratuito:
https://www.jetbrains.com/rider/eap/

@ststeiger recibió el correo electrónico gracias :) ¡Gracias por el consejo también!

@ststeiger Puede dar acceso al repositorio AspNetCore.Reporting for okunevpy?

@OkunevPY : Ha sido agregado. Ver correo.

@ststeiger Gracias.

        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: 'Se produjo un error durante el procesamiento del informe local.; No hay datos disponibles para codificar 1252. Para obtener información sobre cómo definir una codificación personalizada, consulte la documentación del método Encoding.RegisterProvider.'

@Jhonnybmx : Hay un sitio web, llamado google.com, donde pones el mensaje de error y la solución es el primer enlace ...

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);

Hola, me interesa LocalReport en .NET Core para exportar el informe rdlc a PDF.
Para mí, la versión única de Windows está bien por ahora.

Encontré el paquete NuGet AspNetCore.ReportingServices por @ amh1979, que es exactamente lo que necesito.
El problema es que la clase InternalLocalReport en este paquete es interna y necesito acceder a toda la API (como en la implementación original de MS LocalReport) para eq. para usar el evento SubreportProcessing, llame a los métodos LoadSubreportDefinition () o GetParameters ().

Estos métodos no están implementados en la clase AspNetCore.Reporting.LocalReport (en AspNetCore.Reporting NuGet), así que necesito llamarlos directamente.

El ensamblado AspNetCore.ReportingServices.dll ha establecido InternalsVisibleTo para el ensamblado AspNetCore.Reporting.dll.
¿Puedo de alguna manera usar eso como está en https://github.com/amh1979/Reporting/tree/master/AspNetCore.Reporting con el certificado Reporting.pfx (para el cual no tengo una contraseña).

¿Por favor, me puedes ayudar? ¿Cuál es la solución para esto?

@ststeiger También puedes darme acceso al repositorio de GitLab AspNetCore. Mi nombre de usuario de GitLab es holajan.
Gracias

AspNetCore.ReportingServices bajo esta licencia
http://go.microsoft.com/fwlink/?LinkId=826162
Lo he cerrado

¿Alguien puede proporcionar documentación / pistas o sugerencias sobre cómo usar / implementar este paquete? Muchas gracias.

@ststeiger ¿Podría darme acceso al repositorio AspNetCore.Reporting? Estoy intentando que funcione en Linux con PDF.

@holajan , @skivsoft :
Lo siento, estaba de vacaciones, fue un buen viaje a Singapur y Tailandia.
Acceso concedido, debería haber recibido un correo electrónico a la dirección proporcionada a gitlab.

@azharuddinsayed :

cuando intento con el archivo .rdlc, obtengo una excepción
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable 'no es accesible en este contexto porque es' Friend '.'. ' en localreport.Execute ()
por favor, ayúdame

Logré reproducir ese error.
Se requieren los siguientes cambios:


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)

y

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

Además de eso, la siguiente corrección en
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 + "\"")

Entonces el código personalizado funciona, al menos en mi caso.
Actualizado en master.

@ststeiger Gracias por el acceso. ¿Tiene alguna idea de cómo renderizar PDF en Linux? Hay demasiados pinvokes para reemplazar.

@skivsoft : Todavía no hay ninguno.
Deberá reemplazar todos los pinvokes con un equivalente de tipo libre, lo cual es mucho trabajo.

Si solo necesita crear un PDF en Linux, puede probar PdfSharpCore o PdfSharpNetStandard:
https://github.com/ststeiger/PdfSharpCore
https://github.com/ststeiger/PdfSharpNetStandard
Los uso ambos en Linux.
PdfSharpNetStandard es más completo, pero también usa GDI + / libGDIplus, mientras que PdfSharpCore se aleja de System.Drawing.

@ststeiger Gracias por el acceso al repositorio.

Pude hacer que mi informe funcionara (exportar a PDF) en mi aplicación de Windows .NET core 2.2.
Lo hice en una copia de su proyecto ReportViewer_NetStandard, porque eliminé LocalReports y cambié InternalLocalReport a LocalReport y hice la clase pública (necesitaba acceso a la API LocalReport original).

Para mi informe, solucioné dos problemas:
Algunas expresiones de Visual Basic:
ISi - He añadido a la importación Microsoft.VisualBasic.Interaction en _ExprHostBuilder_, cambiado a netcoreapp2.2 donde la clase Microsoft.VisualBasic.Interaction en _Microsoft.VisualBasic.dll_ es interno y ha añadido mi clase Microsoft.VisualBasic.Interaction a Microsoft.VisualBasic1.

Formato : se agregó la importación a Microsoft.VisualBasic.StringsEx en _ExprHostBuilder_, se agregó la clase Microsoft.VisualBasic.StringsEx a Microsoft.VisualBasic1 (porque la clase original Microsoft.VisualBasic.Strings es pública pero sin la función de formato)

System.Environment.NewLine : se agregó una referencia a System.Runtime.Extensions.dll en _ExprHostCompiler_.

Estos son estos cambios en el código:

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

Corregir subinformes con expresiones:
Me di cuenta de que los elementos del subinforme utilizaban ReportRuntime.LoadExprHostAssembly , donde los ensamblados ExpressionHost.dll se almacenaron en caché por nombre, pero el nombre de todos los informes y subinformes es siempre el mismo "_ExpressionHost_". Eliminé este almacenamiento en caché.
Cambios en el código:

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();
                }
            }

Revise estos cambios y, si esto tiene sentido para usted, realice esos cambios también en su repositorio.

Gracias.

@holajan : Si agrego System.String a los espacios de nombres, obtengo:
Ambigous call to Replace - cannot resolve call
y si agrego la clase Microsoft.VisualBasic.Interaction, obtengo:
ambigous call to Microsoft.VisualBasic.Interaction
cuando lo ejecuto en NetCore o .NET Framework 4.
Quizás esto solo funcione en .NET Core 2.2.

Si se almacena en caché incorrectamente, es mejor que no se almacene en caché.
De acuerdo con ese cambio.
Sin embargo, puse el código anterior en #ifdef false (en lugar de eliminarlo).

@ststeiger Edité mi comentario, usando para System.String estaba mal, ahora implementé Microsoft.VisualBasic.StringsEx en su lugar para Format y otras funciones. Lo siento por eso.

Sí, Microsoft.VisualBasic.Interaction solo funciona en .NET Core 2.2., Porque la clase Microsoft.VisualBasic.Interaction está en Microsoft.VisualBasic.dll para .NETCoreApp v2.2 interno , en Microsoft.VisualBasic.dll para .NETCoreApp v2.09 es público pero con método interno IIf .
No sé cómo resolver esto mejor, pero con .NET core 3.0 probablemente se cambiará de todos modos.

@holajan : Hasta luego, esperemos hasta la 3.0
Hice público InternalLocalReport.
Extraño nombre ahora con respecto a su carácter público;)

@holajan : Se agregó Microsoft.VisualBasic.StringsEx, ahora funciona
Tuve que agregar IReadOnlyDictionary para .NET 4, pero eso es solo un comentario menor.
¿Podrías probar si eso funciona contigo?

@ststeiger lo probé.
Debo cambiar #if false a #if true en Microsoft.VisualBasic1._Interaction.cs para que funcione la expresión IIf .
De lo contrario, funciona bien.
Gracias

@holajan : OK, así debería ser. tal vez una definición en la solución sería mejor.

Todos en este hilo deben votar para que se agregue, aquí: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- núcleo

A partir de 2019/03 es la séptima de la función más buscada: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Editar: A partir de 2019/05 es el quinto desde arriba

Editar: A partir de 2019/07, es el cuarto desde arriba

        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: 'Se produjo un error durante el procesamiento del informe local.; No hay datos disponibles para codificar 1252. Para obtener información sobre cómo definir una codificación personalizada, consulte la documentación del método Encoding.RegisterProvider.'

Agregue el siguiente código:
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
Resuelve mi problema

Hola,

Intenté exportar el informe en HTML usando el siguiente código, pero no se está procesando correctamente.

El archivo .rdl contiene un gráfico

He adjuntado una captura de pantalla de Html.

Apreciamos mucho si nos puede ayudar a resolver este problema.

Gracias

PlatForm: ASP.NET Core

public string _reportPath = @ ".. \ RenderReportAPI \ employeeChart.rdl";

string mimtype = "";
int extensión = 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 : ¿Qué
El renderizador html tiene un flujo de salida secundario para CSS.
¿Contiene una imagen codificada en base64? ¿O es solo un enlace a un controlador de imágenes?

@ststeiger
Hola, busque HTML y CSS a continuación
HTML:

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







CSS:

"#rsoReportDiv .A97993c8d452f40d4910a317776d607f616xBc {
borde: 1 pt ninguno Negro;
color de fondo
}

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;

}

Elemento de gráfico de informe
Report chart
Creo que este error causa el problema.

Gracias..

@ststeiger

Hola ¿Alguna actualización?

@chinturathod :
Actualmente estoy trabajando en CEF-pdf como reemplazo de wkhtml2X y en SwissRe Reports.

Tendré tiempo para investigar este proyecto en más de dos semanas, como mínimo.

¿Existe un repositorio (privado o de otro tipo) para el paquete AspNetCore.ReportingServices al que se me pueda conceder acceso?

@clintb : Necesito su nombre de cuenta de git LAB , para poder otorgarle acceso.
Luego, recibirá un correo electrónico a la dirección de correo electrónico de la cuenta de git lab que contiene el acceso al repositorio.

Hola Stefan, mi gitLab es c_l_i_n_t. ¡Gracias!

El viernes 26 de abril de 2019 a las 12:18 p.m. Stefan Steiger [email protected]
escribió:

@clintb https://github.com/clintb : Necesito su nombre de cuenta de git LAB , así que
Puedo concederte acceso.
A continuación, recibirá un correo electrónico a la dirección de correo electrónico del laboratorio de git.
cuenta que contiene el acceso al repositorio.

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/aspnet/AspNetCore/issues/1528#issuecomment-487133308 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ABURO5ILQUEGMZARNW2HNALPSM2M5ANCNFSM4CFRN7MQ
.

@clintb : ha sido agregado.

Hola @ststeiger , si lo desea, otorgue acceso al repositorio a lotatrees. Gracias por tu trabajo y ayuda.

@lotsatrees : Te han agregado.

Gracias Stefan, encantado de invitarte a una buena cerveza en cualquier momento.

Hola @ststeiger , mi gitlab es edgardoreyes. Muchas gracias.

@ststeiger
Mi gitlab es ikourfaln
Gracias

@ikourfaln , @edgardoreyes : Los agregó a ustedes dos; debería haber recibido un correo electrónico a la cuenta de correo que registró con gitlab.

@ststeiger , ¿sería posible agregarme también (Mhirji en gitlab)?

¡¡Gracias!!

@Mhirji : Hecho.

¡¡¡Gracias!!!

¿Por qué no simplemente crear un proyecto de servidor de informes y usarlo como un servicio para cualquier tipo de proyecto?
Su proyecto ASP.NET Core solo necesitará la URL del servicio de informes para mostrar informes.
¿Algún problema con ese enfoque?

@ststeiger, ¿ puedo acceder yo también? (ConstantDisaster en gitlab) gracias de antemano

@ConstantDisaster : agregado.
@mshwf : No, en realidad eso es exactamente lo que quiero hacer, para que podamos ejecutar informes en nuestra propia aplicación y no se necesita un servidor de informes (siempre es un problema con la autenticación de Windows; por algunas razones, los departamentos de TI no pueden agregar nuevos usuarios a un grupo - además de siempre un problema con los paquetes de servicio desinstalados, que no están dispuestos a actualizar a la última versión del servidor SQL porque los clientes quieren omitir una versión, lo que genera inconsistencias entre ReportViewer y ReportServer, nuestro propio administrador de sistemas es demasiado perezoso para instalar algo, etc.). Solo falta tiempo, como siempre. Además, son los primeros días soleados del verano, aquí en el noroeste de Europa, y no me los quiero perder.

@ststeiger ¿Hay mejores alternativas? (¡Intenté leer este hilo, pero es muy largo!)
¿También podría concederme acceso al repositorio de GitLab (mshwf)?
Gracias

Por favor, apoye esta solicitud , ¡ojalá Microsoft nos escuche!

Hola @ststeiger , ¿me agregarías también?
Mi nombre de usuario de gitlab es k3flo
Muchas gracias
Vielen Dank 😊

@ststeiger gracias por agregar, entonces, ¿cómo empiezo a usar esto de nuevo? en un proyecto de asp net core? Pensé que tenía un readme o algo así, gracias de nuevo.

@ConstantDisaster : Hay un "ejemplo", en AnyWebReporting\Any_TestCode\TestReport.cs .
Muestra cómo representar un informe con parámetros y conjuntos de datos en un PDF.

En una palabra:
1) Cree un diccionario para los parámetros del informe:

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

2) Agregue todos los parámetros que tiene en su informe al diccionario, por ejemplo

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

3) Cree un nuevo informe basado en LocalReport y cargue

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

Luego, para todos los conjuntos de datos que solo se usan en parámetros, puede agregar una tabla de datos vacía (no NULL)
lr.AddDataSource("SEL_Standort", new System.Data.DataTable());

Y para cada conjunto de datos que se utiliza, debe completar una tabla de datos con el resultado de la consulta para ese conjunto de datos y agregar el conjunto de datos a las fuentes de datos:

lr.AddDataSource("DATA_Schluesselbestandeskontrolle", dt);

Luego, puede ejecutar el informe, obtener el resultado y escribirlo en algún lugar, por ejemplo, unidad d:

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

Agregué una página HTML de ejemplo que imita el diseño de la interfaz de informes ReportViewer 2014 y 2017, que tenía en una versión preliminar. Si vuelve a buscar desde git, lo encontrará en:

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

Y eso es.
Si necesita mostrar el informe en la web, puede renderizarlo en html pasando la enumeración respectiva a en lr.Execute (RenderType.HTML5_0 o HTML4_0 o Mhtml) y pasar el número de página correcto. El resultado (HTML) está en MainStream y el CSS está en SecondaryStream.

Sin embargo, al conectar el index.htm de ReportViewer con lr.Execute por JavaScript, debe hacerlo usted mismo, por el momento. No he podido hacer eso todavía. Por ahora, lo necesito para generar archivos PDF para adjuntarlos a los correos electrónicos.

@ k3flo @mshwf : Añadido.

@mshwf :

@ststeiger ¿Hay mejores alternativas? (¡Intenté leer este hilo, pero es muy largo!)

No que yo sepa, de lo contrario lo estaría usando.
Tal vez veamos algo a este respecto después de la versión .NET Core 3.1 (LTS) , porque entonces el camino sería libre para crear un ReportViewer solo para Windows basado en .NET Core.

Sin embargo, tal cosa sería tanto un bricolaje como este proyecto, por lo que tal vez se tomen el tiempo para eliminar todo el código System.Drawing (y las llamadas de WinAPI a GDI +), y hacerlo correctamente, es decir, multiplataforma. Aunque en mi opinión, esto es poco probable. Sin embargo, no estoy triste de ser sorprendido positivamente (tos).

La cuestión es que los informes pueden contener código VB y la compatibilidad con VB en .NET Core (<3) es, en la actualidad, cuestionable, en el mejor de los casos. Esto será (= teóricamente debería ser) rectificado por .NET Core 3, y si hacen un ReportViewer, lo más probable es que esperen hasta el lanzamiento de LTS, al menos.

@mshwf :
No es necesario que lea todo este hilo.
Todo lo que necesita hacer es clonar el proyecto y ver el informe de ejemplo (aunque no tendrá la base de datos para ejecutarlo).

¿Podrías agregarme a gitlab por favor?
dcga

@dcga : Añadido.

Hola, ¿podrías agregarme a tu gitlab? Ahora estoy convirtiendo el informe al proyecto ASP.net Core.

@ ericyu67 : ¿Supongo que el nombre de su cuenta de gitlab es ericyu? En ese caso, fuiste agregado.

Eso es correcto, gracias.

@ststeiger, ¿ podrías
rodrigorrl

@rodrigorrl : agregado.

@ststeiger, ¿ podrías

@myersBR : Hecho.

@ststeiger, ¿ puedes

@acofalc : Añadido @ aco.mit

Hola, @ststeiger , agrégame : oblin228, gracias.

¿Alguna noticia sobre esto? Estoy usando ASP.NET Core y me niego a volver a los formularios web. Tengo un proyecto de informes y envío la URL del servidor de informes a mi aplicación para descargar el archivo. El problema es que constantemente solicita la autenticación de Windows y me gustaría evitar esto ...

@oblin : Agregado.

@jfcaldeira : Mientras ejecute la aplicación en Windows, el visor de informes en gitlab debería funcionar, más o menos (problema abierto con imágenes en salida HTML, hasta ahora). Ejecútelo en Linux, y debería funcionar siempre que no use PDF, TIFF o PowerPoint como formato de salida (no sé sobre Word), pero Excel, html, xml y json también funcionaron en Linux (en mi prueba de 1 informe: no puedo decir si nada explota si usa el conjunto de funciones completo).

Pero si su problema es la autenticación de Windows en SSRS, ¿por qué no usa la seguridad personalizada (también conocida como autenticación de formularios SSRS)?

Para eso, vea aquí:
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

Es posible que deba iniciar la sesión del usuario con una publicación de formulario en JavaScript y establecer una política P3P (en SSRS a través del módulo http) para que la cookie de autenticación SSRS persista en IE en todos los dominios ... si usa directorios virtuales y tiene 2 aplicaciones en un SSRS, la cookie de autenticación de application1 [que está en el dominio SSRS] sobrescribirá la cookie de autenticación de application2, que también está en el dominio SSRS)

@oblin : Agregado.

@jfcaldeira : Mientras ejecute la aplicación en Windows, el visor de informes en gitlab debería funcionar, más o menos (problema abierto con imágenes en salida HTML, hasta ahora). Ejecútelo en Linux, y debería funcionar siempre que no use PDF, TIFF o PowerPoint como formato de salida (no sé sobre Word), pero Excel, html, xml y json también funcionaron en Linux (en mi prueba de 1 informe: no puedo decir si nada explota si usa el conjunto de funciones completo).

Pero si su problema es la autenticación de Windows en SSRS, ¿por qué no usa la seguridad personalizada (también conocida como autenticación de formularios SSRS)?

Para eso, vea aquí:
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

Es posible que deba iniciar la sesión del usuario con una publicación de formulario en JavaScript y establecer una política P3P (en SSRS a través del módulo http) para que la cookie de autenticación SSRS persista en IE en todos los dominios ... si usa directorios virtuales y tiene 2 aplicaciones en un SSRS, la cookie de autenticación de application1 [que está en el dominio SSRS] sobrescribirá la cookie de autenticación de application2, que también está en el dominio SSRS)

Hola, gracias por responder sobre mi problema. No he oído hablar de este visor de informes en gitlab, ¿me pueden mostrar un ancla?

Y sobre la autenticación de Windows, el problema es que tengo al usuario autenticado usando la autenticación de cookies en mis aplicaciones en ASP.NET Core y la solución para que los usuarios accedan al informe es básicamente pasar la URL directa con parámetros al href de un ancla y elija PDF como formato también. Estaba tratando de encontrar una manera de no solicitar la autenticación al usuario porque es molesto para el usuario final tener que autenticarse dos veces. Ya estoy usando una cuenta específica solo para el acceso a la fuente de datos, eso es uno hacia abajo.

Hola, @ststeiger : mi gitlab es arunputhran. ¿Me pueden dar acceso por favor? ¡muchas gracias!

Volviendo a publicar esto porque está enterrado en todas las solicitudes de "darme acceso a gitlab".

Todos los que se encuentren con este hilo deben votar por .NET Core SSRS que se agregará, aquí: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for -asp-net-core

Comenzó séptimo desde arriba, y ha subido al cuarto desde arriba, la característica de SQL Server más solicitada (https://feedback.azure.com/forums/908035-sql-server?category_id=325159)

Editar: Debido a esta publicación, ahora está en el tercer lugar

Aunque no estoy seguro de si ayuda ...

@arunputhrankyc : Añadido.

@ k290 : No, como puede ver, un tema oscuro para SQL Server Management Studio 2017 es claramente más importante: scream:: man_facepalming:: woman_facepalming:
Aparentemente, todavía no han oído hablar de SQL-ops-studio / AzureDataStudio .

Creo que, con ese espíritu, alguien debería agregar un diseño plano a esa lista de deseos, solo como una broma.
Lamentablemente, todavía no es el 1 de abril: guiño:

por cierto, obtengo informes en formato pdf de una API web y no utilizo ningún bit de wcf.
solo llamadas soap / asmx y llamadas http.
al hacerlos paso credentails sin ningún problema.
mi código es asp.net 4.6 / web api 2
Si quieres ver lo que hago, puedo poner un código en un github la próxima semana para que lo revises.
Estoy llamando al servidor de informes 2016, pero la mayor parte de lo que estoy haciendo funcionará con las versiones anteriores de SSR.

Hola, leí este comentario tuyo sobre cómo estás manejando SSRS. También estoy haciendo algo similar, tengo un ancla en una aplicación ASP.NET Core que tiene la URL directamente al informe con los parámetros incluidos y la extensión de formato. Sin embargo, el problema es que solicita la autenticación de Windows. ¿Hay alguna manera de dejar de preguntar esto ya que los usuarios ya iniciaron sesión en mi aplicación usando la autenticación de cookies? Ni siquiera me importa mostrar el informe mientras esté descargado, pero sería bueno omitir la autenticación

@arunputhrankyc : Añadido.

@ k290 : No, como puede ver, un tema oscuro para SQL Server Management Studio 2017 es claramente más importante 😱 🤦‍♂ 🤦‍♀
Aparentemente, todavía no han oído hablar de SQL-ops-studio / AzureDataStudio .

Creo que, con ese espíritu, alguien debería agregar un diseño plano a esa lista de deseos, solo como una broma.
Lamentablemente, todavía no es el 1 de abril 😉

Bueno, seguramente mataría por un tema oscuro para SSMS, pero me comería mis manos desnudas por ese SSRS. La cantidad de trabajo que se ahorra al representar datos agrupados directamente desde SQL es asombrosa.

Gran solución, por favor agrégame en gitlab: @kholossok , gracias

Por favor agrégame también en gitlab: @EMaderbacher

@kholossok , @EMaderbacher : Añadido.

Agrégame también por favor @jfcaldeira

@jfcaldeira : Necesitas darme una cuenta de git lab .
Esta es una cuenta de git hub .
Es gratis. https://gitlab.com
Los repositorios privados no eran gratuitos en github en ese momento.

@ststeiger
Los repositorios privados ahora son gratuitos en GitHub, la limitación está en la cantidad de colaboradores.

@jfcaldeira : Necesitas darme una cuenta de git lab .
Esta es una cuenta de git hub .
Es gratis. https://gitlab.com
Los repositorios privados no eran gratuitos en github en ese momento.

He creado una cuenta con el mismo nombre de usuario.

@jfcaldeira : Añadido. Debería haber recibido un correo electrónico con la información de acceso.
@ikourfaln : Lo sé. Sin embargo, no sabía que había una limitación para 3 colaboradores en repositorios privados de github. Es bueno saberlo, gracias .

Limitaciones de Gitlab:

Para celebrar las buenas noticias de hoy, hemos aumentado permanentemente nuestro límite de almacenamiento por repositorio en GitLab.com de 5 GB a 10 GB. Como antes, los repositorios públicos y privados en GitLab.com son ilimitados, no tienen límite de transferencia e incluyen colaboradores ilimitados.

¿Puedo ser agregado también? Mi cuenta de GitLab es barryjsilver. ¡Gracias!

¿Me pueden agregar por favor? @jyanosu ¡ Gracias!

@BarryJSilver : Añadido.

@jyanosu : necesito la cuenta .com de git lab , no github.

@ststeiger Vaya, solo configúralo ... mismo nombre de usuario

@jyanosu : Añadido.

@ststeiger ¿puedes agregar mi cuenta de gitlab @ kanichi123?
¡Gracias!

@ kanichi123 : Añadido.

@ststeiger por favor mi cuenta también sheryever

@sheryever : Añadido.

@ststeiger, por favor, ¿pueden agregar mi cuenta de gitlab @PentaTech?
¡Gracias!

@ststeiger, ¿ podrías
¡Gracias!

@PentaTech , @ g-rad: agregado.

@ststeiger buen esfuerzo en esto, ¿podría agregar la cuenta de gitlab brad0000?

@ brad0000 : Hecho.

Hola @ststeiger , ¿podrías

@wyepez : Añadido.

@ststeiger ¿Podrías

Nombre de usuario de Gitlab: choudeshell

@choudeshell : Añadido.

¿Me pueden agregar? ¡Gracias!

¿Su solución funciona con .rdlc (así como con .rld del lado del servidor)? Gracias

¿Su solución funciona con .rdlc (así como con .rld del lado del servidor)? Gracias

@mpirritano : Sí, de hecho, no hay mucha diferencia entre RDL y RDLC.
Pero es solo web. Sin formularios de Windows.
Necesito una cuenta de git lab para agregarte, no github.

@ststeiger Gracias - He creado una cuenta de GitLab ahora : @mdpirrit

Eso es genial, solo lo necesito para ASP .NET Core dirigido a .NET Core. ¡Gracias!

@mpirritano : Agregado, debería haber recibido un correo electrónico a la cuenta de correo electrónico que usó para registrar gitlab.

Entendido; ¡Gracias!

@ststeiger funciona muy bien, excepto que no puede representar gráficos. - muestra el área del gráfico con el error: " No se pudo cargar el archivo o ensamblaje" System.Windows.Forms, Version = 4.0.0.0 "

¿Es esta una limitación conocida o me falta algo?

Gracias

@ststeiger Además, no parece que los subinformes sean compatibles. es decir, no parece haber un controlador de eventos de procesamiento de subinformes para agregar fuentes de datos a la instancia del subinforme

Gracias

¿Me pueden agregar? ¡Gracias! @ashabyralieva

¿Su solución funciona con .rdlc (así como con .rld del lado del servidor)? Gracias

@mpirritano : Sí, realmente no hay mucha diferencia entre RDL y RDLC.
Pero esto es solo una red. Sin formularios Windows Forms.
Necesito una cuenta de Git Lab para agregarte, no GitHub.

¿Me pueden agregar? ¡Gracias! @ashabyralieva

@azikaa : Hecho. Добавлено;)

@mpirritano :

¿Es esta una limitación conocida o me falta algo?

Sí, era consciente de una limitación que podía existir.
Y también tiene un problema con la salida de imágenes en HTML.
Puntos abiertos.
Ni siquiera pensé en subinformes todavía.
Lamentablemente, también tenemos algunos de ellos, por lo que este también será mi problema.
Hablando de eso, ni siquiera sé cómo se manejan los subinformes en el ReportViewer normal en el marco completo, especialmente porque pueden ser recursivos.

Probablemente tenga un problema en alguna parte, porque "System.Windows.Forms, Version = 4.0.0.0" no existe en esa versión en .NET Core, y además, el ensamblado se llama System.NetStandard.Forms en el ReportViewer para .NET Core. Podría funcionar en un marco completo, porque existe System.Windows.Forms, Version = 4.0.0.0.

El problema con System.Windows.Forms probablemente se puede rectificar tan fácilmente como poner el nombre del ensamblado y la versión (donde sea que se esconda en el código fuente) en un ifdef, los subinformes en lugar de eso, supongo.

Todavía tengo que terminar un servicio de envío de informes esta semana, por lo que es posible que pueda ver el problema System.Windows.Forms en algún momento de la próxima semana.

En lo que respecta a los subinformes: son una mala idea de todos modos, tienden a crear problemas con PDF y Excel, y en caso de que solo tenga 1 informe, recomendaría ver si de alguna manera no es posible eliminar el subinforme por completo de alguna manera. y hacer que todo esté contenido en un informe.

Добавлено
¿Cómo obtener la base de datos COR_Basic_SwissLife_UAT?

: rofl: Jaja, bueno, no es así, ese DB es confidencial.
Pero puede hacer su propio informe de ejemplo, utilizando su propia base de datos.
Debería ver en el ejemplo cómo usarlo.

@ststeiger Gracias. En realidad, veo que hay un evento SubreportProcessing definido en AsNetCore.Reporting.InternalLocalReport. Puedo intentar crear una interfaz pública para esto y ver si puedo pasar fuentes de datos a subinformes. Puede que no llegue a esto hasta la próxima semana también ...

También trato de evitar los subinformes, pero los he encontrado necesarios en los casos en los que necesita una sección repetida dentro de una sección repetida. Con respecto a Excel, es posible representar cada instancia de subinforme como una hoja de trabajo en Excel con rdlc / rdl

Volviendo a publicar esto para los recién llegados.

Todos en este hilo deben votar para que se agregue, aquí: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- núcleo

En marzo de este año fue séptimo desde la cima.

Ahora, lo tenemos hasta el segundo lugar desde la parte superior de las sugerencias de SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

¿Podemos vencer al modo oscuro?

@ststeiger De hecho, tuve un poco de tiempo hoy y pude presentar con éxito informes con subinformes en .docx, .xlsx y .pdf.

Como prueba rápida en mi copia local, cambié el modificador de acceso de la propiedad "localReport" de la clase "LocalReport" de "interno" a "público". Entonces podría escribir un controlador para el evento "SubreportProcessing" como siempre lo haría (donde leería el valor del parámetro en la instancia del subinforme y lo usaría para filtrar un conjunto de datos que pasaría a la fuente de datos de la instancia del subinforme)

No tengo idea de cómo solucionar el problema de representación de gráficos con .NET Core; así que si alguna vez logras llegar a una solución, sería asombroso. Pero aparte de eso, creo que su solución hace todo lo que necesito que haga (personalmente nunca renderizo informes en formato HTML)

Gracias

exportar palabra, sobresalir no woking?
FormatException: el encabezado contiene valores no válidos en el índice 0: ''

el servicio es muy lento. ¿Qué se puede hacer? Por favor ayuda....

Hola a todos, acabo de terminar de escribir un puerto personalizado del control del visor de informes utilizando ReportExecutionService.asmx que está integrado en SSRS y estaba apuntando a ASP.NET MVC. Alguien sugirió portarlo a .NetCore y MVC, así que lo completé. Pruébelo y háganme saber lo que piensan: https://github.com/alanjuden/MvcReportViewer

Alan

exportar palabra, sobresalir no woking?
FormatException: el encabezado contiene valores no válidos en el índice 0: ''

el servicio es muy lento. ¿Qué se puede hacer? Por favor ayuda....

@azikaa : ¿Está utilizando MvcReportViewer o AspNetCore.ReportViewer?

Estamos cerrando este problema porque no es directamente relevante para este repositorio y, según los comentarios aquí, el equipo de SSRS ya está al tanto de estos comentarios. Dada la cantidad de comentarios que ha recibido, ahora es inmanejable.

La respuesta de @ k290 es la más procesable aquí, así que siga su sugerencia aquí :

Volviendo a publicar esto para los recién llegados.

Todos en este hilo deben votar para que se agregue, aquí: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- núcleo

En marzo de este año fue séptimo desde la cima.

Ahora, lo tenemos hasta el segundo lugar desde la parte superior de las sugerencias de SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

¿Podemos vencer al modo oscuro?

¿Fue útil esta página
0 / 5 - 0 calificaciones