Aspnetcore: Relatórios Asp.Net Core (SSRS)

Criado em 2 jun. 2016  ·  269Comentários  ·  Fonte: dotnet/aspnetcore

Estou trabalhando no aplicativo ASP.NET Core e não consigo encontrar uma solução para exibir relatórios SSRS. Com as ausências de "Microsoft.Reporting.WebForm" não funciona mais. Qual é a prática recomendada para exibir relatórios SSRS na web no ASP.NET Core

External

Comentários muito úteis

Quase 2 anos. O Core 2.0 é lançado. Equipe SSRS, acorde.

Todos 269 comentários

Com o Core ainda em RC (RTM até o final do mês), não acho que um cenário de SSRS esteja planejado nos próximos 6 meses, mas não faço parte da equipe.

Eu geraria esses relatórios no lado do cliente usando algumas bibliotecas javascript ou pré-geraria esses relatórios.

Se você precisa de algo mais "integrado", pode verificar este pacote da comunidade:

https://github.com/ilich/MvcReportViewer

Pela aparência do problema https://github.com/ilich/MvcReportViewer/issues/121 , eles estão interessados ​​em integrá-lo, mas sem sucesso até agora.

Não entendo por que as principais iniciativas da dotnet e do ASP.net estão mantendo silêncio sobre esse assunto em todos os anúncios anteriores. É como
[Os relatórios não são uma grande preocupação para os desenvolvedores e eles podem lidar com isso usando html e classes css de impressão]
atualmente, estamos migrando um pequeno erp com muitos arquivos ssrs rdlc e a abordagem css não está funcionando bem em relatórios entre navegadores.
por outro lado, na semana passada, a microsoft lançou o ssrs 2016 com o visualizador html5 puro que eliminou a necessidade de instalação do activex [que era a única desvantagem de usar ssrs em um navegador não-ie]
O visualizador ssrs 2016 se encaixa perfeitamente no sistema central do asp.net ecológico
mas nenhuma declaração oficial sobre o suporte básico do asp.net foi declarada.

está tudo bloqueado por System.Drawing ?? porque mesmo o itextsharp não tinha lançado uma biblioteca até agora.
se for System.Drawing, pelo menos a implementação do Windows pode ser concluída antes de [linux e OSX], a fim de aumentar a adoção do desenvolvedor do Windows atual, em vez de esperar pela implementação completa de plataforma cruzada para System.Drawing

Espero que esta postagem faça a equipe reconsiderar algumas prioridades para habilitar ssrs no núcleo do asp.net

com respeito ao MvcReportViewer mencionado no post anterior (é um wrapper em torno do visualizador de webforms) e ajudou muitos desenvolvedores de mvc no passado a superar a falta de visualizador de relatório de mvc em mvc1 para mvc5 [Obrigado, ilich], espero ver uma solução completa porque ssrs não era uma prioridade de primeira classe e as pessoas mantiveram bastante sobre isso no mvc pré-core.

Por favor, desenvolvedores,
encaminhe este assunto aos seus colegas para que comentem.
isso pode dar uma prioridade para ele e motivar a equipe a fazer algo.

@ ddddddddeee22211 É um V1.

Você não fornece suporte para SSRS inicialmente. O suporte com SSRS provavelmente viria da equipe SSRS e não da equipe .NET. Já que ainda nem saímos do RC, não vejo isso como um recurso crítico no V1.

Se você precisar fazer relatórios, posso recomendar apenas a versão de formulários da web? Sim. É velho. Mas pelo menos funciona e tem suporte.

Se você precisar de relatórios X-Plat, recomendarei algo como Chartist . Ele permite que você gere gráficos diretamente no cliente. Adicione um arquivo CSS para fins de impressão e boom. Você tem relatórios que podem ser impressos.

da sua perspectiva, pode não ser crítico
mas alguns outros desenvolvedores o consideram muito importante para seus projetos porque, uma vez que desenvolvem um aplicativo e o executam, as tarefas de desenvolvimento ficam paralisadas e as tarefas de relatório se tornam tarefas de rotina diária. também alguns projetos lidam com a criação de relatórios para a equipe de BI (business intelligence) que sabe como usar ssrs, mas não tem uma ideia sobre o núcleo do asp.net.

o objetivo da minha postagem era entender a posição do ssrs no ecossistema central do asp.net. ou se será ignorado como em mvc1 a mvc5. A equipe ssrs está dentro da microsoft e a equipe principal do asp.net pode discutir o problema com eles.
o que me deixou louco foi quando vi a nota de lançamento do ssrs 2016 na semana passada sem mencionar nada sobre o núcleo do asp.net. enquanto, por outro lado, você vê suporte contínuo para azure no asp.net core.believe me se não aumentarmos a demanda por ssrs, ele será ignorado como no mvc 5 anterior.

seu conselho sobre o uso de formulários da web é um exemplo sobre como desacelerar a adoção da iniciativa central. pelo menos, se eu tivesse uma declaração sobre se ela será apoiada ou não, poderei tomar decisões estratégicas a respeito.

obrigado pela dica chatist. Vou dar uma olhada e espero que você tenha entendido meu ponto de vista.

@ ddddddddeee22211 Ahhh ... então não posso responder.

No momento, a única maneira de fazer os componentes do SSRS funcionarem no ASP.NET é em WebForms.

Se você deseja a posição estratégica deles ou se eles irão apoiá-la, precisaremos esperar a resposta de um funcionário da MS.

Talvez possamos / cc @coolcsh ? Ele pode não responder aqui, mas um post no blog esclarecendo a posição seria bom.

Na equipe SSRS, estamos cientes das limitações dos WebForms ASP.NET e estamos investigando e trabalhando ativamente em novas opções para o controle do Report Viewer
obrigado

@jtarquino

Obrigado pela resposta cara!

Queríamos uma alternativa desde MVC. : stick_out_tongue_winking_eye:

Isso simplesmente fez o meu dia. [~ final feliz ~]
Obrigado @jtarquino , @MaximRouiller por todo o esforço.

@jtarquino
Isso parece ótimo :-)

Você pode dizer algo sobre quando vai lançar a primeira versão da "nova opção" para o Report Viewer Control?
(Existe algum roteiro / plano para isso?)

Br.
Boe

Infelizmente, não tenho um cronograma para compartilhar no momento

você tentou usar uma biblioteca instalando um pacote no console do gerenciador de pacotes e digite o seguinte comando na janela de comando.

PM> Install-Package ReportViewerForMvc
embora eu tenha experimentado formulários da web e eles parecem muito bons.

untitled

@bethwellagat
novamente disparar o erro " a dependência ReportViewerForMvc não oferece suporte ao framework .NetCoreapp "
notas:
trabalhando no projeto ASP.NET Core

@jtarquino ping nisto. Parece que há mais interesse: https://github.com/aspnet/Mvc/issues/5332

@jtarquino BTW se você quiser iniciar algumas discussões com minha equipe, por favor, envie um e-mail para que possamos

Ohhh eu gosto! A bola está rolando! 😀

Olá a todos, acabei de escrever uma porta personalizada do controle do visualizador de relatório usando ReportExecutionService.asmx que está embutido no SSRS e estava visando a ASP.NET MVC. Alguém sugeriu portá-lo para .NetCore & MVC, então concluí isso. Experimente e me diga o que vocês acham: https://github.com/alanjuden/MvcReportViewer

Alan

Parece que já se passaram cerca de três meses desde que ReportViewer em ASP Netcore MVC foi discutido aqui. Estou trabalhando com a versão que Alan Juden forneceu em um projeto que estou mudando de WinForms para netcore. Há algum sinal de que a Microsoft está se preparando para fornecer suporte SSRS ReportViewer de primeira classe ou eles colocaram o SSRS no mesmo armário que colocaram o Visual FoxPro alguns anos atrás?

Algum progresso MS? A melhor opção por enquanto é usar uma ferramenta de terceiros como Telerik Reports para renderização do navegador e back-end SSRS para assinaturas de relatórios. Talvez como o ddddddddeee22211 escreveu, o SSRS 2016 já tem capacidade via mecanismo de renderização HTML5, mas não existe documentação?

Ei @Eilon.

Alguma notícia desde setembro? Especialmente porque vocês lançaram o 1.0 (parabéns!), A pressão deve ter diminuído um pouco.

Algo que você pode compartilhar?

/ cc @jtarquino

Nada que eu possa compartilhar ainda, assim que eu tiver novidades sobre o .NET core, vocês serão os primeiros a saber.
Como você mencionou, acabamos de lançar o nuget mais recente para o controle ASP.NET Webforms e Winforms

Eu gostaria de adicionar minha sugestão à equipe também ... Este é um grande problema. Agradeço a solução de AlanJuden, mas precisamos de uma solução "oficial" ... Considerando que o núcleo 1 já foi lançado há meses, seria útil ter algumas palavras sobre o status disso. Se você pudesse nos avisar sobre o cronograma para uma solução, seria ótimo. Este problema é grande o suficiente para nos impedir de usar o núcleo mvc. Uma nota. Nós realmente precisamos de uma solução que contorne a necessidade de os usuários fazerem login no servidor ssrs. É por isso que meu projeto precisa usar o reportviewer atual (usando o reportviewer, temos o projeto mvc que fornece um login padrão para o servidor ssrs para todos os usuários)

Sql Server 2017 é uma amostra da comunidade2 agora
E
A versão 2.0 do padrão .net está próxima com o anúncio mais recente
E ainda nenhuma palavra sobre o visualizador de serviço de relatório de núcleo asp.net nativo
Convide outros desenvolvedores para este problema para dar feedback e conscientizar a equipe sobre a necessidade de tal esforço para uma estrutura de obra-prima com a qual todo desenvolvedor sonha.

@jtarquino : existe um fórum ou serviço de usuário para o SSRS?
como os usuários podem entrar em contato com a equipe SSRS?

Obrigado, eu realmente gostaria de obter ajuda para fazer meu novo aplicativo funcionar com o SSRS.
Existe alguma maneira de obter o código usado pelo controle de formulários da web para uma página aspx rasgar?
Gostaria de ver se posso fazer uma visualização angular 2 que “funciona como” e “se parece com” o controle de formulários da web.

Oi,

Estamos procurando migrar alguns de nossos sites etc para o asp.net core, mas alguns incluem um SSRS Report Viewer Control. Há algum progresso em um controle de visualizador de relatório para o núcleo .net?

obrigado
Tim

se você está visando Full .NET 4.xe não .NET Core, leve este # 2022 em consideração antes de mudar para ASP.NET Core.
ASP.NET Core 2 não oferece suporte a Full .NET 4.x

@ikourfaln. Em vez disso, um ponto discutível neste estágio, visto que não há nenhum reportviewer no núcleo do asp.net para quebrar. Com as próximas mudanças no Q3 no asp.net core 2, bem como no padrão .net 2 com os shims de compatibilidade que permitem direcionar a estrutura .net, eu acho que é altamente improvável que a Microsoft escreva um reportviewer para o atual asp.net core 1.1.

Atualmente, eu tentei entrar nas extensões de autenticação para SSRS e descobri que é uma verdadeira bagunça tentar e mudar, você pode colocar um novo auth / login, mas quando você tentar habilitar o CORS para que um aplicativo da web possa chamar SSRS para executar um relatório, o navegador não consegue fazer uma solicitação de preflight OPTIONS funcionar e isso encerra toda a ideia.

agora estou fazendo um aplicativo de formulários da web ao qual estou adicionando suporte OpenId Connect para que eu possa ter o SSO funcionando entre meu novo aplicativo angular e meus relatórios

em seguida, verei se consigo de alguma forma reuni-los com o hackery iframes ou algum outro meio.

gostaria que a microsoft atualizasse o ssrs para funcionar melhor com a nova tecnologia da web.

outra linha de pensamento: SSRS KPI e relatórios móveis: há alguma maneira de usá-los em um aplicativo da web ??

@alanjuden Alguma chance de configurar seu pacote para habilitar a renderização de relatórios rdlc? Instalar o Reporting Server e gerenciá-lo para cada cliente é uma dor real.

@IonRobu , posso estar louco ... mas não sou assim tão louco! : P

O verdadeiro motivo pelo qual não farei isso é porque tornei apenas o visualizador de front end do visualizador de relatório. Estou confiando inteiramente no SSRS para renderizar o relatório e me devolver os dados do relatório por meio da API SSRS. Portanto, é necessário ter o back-end do servidor de relatório. Desculpe, mas isso seria muito mais trabalho do que estou procurando neste projeto. Criei meu MvcReportViewer como uma solução fácil para contornar as dores de trazer a versão ASP.NET WebForms do controle.

Servidor de relatórios ou RDLC, denominado "relatórios de clientes"
servidor de relatório é mais trabalhoso para configurar e gerenciar sim, é verdade.
mas tem vários benefícios:

os relatórios são renderizados em um servidor back-end, que retira a carga de trabalho dos servidores web front-end.
os resultados de um relatório podem ser descontados e isso pode tirar a carga de trabalho de seu servidor sql de produções.
relatórios complexos podem ser executados em uma programação e funcionam em um momento em que poucos usuários estão no sistema e
as solicitações podem então ser atendidas a partir desse instantâneo pré-compilado.
também usando SSRS, as cadeias de caracteres de conexão do servidor sql permanecem no servidor de relatório e não precisam ser gerenciadas no arquivo de configuração do servidor web
também o servidor SSRS se torna um ponto central para o qual os autores de relatórios podem publicar e todos os usuários podem obter os relatórios do servidor.
O SSRS pode configurar o envio automático de relatórios por e-mail para os usuários, você pode enviar por e-mail um link para o servidor de relatório para alguns usuários e um arquivo pdf, word ou excel para outros.

também aumentando a escala, se você precisar atender a mais usuários, pode ser necessário adicionar mais servidores web antes de precisar de mais servidores de relatório; então, não é necessário copiar um grande número de arquivos rdlc para todos os servidores web.

Então, sim, se você tiver apenas alguns relatórios e não precisar de nenhum dos benefícios, pode usar o rdlc.
mas para um sistema maior que precisará servir muitos relatórios para muitos usuários, o servidor SSRS tem alguns benefícios realmente bons.
Além disso, a API do SSRS é muito poderosa para trabalhar, você pode chamar a API para retornar um PDF de relatório, por exemplo, sem a necessidade de ter nenhum formulário da web do lado do cliente ou controles do visualizador de mvc.
a api também pode gerenciar os relatórios, enviá-los ao servidor, definir permissões e listar os relatórios.
no trabalho, estou usando a API para permitir que nosso aplicativo cliente liste os relatórios que o usuário pode executar, para verificar os parâmetros de que o relatório precisa e, em seguida, execute o relatório para o usuário.

Portanto, dê uma boa olhada nos benefícios não apenas na sobrecarga administrativa.

@figuerres
Os relatórios de clientes se destacam em um contexto diferente daquele que você descreveu
Muitos clientes não usam servidor de relatório e não têm pessoal qualificado para administrar e manter seus problemas
Além disso, quando você envia um produto com relatórios personalizados (60+) para cada cliente, você enfrenta uma sobrecarga de implantação de aplicativos + relatórios de implantação
Muitos usuários não são técnicos que podem entender os relatórios gerados pelo servidor e processados ​​de acordo com a resposta sem visualizá-los primeiro (a fatura, por exemplo, pode ser verificada pelo visualizador facilmente do que baixar várias faturas corrigidas em guias diferentes)

Como você pode ver, é mais fácil para o usuário se adaptar ao visualizador de relatório simples do que a cenários complexos
Também desenvolveu incontáveis ​​esforços para desenvolver relatórios de clientes e agora eles se tornaram inúteis em seu uso real

Espero que a equipe da Microsoft entenda nossa dor

Não tenho certeza se entendi tudo o que você disse, mas sim, os relatórios do cliente são úteis. Eu estava apenas descrevendo as razões para o servidor, por que vale a pena dar uma olhada. Sua milhagem pode variar e tudo isso.

hoje o net standards 2 é lançado com mais superfície de API para system.drawing
isso poderia ser uma chance para uma palavra da equipe srss sobre o visualizador ssrs para o núcleo asp.net?

Minha empresa depende muito de documentos de exportação de relatórios RDLC em formato PDF. Não ser capaz de fazer isso no .net core é basicamente um bloqueador para nós, usando o .net core e executando em outras plataformas como o docker.

Espero de todos os codificadores encorajar seus colegas a comentar sobre este assunto aqui

Para quem ainda procura uma solução:
Se o Java estiver instalado, você pode incorporar o Eclipse BIRT ou JasperReports.
Dos dois, JasperReports é definitivamente a melhor alternativa SSRS (um pouco mais complicado, mas também muito mais poderoso / perfeito em pixels).
Possui um servidor de relatórios autônomo e embutido, capaz de acessar qualquer fonte de dados JDBC, e também BigData como Cassandra ou Apache Spark (SparkSQL).

Ele fornece relatórios e análises que podem ser incorporados em um aplicativo da web ou móvel, bem como operar como um hub central de informações para a empresa, fornecendo informações de missão crítica em tempo real ou programado para o navegador, dispositivo móvel ou caixa de entrada de e-mail em uma variedade de formatos de arquivo.

Você poderia fazer uma implantação independente do Java runtime fornecendo BIRT / Jasper via Launch4j.

@jtarquino alguma boa notícia para .Net Core?

Não posso acreditar que este ainda seja um problema cerca de 15 meses depois de ter sido levantado. Muito desapontado.

Nós realmente precisamos que isso funcione, mesmo um simples ponto em SSRS, ReportName e Params, aberto em DIV ou algo assim. Investimos muito tempo na criação de relatórios SSRS em SQL diretamente e preciso de uma maneira de exibi-los em um aplicativo MVC Core2.0 simples.

Alguma dica?

@cgountanis , Isso funciona para mim:
https://github.com/aspnet/Home/issues/1528#issuecomment -259169426

@cgountanis
você precisa de um pdf do relatório ou relatórios interativos completos como mostra o portal da web ??

posso dar-lhe algumas dicas de como faço a partir de um aplicativo angular

Isso é o que estou fazendo. Usa as credenciais do cliente que podem não funcionar para a maioria.
Redimensionar a página para maior funciona, tornando-a não menor.


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

uma coisa é usar os serviços da web do servidor de relatório, deles você pode obter listas de relatórios e pastas e fontes de dados, etc ... e usar esses dados para construir seus próprios menus de portal / relatório e gerenciar quais relatórios os usuários podem ver em seu aplicativo.
criamos um conjunto de usuários do Windows no servidor de relatório e os usamos para limitar os relatórios que eles obtêm,
mapeou a função de usuários do aplicativo para um usuário do servidor de relatório.

quando executamos um relatório, passamos o usuário do servidor de relatório como o usuário que está executando o relatório, o que é uma droga, pois isso significa que perdemos o "usuário real" a menos que o registremos em nosso código.
mas isso lida com a dependência do servidor de relatório em contas de usuário do Windows. se eles o atualizassem para usar um token jwt e obter funções do token, as coisas seriam melhores para nós.

usamos um iframe para colocar o controle de formulários da web em uma visualização de aplicativo angular, também não é a melhor, mas funciona.
o usuário realmente não consegue ver os hacks que fazemos nos bastidores.

@ ctrl-brk Estou tendo esse problema com o Core 2.0, talvez tenha esquecido alguma coisa. https://github.com/alanjuden/MvcReportViewer/issues/43

@steelwil Obrigado, mas preciso do NetworkCredential personalizado.

@figuerres Exibimos relatórios de um SSRS com firewall, o aplicativo WebForm fez todo o trabalho duro com o SSRS.ReportViewer, não podendo apenas usuários do Windows. O JWT de acordo seria bom. Exemplos seriam legais, tentando combinar a funcionalidade ReportViewer que tínhamos com WebForms / NUGET.

Obrigado a todos!

Eventualmente eles irão lançar um NUGET oficial para isso, certo?

@cgountanis O "eles" é a equipe do SQL Server, não a equipe do ASP.NET Core. Ai que está o problema. É uma equipe diferente.

@giddev, a verdadeira questão aqui é se essa outra equipe a que você está se referindo ainda existe na Microsoft e tem desenvolvedores ativos que ainda trabalham na equipe e se eles têm orgulho suficiente em seu trabalho para produzir e publicar uma solução de primeira classe para incorporar SSRS relatórios em um aplicativo da web ASP.Net Core 1 ou 2. Eles têm um roteiro publicado? O ASP.Net Core faz parte do plano ou o SSRS foi abandonado e substituído pelo POWER BI? Estou começando a ver sinais de que o SSRS está indo para o mesmo buraco de rato em que o Microsoft Visual FoxPro caiu.

@wqwalter algo assim .....
Tenho a impressão de que a Microsoft tem uma maneira de muitas equipes seguirem seu próprio mapa e não muitas pessoas se certificando de que têm um conjunto comum de entrega e comunicação entre eles.
é como pastorear gatos, todos eles partem em direções diferentes ....

se isso estiver errado - bem, parece que sim.

Acho difícil acreditar que eles abandonariam o SSRS, pois ele é muito usado por desenvolvedores agora que o Crystal Reports não é popular.

@cgountanis
bem como eu gosto de algumas coisas da Microsoft, eu vi uma história de 20 anos deles interrompendo produtos repetidamente e fazendo coisas que desafiam a minha compreensão. um exemplo foi o Virtual PC, adquirido pela Microsoft, vendido pela Microsoft por um tempo, depois o tornou gratuito e, em seguida, o eliminou.
esse é apenas um de muitos casos como esse ....

Eu ouvi falar sobre o Power BI e alguns boatos de que pode ser o novo SSRS a tempo.
não tenho certeza se isso é certo ou apenas fofoca. seguiria o modelo de envio de serviços baseados no Azure.

Adoraria ver o SSRS oferecer suporte à autenticação baseada na web - preferencialmente OpenID Connect - pronto para uso. Um passo adiante - seria incrível se o SSRS fosse um nuget para ASP.NET Core. Agendamento de relatórios e administração de usuários - talvez forneça um projeto de amostra, mas eu poderia desenvolver essa parte com a documentação da API SSRS.

@Morgma
acordado!
O OIDC seria um ajuste perfeito para o que estou fazendo.
as funções precisam ser executadas para que possamos fornecer um mapeamento para funções de servidor de relatório para nossas funções de aplicativo.

agora eu tenho um aplicativo que está usando OIDC com um front end Angular 4/5 que tem que carregar uma página de relatório de formulários da web em um iFrame e usar contas de usuário do Windows para controlar as permissões, então se eu consultar o banco de dados do servidor de relatório, eu posso realmente não ver quais usuários executam os relatórios. é um kluge que podemos usar, mas está longe de ser o ideal.

Este é um grande problema para nós também e eu realmente não posso acreditar que ainda não ouvimos NADA da Microsoft sobre isso. Está seriamente nos levando a considerar opções não-microsoft neste momento. Se pelo menos tivéssemos um cronograma, poderíamos tomar uma decisão informada.

Eu concordo, escolhi o caminho de usar o ReportServer / ReportExecution2005.asmx diretamente apenas para fazer a exportação funcionar diretamente. Funciona muito bem quando hospedado no IIS, obtendo erros estranhos.

É frustrante.

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

esse erro diz que o cabeçalho para autorização está faltando, a solicitação http precisa incluir o cabeçalho. será que só chamar um problema?

Funciona bem até ser hospedado no IIS. Até minha máquina de desenvolvimento está falando com o mesmo servidor de relatório e funciona, mas uma vez publicado e hospedado com IIs, você obtém esse erro. Acho que o que está dizendo é que o servidor está respondendo com algum tipo de erro vazio, mas estou enviando tudo.

Lembre-se de que o IIS Express é executado com suas credenciais de usuário, então o salto duplo provavelmente é adequado. O que provavelmente está acontecendo é que você não tem Kerberos configurado em seu servidor IIS e, mesmo que tenha a delegação ativada, seu relatório não funcionará porque o relatório está sendo executado como anônimo.

Resposta curta: você não pode usar a delegação sem a configuração do Kerberos, o que requer configurações em seu controlador de domínio para a conta em que o pool de aplicativos IIS é executado.

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

Sei que este não é o lugar certo, mas queria fazer o acompanhamento. Hosting Core no IIS, não importa como você define as configurações do IIS. Apenas para S&G, criei o usuário appPool como Administrador e funcionou. Vai entender ... Isso sem nenhuma configuração de autenticação do IIS habilitada, exceto Anônimo. Alguém explica isso? Ele precisa acessar uma biblioteca para WCF no Core para a qual precisa de acesso especial? O que da? ESTOU CONFUSO ... e preocupado com a segurança.

@cgountanis você pode abrir um novo problema com sua pergunta?

@jtarquino Você tem alguma atualização para a linha do tempo no lançamento de um visualizador de relatório baseado em núcleo .net? Estou desesperado para obter pelo menos um cronograma. Estamos falando de 6 meses? 12 meses? Basicamente, estamos enfrentando a decisão de abandonar todos os nossos relatórios SSRS atuais e ir com outra solução, uma vez que não temos alternativa e nenhum cronograma para disponibilidade.

@ExcaliburVT está em nosso backlog, porém não tenho um cronograma que possa fornecer no momento.

O código aberto

esta é a única área em que a migração da Microsoft não é tão grande. se nós, como clientes, não conseguirmos obter as respostas certas, por quanto tempo continuaremos voltando?

esse mesmo tipo de coisa está acontecendo em vários produtos, não apenas neste. por que eu deveria aconselhar meus gerentes a licenciar a próxima versão do SQL Server e SSRS se não podemos obter as atualizações de que precisamos para administrar o negócio?

@jtarquino Tenho que concordar com @figuerres, pois literalmente acabei de travar uma batalha de 3 meses para obter a aprovação para usar SQL em vez de Oracle e descobrir que um dos meus principais pontos de venda não é suportado nativamente. Eu estava criticando a Oracle por não ter um driver .Net Core disponível e eles pelo menos tinham uma data de lançamento anunciada. O SSRS é o seu próprio produto e você está totalmente atrasado duas gerações, mesmo sem uma data proposta para resolução.

Usar o novo serviço de conector WCF VS2017 (Core 2) permite que você exporte os relatórios com parâmetros para PDF, Word, Excel, CSV ... muito fácil se você quiser alguma ajuda antes que o pacote NUGET do visualizador seja lançado. Sim, você tem que usar o ReportExecution2005.asmx que vem com o SSRS, mas o mesmo fará o que for criado. Nós apenas decidimos descartar o aspecto do visualizador por enquanto e fazer downloads diretos de arquivos.

Edit: O único problema é lidar com as permissões AppPool que mencionei anteriormente.

A propósito, recebo relatórios em pdf de uma API da web e não uso nenhum bit wcf.
apenas chamadas soap / asmx e chamadas http.
em fazê-los eu passo credentails sem problemas.
meu código é asp.net 4.6 / web api 2
se você quiser ver o que eu faço, posso colocar alguns códigos em um github na próxima semana para você verificar.
Estou ligando para o servidor de relatório 2016, mas a maior parte do que estou fazendo funcionará com as versões mais antigas do ssrs.

Alguma novidade para o Core 2 com SSRS (RDLC Designer)?

@figuerres se você colocou algum código na solicitação do github para compartilhar o link.

@apondu
postará na próxima semana, não no escritório até então. ninguém pediu o código até agora.

Estou trabalhando em um aplicativo de intranet Angular5 / .NetCore2 MVC5 (pilha RC atual da MS), estamos usando o SSRS 2012 e precisamos criar assinaturas de relatório com base no tempo para usuários que não são a conta do Windows conectada.

@figuerres Talvez você tenha algumas idéias?

Você pode usar o SSRS e o serviço de execução de relatórios embutido para reproduzir PDFs o dia todo.

@cgountanis Obrigado por uma resposta tão rápida, você me ajudou a perceber que não fui descritivo / preciso o suficiente ao descrever o que preciso fazer. Eu atualizei meu comentário original para dizer "criar assinaturas de relatório com base no tempo"

Hmm, acho que fiz algo assim inserindo linhas de agendamento de assinatura diretamente no banco de dados de relatório (adivinhei como o serviço de assinatura funcionava com base na tabela e nas linhas existentes).

@ExcaliburVT Usei a API SOAP e um grande SP para interagir com o banco de dados até agora e gostaria de evitar modificar o banco de dados diretamente. Fico feliz em saber que existe uma opção alternativa.

o que você quer dizer com baseado no tempo?

você precisa executar um relatório em um determinado momento?
você precisa executar um relatório quando um usuário faz algo?

@figuerres com base no tempo, ou seja, em uma programação recorrente, como todas as quartas-feiras às 8h.

Sim, eu não consegui encontrar uma maneira de fazer isso sem inserir um registro manualmente pelo menos de volta ao SQL 2012. Se bem me lembro, você não tem que modificar o esquema ou qualquer coisa apenas inserir uma linha na tabela de assinaturas e eu consegui para enviar um relatório a um grupo de distribuição dessa maneira.

ok, então o portal do servidor de relatório pode executar um relatório em uma scedule planejada, pode salvá-lo em um arquivo ou enviar um e-mail quando esse tempo acontecer.
você não precisa ter ninguém conectado quando ele é executado.

você acabou de criar a assinatura do portal.

você também pode fazer isso a partir da API de sabão, mas não tenho certeza do conjunto exato de chamadas de API a serem feitas.

Permita-me dar mais contexto antes de falar sobre o que vi da soapAPI.

Estou escrevendo um webapp que usa o SSRS soapAPI e credenciais como "ssrsReportWebAdmin". Em desenvolvimento agora, o "ssrsReportWebAdmin" tem todas as funções de segurança, mas com base na documentação, parece que a função de Gerenciador de Conteúdo é a necessária. Um usuário usará o webapp para criar assinaturas para outras pessoas e enviar essas solicitações por meio da soapAPI.

A chamada CreateSubscriptionAsync retorna um erro informando que o usuário não tem permissões.

então chamando a api você está passando um objeto cred para o usuário "ssrsReportWebAdmin" que tem todas as funções mas você obtém um erro que não tem permissão ?? interessante....

pelo que li, o SSRS é configurado de forma que a única pessoa que pode criar assinaturas padrão (recorrentes, com base no tempo) seja o próprio usuário. As assinaturas baseadas em dados podem ser configuradas pela função de Gerenciador de Conteúdo.

Consulte ContentManagerTasks - Gerenciar todas as assinaturas
https://technet.microsoft.com/en-us/library/ms159693 (v = sql.105) .aspx

Veja a primeira frase sob o cabeçalho começa "Reporting Services oferece suporte a dois tipos de ..."
https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/subscriptions-and-delivery-reporting-services#bkmk_standard_and_datadriven

@figuerres @ExcaliburVT
Consegui criar assinaturas padrão para e-mail e compartilhamentos de arquivos usando uma conta do AD com a função de Gerenciador de conteúdo SSRS. Pelo que posso ver, o problema de permissões que estava enfrentando na sexta-feira era um efeito colateral de um parâmetro MatchData em branco / malformado.

Quase 2 anos. O Core 2.0 é lançado. Equipe SSRS, acorde.

@ codehippie1 não seja tão rude. somos todos seres humanos aqui. crescer!

Foi apenas uma piada na caverna do desenvolvedor. Nenhuma ofensa significa qualquer coisa. Piadas à parte, ReportViewerForMVC tem 72.799 downloads desde o início de 2014 (https://www.nuget.org/packages/ReportViewerForMvc). A equipe do SSRS ignorou o ASP.NET MVC por muitos anos e agora está ignorando o ASP.NET Core por 2 anos. Falar em ser rude, 72.799 vezes é muito.

Eu me contentaria com uma boa exportação para a biblioteca PDF oficialmente suportada, sem necessidade do visualizador hoje em dia com requisitos responsivos do jeito que estão.

@cgountanis : Gere um modelo HTML (tamanho de papel correto - somente html, imagens como base64, estilos inline). Preencha os espaços reservados e não se esqueça de definir a codificação HTML para utf8. Enviar texto para StandardInput de wkhtmltopdf - buscar saída de StandardOutput de wkhtmltopdf. E então, você tem algo muito melhor do que o SSRS.

@cgountanis Eu considerei essa abordagem, mas gerar um relatório de pixel perfeito com cabeçalhos / rodapés de página e quebras de linha em lugares lógicos não é fácil.

Para todos aqueles que compartilham minha dor de não ter o visualizador de relatório local MS RDLC no núcleo aspnet; Eu tentei uma abordagem alternativa com a ajuda de pdfJs e ViewerJs da mozilla - demonstração de pdfJs com visualizador de relatório MS RDLC para cuspir relatório como bytes. Para mim, este é o melhor dos dois mundos, já que eu ainda poderia usar arquivos RDLC, usá-los para gerar relatórios no lado do servidor e ter o poderoso visualizador de documentos embutido no firefox para mostrar a saída. PdfJs ainda não é um visualizador de relatórios, mas no meu caso com navegação de página, visualização de impressão, pesquisa e um monte de outras funcionalidades úteis, não é menos.

Caso você esteja interessado, aqui está um resumo para ajudá-lo a como usá-lo dentro do aplicativo principal do aspnet (com o lado do cliente no angular 2 ou superior, rxJs e Typescript). Para mim, isso simplesmente é o melhor dos dois mundos.

Como adicionar pdf.js e viewer.html ao aplicativo angular 2. (Com geração opcional de relatório de back-end aspnet core / webapi / mvc usando o visualizador de relatório MS Local RDLC)

Eu acredito, você pode muito bem mudar o angular 2 com react ou qualquer outra biblioteca do lado do cliente, mas os princípios permanecem os mesmos.

Funciona diretamente com o SSRS?

@cgountanis a postagem anterior é RDLC, o que significa que não há servidor de relatório, o servidor da web renderiza o relatório.

Uma atualização interessante da Microsoft ...

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

Temos o prazer de anunciar que adquirimos tecnologia da Forerunner Software https://forerunnersw.com/ para acelerar nossos investimentos em Reporting Services. Essa tecnologia inclui, entre outras coisas, renderização do lado do cliente de relatórios do Reporting Services (* .rdl), widgets de IU responsivos para visualizar relatórios e um SDK JavaScript para integrar relatórios a outros aplicativos - um testemunho do que nossos parceiros podem alcançar com base nossa plataforma aberta.

Esta é uma ótima notícia para você, pois vemos oportunidades de aplicar essa tecnologia a vários comentários que recebemos de você:

  • Você está procurando por software como serviço (SaaS) ou plataforma como serviço (PaaS) que pode executar relatórios SSRS. Como você deve ter visto em nossas notas de versão do Spring '18 https://aka.ms/businessappsreleasenotes , estamos trabalhando ativamente para trazer relatórios de SSRS para o serviço de nuvem do Power BI e estamos construindo uma renderização do lado do cliente para tornar isso possível.
  • Você deseja visualizar relatórios SSRS em seu telefone, talvez usando o aplicativo Power BI. Acreditamos que essa tecnologia nos ajudará a fornecer uma interface de usuário melhor e mais responsiva para fornecer valores de parâmetro de relatório, navegar nos relatórios e, possivelmente, até visualizar o conteúdo do relatório.
  • Você adora o controle Report Viewer ... mas é um controle ASP.NET Web Forms. Você precisa de algo que possa integrar em seu aplicativo ASP.NET Core / MVC ou aplicativo não ASP.NET. Com essa tecnologia, esperamos entregar um Report Viewer do lado do cliente / baseado em JavaScript que você pode integrar em qualquer aplicativo moderno.

Esses são grandes empreendimentos e ainda não temos prazos para compartilhar, mas fique ligado nos próximos meses, pois sempre nos esforçamos para compartilhar nosso progresso com você e ouvir seus comentários o mais cedo e frequentemente que pudermos.

Saudações

Paulo


De: Denny Figuerres [notificaçõ[email protected]]
Enviado: sexta-feira, 23 de março de 2018 2:19
Para: aspnet / Home
Cc: Paul Sheldon; Comente
Assunto: Re: [aspnet / Home] Relatórios Básicos Asp.Net (SSRS) (# 1528)

@cgountanis https://github.com/cgountanis a postagem anterior é RDLC, o que significa que não há servidor de relatório, o servidor web renderiza o relatório.

-
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub https://github.com/aspnet/Home/issues/1528#issuecomment-375408680 ou ignore o tópico https://github.com/notifications/unsubscribe-auth/AEHciZa6- jjUl8kgdHtuCdH6lSwhoCyyks5tg-s6gaJpZM4IsW_Z .

Oh Deus, não essa merda de jQuery de novo.
Bloatware.
E não apenas bloatware, mas também lentowwwwww ...

Se você precisar de uma definição de bloatware, esta seria uma boa.
Para ser perfeito, basicamente falta apenas a IU do jQuery, mas tenho certeza de que as pessoas que fazem coisas como essa ainda encontrarão tempo para adicioná-la ao selecionador de data.

Oh espere, eu acabei de ver

jquery-ui-1.10.3.forerunner.js

Meu mal, deixa pra lá.
É definitivamente um exemplo perfeito.
É claro que não apenas adicionamos jQuery-UI, também lançamos nossa própria versão modificada.

Deus, isso parece uma merda. Relatórios no telefone - exatamente o que precisamos - logo após iPads CrApple e telas sensíveis ao toque no desktop ...
E eu ainda me contentaria com o SSRS trabalhando com um servidor proxy, ou para ser capaz de fazer o auth-cookie-sharing (hospedagem baseada em nome virtual multilocatário - inclusão de iframe de vários diretórios virtuais de domínio único sem substituir o cookie de autenticação de outro diretório virtual). Ou se (no SSRS 2016+) renderizaria as bordas da tabela igualmente no IE e no Chrome, e possivelmente no Firefox.
Ou apenas para ser capaz de definir a cultura manualmente via string de consulta, ter os títulos dos parâmetros traduzidos e apenas fazer o selecionador de data eu mesmo, porque o MS não vai acertar de qualquer maneira ...

ESTA é A definição 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>

E se:

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

ou melhor ainda

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

Pontos de bônus se ele anexar um carimbo de data / hora unix a cada script e folha de estilo, para que as alterações / correções tenham efeito. Pontos de bônus estendidos se passar um valor de data e hora como carimbo de data / hora unix em vez de uma string específica da cultura e não falhar para uma data> 2030 ou 9999. Ou em caracteres UTF8. Agora, no que diz respeito ao suporte a idiomas da direita para a esquerda - não queremos esticar muito o limite da microsoft. Eles falham muito antes disso. Eles já iriam superar minhas expectativas se funcionasse para mais de uma língua europeia simultaneamente (por exemplo, inglês, alemão, francês e italiano).

Prezada Microsoft, talvez eu também queira testar se um relatório tem todos os campos traduzidos e, para isso, gostaria apenas de fazer login como um usuário diferente com um idioma diferente - sem ter que alterar as configurações de idioma do meu navegador todas as vezes (ou dizer a um cliente como fazer isso - essa é sua maior conquista até o momento - uma experiência inesquecível [muito negativa], devo acrescentar - especialmente após a mudança para o Windows 8).
Se você precisa de algo com o qual possa se identificar - talvez às vezes também exista um usuário em inglês que trabalhe em um computador configurado para usuários que não falam inglês. Portanto, seria bom se eu, como desenvolvedor, pudesse definir o idioma de exibição do meu aplicativo, não apenas determinando-o pelas configurações de idioma do agente do usuário. Talvez você pudesse levar pelo menos isso em consideração ESTA vez.

Mas se eu olhar para a porcaria acima, já posso dizer que você não vai.

A propósito, a forma de definir a cultura na encarnação atual do SSRS, você precisa fazer o seguinte:

chamar um relatório com & in_language = IETF-language-tag

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


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

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

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

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

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

    base.InitializeCulture();
}
</script>

Em seguida, a linguagem precisa ser substituída na solicitação http (módulo HTTP personalizado no SSRS)
(e a política P3P é para que um formulário-login-post funcione quando está em um iframe em um domínio diferente).

Você poderia fazer com que não quebrasse isso sem oferecer um parâmetro de idioma (DISPLAY)?
Seu parâmetro rs:ParameterLanguage afeta apenas os parâmetros no URL, não a exibição do relatório. E não deveria ter que existir em primeiro lugar, por exemplo, se você acabou de passar datetime como unix-timestamp (UTC). E, claro, você deve sempre usar o mesmo cabeçalho de origem ou o cabeçalho allow-from (o iframe está em um domínio diferente do ReportServer). A propósito, configurar o idioma de solicitação no módulo HTTP é para configurar o selecionador de data com SSRS 2016 para o idioma necessário - caso contrário, o JavaScript falha se tiver um selecionador de data en-US. Ótimo, não é?

Que tal: & rs: language = IETF / IANA language tag?


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 

A Microsoft, POR FAVOR, não use o código do front runner como está!
os aplicativos da web modernos do lado do cliente estão mudando de j query para módulos es e outros.
não precisamos ou queremos extrair um monte de código de consulta J.
Eu prefiro dar ao cliente um pdf ou o controle atual do asp.net em vez de esta pilha de j query.

fazer um pacote npm que funciona bem com Angular 2-6 e node e outras estruturas de cliente da web.
Além disso, continue trabalhando com renderização SSRS, pois tem muitos benefícios. basta obter um conjunto de APIs de serviço da web atualizadas

alguma atualização disso?

Bem, basicamente já teríamos tudo o que precisamos.
O que precisaríamos é uma implementação de uma versão REST / JSON de
http: //localhost/ReportServer/ReportExecution2005.asmx
(Não faria mal se nós / qualquer pessoa pudéssemos personalizar o url)
como um pacote nuget - que também funciona em Linux / Mac.
A única coisa que precisa ser feita é portar o código .NET para .NET Core / NetStandard e remover todos os pinvokes para dlls do Windows. Em seguida, adicione a capacidade de saída de html PAGED através do serviço da web (que está faltando atualmente - porque está no controle de renderização do asp.net), é claro, e permita definir o nome do arquivo de download.

A seleção de parâmetros nós poderíamos até mesmo fazer - lendo o RDL com XmlDocument.
(alguns problemas com a opção explicitamente desativada, opção estritamente desativada, inferência de opção com VB-Code será provável)
Mais ou menos como o controle ASP.NET atual, mas sem todo o material ASP.NET-WebForms.

Portanto, não acho que haja sequer um requisito para uma única linha de JavaScript - isso será diferente de projeto para projeto, de empresa para empresa, de pessoa para pessoa.
Alguns gostam de jQuery. Alguns gostam de Angular. Alguns gostam de Vue. Alguns gostam de reagir. Alguns como NodeJS com NPM, alguns como bower, alguns como TypeScript, alguns como Babel, alguns flow, alguns até usam jQuery-UI para o selecionador de data.

Eu, por exemplo, odeio em grande parte todos aqueles frameworks (especialmente jquery-ui) com a vida de uma mosca da fruta, incompetências entre versões, inchaço, não modularidade e uma curva de aprendizado de qualquer que seja o motivo, uma comunidade de pessoas que não sabem o que eles estão fazendo (nota: não quero insinuar que sempre sei o que faço), e um gerenciador de pacotes quebrado como o npm / bower, que tem as características desagradáveis ​​de sempre encontrar uma maneira de criar novas alegrias toda vez que você gostaria de usá-los.

Então, eu apenas uso VanillaJS (com módulos ECMA e async - transpilado com babel ou datilografado - e quem se importa com o transpiler.

É claro que muitas pessoas vão discordar - e você tem o direito de discordar, pois há motivos para discordar. No final, eu não me importo com o que você usar - use coffeescript e emacs com jquery-ui e vue se você realmente quiser - apenas não me force a seguir esse caminho. Eu não preciso / quero jquery / angular / vue / react / bower / npm ou qualquer uma dessas inchaço e falta de confiabilidade.

Agora, dito isso, se você deseja fornecer uma biblioteca JavaScript que qualquer pessoa possa colocar em seu site para selecionar os parâmetros automaticamente, como no ReportServer (em oposição ao RDLC), e ao contrário do controle reportviewer atual, sou totalmente a favor . Apenas se você fizer isso, torne-o independente do "controle" do relatório. E use uma estrutura semelhante a um nó para compor os módulos ECMA, de forma que as pessoas que desejam usar o nó possam usá-lo com o nó / npm, e aqueles que não precisam.

Como sidenode, se o JSON-versão REST / permissão para buscar os dados de filtro a partir do serviço como JSON, assim como os arquivos prestados, nós não precisa mesmo de ler o arquivo RDL, e teríamos um muito un complicado JS biblioteca. O código VB atualmente permitido nos parâmetros não permitiria, de qualquer maneira, fazer isso no lado do cliente.

Ou pensando melhor, seria ainda melhor se o serviço permitisse buscar cada conjunto de dados no relatório como JSON. Acho que precisaríamos ser capazes de ler os valores padrão de cada parâmetro também. Então, poderíamos até mesmo fazer um teste de unidade para verificar se os dados SQL usados ​​no relatório estão corretos!
(relatórios de teste de unidade são atualmente bastante impossíveis)

Uma folha de estilo adicional para a formatação terminaria o truque (SASS, por favor). E um sistema de plugins para renderizadores adicionais / alternativos completaria isso. ¨

Mas, no fundo, realmente só precisamos de uma biblioteca de renderização de relatórios multiplataforma.
Todo o resto já poderia ser feito hoje pela comunidade.
Eu acho que se as fontes para os controles existentes estivessem disponíveis, todo ou a maior parte do trabalho necessário poderia ser feito completamente pela comunidade - não custaria nem um centavo para a microsoft.

Alanjuden MvcReportViewer trabalha com SSRS 2017 e núcleo 2. Posso usar esta abordagem para SSRS 2017 e núcleo 2

Não, não sem muita dor de cabeça. A solução mais fácil é exportar PDFs diretamente usando o reportexecution2005 diretamente, imho. Tentar obter qualquer um dos visualizadores antigos em um formato responsivo, especialmente para telefones e tablets, é uma dor.

@Mahenbisht , tenho que construí-lo a partir do código-fonte com pacotes atualizados para as versões mais recentes para que funcione no núcleo 2. Ainda não tentei 2017.

Estou usando o SQL Server 2017 com SSRS 2017 e núcleo 2.
Se eu não posso usar alanjuden.MvcReportViewer.NetCore, então há alguma outra abordagem

@Mahenbisht , sei que não sou muito ativo no meu há algum tempo ... no entanto, você ainda poderia usar uma abordagem semelhante. Você pode sempre conectar-se à API Reporting Service que estou usando (que está embutida no SSRS) para executar seus próprios relatórios e colocá-los em qualquer formato que desejar.

@Mahenbisht : Há um pacote nuget do .NET Core aqui:
https://www.nuget.org/packages/AspNetCore.ReportViewer/
Infelizmente, não existem quaisquer fontes, então você não pode ver o que ele faz e como usá-lo.
Então eu descompilei aqui (ele compila).

Parece ser as classes geradas a partir de ReportExecution2005 e ReportService2010-WSDL para .NET Core.
Portanto, nada o impede de escrever seu próprio visualizador, se você tiver acesso à rede para uma instância em execução do SQL-server com SSRS.
Se bem me lembro, você precisa passar deviceinfo para renderizar para que você obtenha a saída html paginada.
Isso deixa você com fazer os parâmetros manualmente - que é o que estou (teoricamente) trabalhando atualmente.

@alanjuden : O problema com sua abordagem é que ela requer uma instância do SQL-Server com ReportingServices instalado. Se você tiver isso, também pode colocar um iframe em / ReportServer e adicionar um pouco de autenticação personalizada + cabeçalho W3C e DLL de localização de idioma aos serviços de relatório. Então você não precisa mais do seu trabalho.

O problema com isso é que
A) N clientes nem sempre têm a mesma versão do SSRS instalada (com todas as atualizações / pacotes de serviço cumulativos - no meu caso, atualmente variando de SSRS-2008R1 a 2016),
e B) que as instalações do SSRS-Express só têm acesso aos bancos de dados na máquina local. E o que é realmente uma merda é que não há controle ReportViewer que funcione em PCs não Windows (Linux, Mac) - então você tem que combinar .NET com Java para Birt ou Jasper - o que interrompe a implantação de xcopy - para não mencionar um enorme sobrecarga em ambos os formatos de relatório 2-3 e todo o java JVM e o bloatware birt / jasper incluindo tomcat e / ou outras porcarias.
e C) que ReportingService usa autenticação integrada do Windows. Então, mesmo se você usar o Windows, você precisa adicionar autenticação personalizada para fora da intranet, o que significa que você precisa ter acesso de modificação a ReportingServices, e suas modificações podem quebrar outro software, então qualquer cliente normal deve instalar uma nova instância de SSRS / SQL-Server (que custa dinheiro).
também D) que os parâmetros ReportingService não são localizáveis ​​sem modificar ReportViewer.aspx, consulte C)
e também E) que qualquer versão do SSRS <2016 Renders quirks-html (e embora 2016+ seja melhor, está longe de ser perfeito a esse respeito, aliás)
No entanto, como as versões antigas de 2008 ainda estão por aí em 2018, pode levar mais 5 a 10 anos para que qualquer coisa abaixo de 2016 desapareça. Nesse momento, o SSRS 2016 estará irremediavelmente desatualizado de qualquer maneira. Se a Microsoft ainda estiver por aí, claro.

Docker para o resgate - felizmente. Mas ainda é uma porcaria.

e adicione um pouco de autenticação personalizada + cabeçalho W3C e DLL de localização de idioma aos serviços de relatório.

@ststeiger alguma amostra online para colocar o visualizador SSRS no iframe com passagem de autenticação personalizada do site principal e cabeçalhos W3C?

@adopilot : Aqui está um howto aproximado:

Adicionar autenticação personalizada ao SSRS

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

(você precisará modificá-lo um pouco para que use UM usuário por banco de dados.
Você não quer começar a sincronizar usuários e permissões do SSRS com seus usuários de formulários!
Dê a este usuário direitos na pasta apenas para este banco de dados.
)

Adicione um módulo http ao SSRS , que define o cabeçalho p3p e sobrescreve context.Request.UserLanguages ​​[i] com o idioma de sua escolha (caso contrário, o selecionador de data não funciona)

Modifique a página de logon do ReportServer para reagir aos parâmetros de obtenção e postagem, defina o login_cookie e redirecione para o relatório que foi postado.

Código em Page_Load na classe FormsAuthentication_RS2012.LogOn no Assembly FormsAuthentication_RS2012

Publique os dados criptografados em PGP / RSA com um carimbo de data / hora unix (para que não possam ser reproduzidos) criptografados com a chave pública em seus formulários, descriptografe os dados posteriores em FormsAuthentication_RS2012 em page_load.

(não pode fornecer o código FormsAuthentication_RS2012, porque contém a chave privada e a senha do administrador embutida no código)


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

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

Adicione a funcionalidade de tradução de parâmetro a reportviewer.aspx:
(
O parâmetro foi escrito como alemão / francês / italiano / inglês
)
dividir em / e padrão para alemão (você pode querer usar o inglês)
adicione um parâmetro in_language (in_sprache) ao url do relatório e está quase pronto, se você entendeu a ideia.


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>

Agora, para usar isso em alguma página da web, crie um iframe chamado ifrmSSRS_Login (ou ajuste ao seu gosto) e faça um formulário de postagem no link clique:

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

dessa forma, você pode fazer a ponte de autenticação com SSRS, além de os usuários de cada cliente (nome do banco de dados) ver apenas seus relatórios (permissões em ssrs por nome do banco de dados).

Observe que uids devem ser passados ​​em minúsculas, porque senão o SSRS se recusa a funcionar direito / explode como o software de baixa qualidade que é.

Nota:
Esse código acumulado por um longo período de tempo, para várias versões do SSRS, e talvez substituir a cultura de inicialização de página não seja mais necessário se o módulo http substituir a linguagem do agente do usuário (que eu só descobri depois de perceber que a página de substituição -initialize-culture não é bom o suficiente para o selecionador de data SSRS).
Além disso, o uso da barra como separador para a tradução foi lamentável. tente usar um caractere de que você não precisa, como £ ou ¦.

O cabeçalho P3P é necessário para que o IE 11 em computadores não Windows 10 não recuse o cookie de autenticação (uma vez que o ssrs é executado em um iframe de domínio cruzado, ele é tratado como um cookie de terceiros pelo IE).

Além disso, use o SSRS 2016+, porque caso contrário, você precisa de recursos do modo peculiar, como larguras de borda, alturas, margens, ocultar a função de impressão e todo o tipo de "coisas interessantes específicas do IE8" etc.

Como o nome do assembly diz, isso foi feito para nosso servidor de produção (SSRS 2012) e tudo evoluiu de horríveis hacks do SSRS 2005.

Salvar links em um campo em sua tabela de navegação, por exemplo, como campo NA_Link em T_Navigation
'{@report} Budget_SNB & in_user = {@ user} & in_sprache = {@ language} & rc: Stylesheet = COR_RS2012_v7'
use placeholders para o baseLink, usuário e idioma, e defina a folha de estilo (se você tiver um fundo preto, você precisa dizer aos ssrs para usar a modificação da folha de estilo)

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

E observe que o .NET-Framework terá problemas se precisar redirecionar um link com dois-pontos dentro.
Você pode copiar o código de trabalho para redirecionamento de url do mono-projeto.

Além disso, observe que você não pode simplesmente passar o ID do usuário como string / número - ele precisa ser criptografado (privado / público) para que ninguém possa adivinhar o ID do usuário. Mas, para começar, o hash md5 do ID do usuário pode resolver o problema.

@ststeiger @all
AspNetCore.ReportViewer foi substituído por AspNetCore.Reporting
isso inclui LocalReport e ServerReport

@ amh1979 : Bom trabalho - vou dar uma olhada nisso.
Eu deduzo de sua dependência AspNetCore.ReportingServices.dll que precisa do WindowsBase e pinvoke advapi32.dll / kernel32.dll / ReportingServicesService.exe que isso só funciona no Windows com .NET com Framwork 4 instalado?

PS: o inglês correto é "AspNetCore.ReportViewer foi> substituído por <AspNetCore.Reporting", não "em vez disso", mas entendi o que você quis dizer;)
Ou você também pode dizer "foi supervisionado por", que pode ser a palavra / frase que você está procurando;)

@ amh1979 : Muito bem, tive que fazer algum trabalho porque não tenho o framwork 4.7.1 instalado.
Eu entendi, MainStream é result / html e SecondaryStream é CSS.
Mas comecei a funcionar.
Que o HTML seja paginado também é bom.
Você sabe: existe alguma maneira de repetir todos os resultados ou obter um arquivo HTML enorme sem chamar a função de renderização para cada página?

@ALL : Embora seja executado em .net completo, não consigo fazer com que seja executado em .NET Core no Windows.
Problemas com System.Drawing.Color ToKnownColor, IsSystemColor e não presente KnownColor.
Corrigido isso, mas agora está reclamando sobre não foi possível carregar o assembly System.Drawing.Graphics com assinatura ...

Existe uma maneira de executar assemblies .net completos FULL em um projeto .NET Core no Windows?

@ststeiger irei atualizar e consertar essas questões na próxima versão.

@ amh1979 :

Já que você está fazendo isso, se você pesquisar e substituir System.Array.Empty<T> por ArrayExtension.Empty<T> , você terá 90% do caminho para fazê-lo funcionar com .NET 4.0.

    internal static class ArrayExtension
    {

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

    }

@ amh1979 :

Ele usa o seguinte

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

que o System.Drawing.Common do .NET Core não implementa.
Aqui está uma substituição System.Drawing.KnownColor.cs
(não é perfeito devido à ambigüidade, mas na ausência de acesso aos valores internos de System.Drawing.Color. isso é o melhor que eu poderia fazer - talvez usar #ifs para fazer com que o framework .net completo chame as propriedades reais se estiver cheio. estrutura de rede ...)


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 


}

Eu tenho compilado no NetStandard 2.0

COMO:
Pegue System.CoreFX.Forms e converta-o em NetStandard 2.0. Em seguida, adicione System.Drawing.Common e System.Reflection.Emit.

Pegue AspNetCore.ReportingServices e adicione

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

Adicione uma referência a System.CoreFX.Forms (NetStandard)

Obtenha os seguintes arquivos 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")

E adicione uma classe de invólucro 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;
    }
}

E permitir código inseguro no novo projeto netstandard 2.0.

Agora adicione AssemblyInfo.cs com

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

E agora ele compila no NetStandard 2.0.

Ei, todas as notícias incríveis:

Ele está funcionando com o .NET Core no Windows!
100% NetStandard, 0% NetFramework

Html, Pdf, Excel, Excel2007 +, Word, Word2007 + e tiff funcionaram bem em um relatório tabular de 57 páginas com varchars, ints, tinyint2, bits e colunas computadas.
Todos os formatos de saída funcionam, exceto RDL, que é meio engraçado, mas quem se importa.
Encontraremos o problema eventualmente, não é?

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 

E há mais boas notícias:
WindowsBase (também conhecido como WPF) foi usado apenas para System.IO.Packaging, que está disponível no .NET Core.
Agora, isso significa que, se pudermos nos livrar dos pinvokes, não haverá grandes obstáculos para fazer isso funcionar no Linux / Mac também!

Agora alguém começa a escrever um editor RDL baseado na web!
Então poderíamos ter relatórios "dinâmicos" (gerados pelo usuário) também.
PostgreSQL-ReportingServices para Linux está chegando;)
(ok, existe uma espada legal de Dâmocles em tal coisa, mas se pudéssemos publicá-lo da China, que tem direitos de propriedade intelectual "mais relaxados" ...) :)

OK, talvez isso seja muito mau.
Pense em Microsoft ReportingServices para Oracle / SAP!
Ou ReportingServices para Cassandra / Spark: sorriso:

@ amh1979 :
Não há nenhum renderizador de PowerPoint nele?
Você o construiu a partir da versão mais recente do reportviewer? (SSRS 2017)
A última versão que conheço no nuget:
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
(140.1000.523, 10 meses atrás)
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WinForms
(140.1000.523)
https://www.nuget.org/packages/Microsoft.SqlServer.Types
(14.0.314.76)

Aqui está a implementação do CoreFX WinForms para NetStandard:
https://github.com/ststeiger/System.CoreFX.Forms

Cuidado com a lacuna, já que adicionei um projeto NetCore adicional e renomeei System.CoreFX.Forms para System.NetStandard.Forms, ele pode ter dificuldades para carregar os recursos incorporados, se isso acontecer.

Os arquivos podem ser encontrados aqui:

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

@ amh1979 :
Ah, entendo, isso não está no Microsoft.ReportViewer.Common.dll.
Mas está no diretório ReportServer:
Microsoft.ReportingServices.PowerPointRendering.dll
e para CSV / XML / Atom:
Microsoft.ReportingServices.DataRendering.dll

C: \ Arquivos de programas \ Microsoft SQL Server Reporting Services \ SSRS \ ReportServer \ bin

@ALL : Senhoras, o renderizador de HTML está funcionando no Linux no .NET Core / NetStandard 2.0!
E também o WordOpenXML e o renderizador ExcelOpenXML!
(não testado com imagens / gráficos - apenas texto e código)

O renderizador de PDF tem problemas com pinvokes de incorporação de fontes.
(O renderizador do Word / Excel-2003 está usando pinvokes e, portanto, não funciona.)
Se você usar a versão de avaliação Aspose Cells / Words, poderá converter o xlsx em xls e o docx em doc.
Você também pode gerar o PDF a partir do arquivo de palavras:
soffice --headless --convert-to pdf filename.docx
(ou novamente, com uma avaliação de propósito)
Pensando nisso, o renderizador PPTX deve ser fácil de fazer também, porque tudo o que ele faz é tirar as fotos do arquivo TIFF e colocar cada imagem da página tiff como jpg / png em um slide pptx.
Parece que o renderizador de imagens é a coisa mais difícil de fazer.
Ou você pode pegar wkhtmltoX e renderizar cada página HTML em uma imagem / pdf.
Isso provavelmente seria um pouco lento, no entanto.

Surpreendente !

HTML for report

@ALL : Atom / CSV / XML funcionando. O mesmo ocorre com o renderizador NULL.
No Linux também.

A renderização do PowerPoint funciona apenas no Windows - pinvokes

Curiosidade: parece haver um renderizador JSON lá.
Mas, por algum motivo, essa porcaria só funciona em um caso useSharedDataSetTableHandler, o que quer que isso signifique

ParseDeviceInfo(deviceInfo);

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

Alguém por acaso sabe como usar o renderizador JSON?

@ amh1979 Tentei usar o relatório do servidor, mas parece que os parâmetros que adicionei para o relatório não são persistidos no servidor no LoadReport. Existe alguma chance de você configurá-lo para que sejam enviados ao servidor em sua próxima compilação?

Olá @ststeiger e @ amh1979 , Ótimo trabalho nisso. Existe algum tutorial sobre como usar esta biblioteca? Estou tentando descobrir como / se ele atualmente oferece suporte a parâmetros de vários valores e se os detalhamentos são suportados.
Eu continuo tentando acessar o site vinculado na descrição do pacote nuget (http://www.amhx.org/) para ver, mas continua expirando em mim.

@DavidHayesCoding :
Aqui está meu código de teste para AspNetCore.Reporting.LocalReport, que é tudo em que estou interessado:
Nota:
Os tipos de renderização Rpl, RGDI, Atom, Xml, Json, Csv, null, pptx
não estarão disponíveis para você, como eles não estão na montagem das amh1979.
(eles fazem parte do SSRS, mas não estão presentes no ReportViewer redistribuível)

Observe também que a fonte de dados compartilhada (* .rds) precisa estar no mesmo diretório que * .rdl, caso contrário, você obterá uma exceção de referência nula em LocalReport.Execute.

Para mais perguntas:
https://github.com/icsharpcode/ILSpy/releases/tag/v4.0-beta2
(Nota: no código adequado, você precisa descartar a tabela de dados após terminar de usá-la)

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

namespace NetCoreReporting
{


    public class Program
    {


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

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

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

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



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

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

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

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

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


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

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

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




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

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

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

            System.Console.WriteLine(rr.TotalPages);


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

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

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

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

            BuildWebHost(args).Run();
        }


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


    }


}

@ALL : Alguém quer ajudar?
Responda a esta pergunta:
https://stackoverflow.com/questions/52093440/how-to-call-wine-dll-functions-from-c

Eu poderia sugerir que postar muitos códigos e comentários longos é uma maneira realmente difícil de digerir e ler de rastrear esse problema?

Posso ver muita atividade, muito código, mas realmente não tenho a menor ideia de quais foram os desenvolvimentos recentes (aparentemente excelentes).

Posso sugerir manter as coisas organizadas e organizadas aqui e usar outro repositório / ferramentas apropriadas para compartilhar código? Existe uma atualização de status simples e simples que pode ser compartilhada aqui?

como @kierenj, acho que as listagens de código como um post dificultam o acompanhamento. crie um github e compartilhe um link. veja se os administradores deste repo querem fazer alguns branches etc ...

@kierenj @figuerres : Eu ficaria bem com isso, mas se você publicar grandes quantidades de código Microsoft descompilado sem pedir permissão primeiro, provavelmente correrá o risco de cruzar a linha até onde eles podem querer fazer algo a respeito ...

iii. Restrições de distribuição. Talvez você não
• distribuir Código Distribuível para execução em uma plataforma diferente da plataforma Windows;
• o código seja divulgado ou distribuído na forma de código-fonte; ou
• outros têm o direito de modificá-lo.

@ststeiger
e você pode trabalhar com o repo aqui mesmo para fazer um branch e colocar o código nesse branch.
então eles têm e sabem sobre isso etc ...

@figuerres : Eu fiz o repo no gitlab, onde um repositório privado é gratuito.

@MaximRouiller :
Eu teria uma versão do ReportViewer (relatórios locais) funcionando aproximadamente no ASP.NET Core.
Cerca de 75% dele funcionaria até mesmo no Linux, para o qual a Microsoft publicou o SQL-Server.
As partes que funcionam no Linux provavelmente funcionam no MacOS também.

No entanto, esta versão do ReportViewer é baseada no código de
https://www.nuget.org/packages/AspNetCore.Reporting
que parece ser baseado no código de
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
que vem sob esta licença
http://go.microsoft.com/fwlink/?LinkId=826162

Esta licença não permite
• distribuir Código Distribuível para execução em uma plataforma diferente da plataforma Windows;
• o código seja divulgado ou distribuído na forma de código-fonte; ou
• outros têm o direito de modificá-lo.
• contornar quaisquer limitações técnicas do software;
•> nenhuma engenharia reversa permitida <

Eu gostaria de (publicamente) compartilhar esse código com a comunidade aqui no github, em um local ainda a ser determinado, com o propósito de melhorar o código e resolver quaisquer possíveis bugs restantes, para trazer ReportViewer para .NET Core.
No entanto, não gostaria de dar esse passo unilateralmente, considerando a licença atual do ReportViewerControl.WebForms.

Acho que muita coisa mudou desde que a licença foi escrita / atualizada pela primeira vez.
Por exemplo, não faria sentido publicar um ReportViewer para .NET Core quando o resultado só funcionaria na plataforma Windows - também considerando que a Microsoft lançou o SQL-Server para Linux, o que significa que em algum momento, o SSRS tem que siga de qualquer maneira.

E, como o ASP.NET-Core não implementa WebForms, a mudança de ReportViewer-WebForms para ReportViewer-NetCore seria uma mudança significativa de qualquer maneira.

Você poderia perguntar discretamente aos poderes constituídos, se, considerando as circunstâncias, eles dão luz verde a tal empreendimento - o que, aliás, os economizaria tempo e mão de obra - e se alinhe perfeitamente com a natureza de código aberto do .NET-Core / NetStandard 2.0.

Já se passaram mais de 2 ANOS desde que o .NET-Core foi lançado e ainda não há solução para relatórios abrangentes e distantes. É hora de corrigir isso.
Se fizermos isso juntos, seremos todos mais rápidos e melhores.

http://go.microsoft.com/fwlink/?LinkId=826162
Estou preocupada com o que.
Caso contrário, removerei os pacotes do NuGet.

@ALL : Ótimas notícias: Removidas as chamadas COM-InterOP para XLS / DOC e substituídas por OpenMcdf.
O XLS / DOC-Renderer está, portanto, trabalhando agora em Linux e Windows.
Agora 85% trabalhando em Linux.

Parece que estamos com 3 chamadas WinAPI para PDFWriter e 13 chamadas WinAPI para ImageRenderer / Graphics.
Acho que o próprio PdfWriter pode ser bastante fácil.

Olá @ststeiger, não consigo executar o AspNetCore.Reporting no Azure Function com o plano de consumo porque bloqueou a função GDI +. Você tem alguma solução para isso? Obrigado.

Ainda não - ele faz várias chamadas para GDI + e usp10.dll, principalmente para obter informações sobre a fonte.
Também está passando ponteiros GDI + e não há uma substituição simples, porque mono libgdi + escolheu fazer as coisas de maneira diferente (por um bom motivo).

Consegui reescrever a função GetFontData em C # lendo o código-fonte C do Wine, mas preciso do freetype para obter as informações da fonte TrueType (o wine também usa o FreeType).
SixLabors.Fonts e LayoutFarm simplesmente não estão lá ainda (por uma larga margem).
Aqui:
https://gist.github.com/ststeiger/273341aebd29009f2b272b822b69563f

Além disso, substituí as medidas de texto por freetype

Agora preciso substituir cada identificador de dispositivo GDI por uma classe personalizada.
Essa classe deve conter informações sobre fonte / gráficos / freetype-face / identificador, etc., portanto, não preciso reescrever o renderizador.

Quando isso for feito, preciso olhar para o vinho novamente, para as transformações do papel para o mundo e do mundo para o papel.
E então deve ser feito.
Acho que as transformações do papel para o mundo e do mundo para o papel já podem estar em System.Drawing.Graphics.
Parece que parte do código já foi escrito usando .NET Framwork 1.0.

Além disso, ainda preciso mapear entre a fonte .NET e a fonte freetype de alguma forma.

hey pessoas @ALL e @ststeiger
relação à:

@ALL : Ótimas notícias: Removidas as chamadas COM-InterOP para XLS / DOC e substituídas por OpenMcdf.
O XLS / DOC-Renderer está, portanto, trabalhando agora em Linux e Windows.
Agora 85% trabalhando em Linux.

Office Open XML

honestamente, acho que seria melhor usar o material de documento XML mais recente, do que nenhuma forma de OLE necessária.
Ok, então se alguém ainda estava usando aplicativos do Office realmente antigos, não tão bons para compatibilidade traseira. mas o Office Open XML existe desde cerca de 2002-2006, então qualquer pessoa que use o Word ou o Excel nos últimos 10 anos será capaz de usar o formato de arquivo docx e xlsx perfeitamente.
apenas o meu pensamento sobre isso ...

Só para não nos entendermos mal:
É claro que o renderizador OpenXml Excel também funciona.

Só estou dizendo que o XLS / DOC também funciona, se for necessário.
Agora, se o XLS / DOC deve ser exposto ou não, ou se isso pode ser excluído com segurança, é outra questão. Pode haver alguns programas antigos por aí que não funcionam com o XLSX.

O UBS, por exemplo, ainda usa programas COBOL.
E existem vários outros.
Portanto, é provavelmente melhor deixar a funcionalidade XLS por mais tempo, só para garantir.

@RaymondHuy :
Se o Azure bloqueou a função GDI +, System.Drawing.Common funciona?
Ou isso se aplica apenas a chamadas DllImport externas à estrutura?

Hmm, apenas pesquisei.
Parece que as bibliotecas System.Drawing estão disponíveis no Azure Cloud Service (basicamente apenas uma VM), mas não no Azure Web App (basicamente hospedagem compartilhada?).
Isto poderia ser um problema.
Portanto, uma vez que este seja runnign no Linux, precisaremos substituir qualquer coisa System.Drawing por SixLabors.ImageSharp posteriormente, para fazê-lo funcionar no Azure Web App.

Isso vai custar tempo e esforço.
@RaymondHuy :
Você poderia verificar se o FreeType (wrapper SharpFont) funciona no Azure?
https://github.com/Robmaister/SharpFont

Nota:
No x64-Windows, você precisa substituir a cláusula using para FT_Long e FT_ULong por este

#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 as dlls freetype corrigidas não funcionam no x64-Windows.

Veja como eu fiz isso:
https://gist.github.com/ststeiger/9e2eb98e29a3c987aca739045af1d2ce

(Nota: defina WINDOWS nas opções de construção)

com algum código de teste:

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 produzirá uma exceção se a correção do WINDOWS não for aplicada.

quando estou tentando com o arquivo .rdlc, estou recebendo uma exceção
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable 'não está acessível neste contexto porque é' Amigo '.' em localreport.Execute ()
por favor me ajude

        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 você tem um problema com expressões VB incorporadas.
De qualquer forma, existem vários problemas.

Em Microsoft.VisualBasic1 \ VBCodeGenerator.cs
UseShellExecute precisa ser definido como 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
};

E FromFileBatch precisa ser substituído por roslyn se compilado para netstandard (o provedor CodeDom não pode compilar para netstandard - exceções engraçadas se expressões VB forem usadas, por exemplo, em 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

Existem RoslynCodeDomProviders em https://github.com/aspnet/RoslynCodeDomProvider , mas eles usam Roslyn nos bastidores. E compilar relativamente codificado com "C: \ WINDOWS \ Microsoft.NET \ Framework\\ vbc.exe "é uma má ideia.

Agora eu tenho o HTML4 completo, HTML5 e renderizador MHTML funcionando.
Não apenas o paginado.

Olá, estou usando [https://www.nuget.org/packages/AspNetCore.Reporting] e funciona perfeitamente no IIS local.
Mas depois de implantá-lo no servidor Windows 2012 R2, encontro um problema.

Logs de erros.

falha: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]
Ocorreu uma exceção não tratada ao executar a solicitação.
AspNetCore.Reporting.LocalProcessingException: Ocorreu um erro durante o processamento do relatório local.; A definição do relatório 'D: \ Apps \ BillingApproval \ ReportFiles \ ReleaseProcess.rdl' é inválida.
Ocorreu um erro inesperado ao compilar as expressões. Valor de retorno do 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: Ocorreu um erro inesperado ao compilar as expressões. Valor de retorno do 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)
em AspNetCore.Reporting.Report.SetParameters (parâmetro ReportParameter)
em AspNetCore.Reporting.LocalReport.Execute (RenderType renderType, Int32 pageIndex, Dicionário 2 parameters, String findString) at BA.UI.WebV2.Extension.AspNetCoreReportingExtension.ExecuteToMemoryStreamResult(LocalReport localreport, RenderType rendertype, Int32 index, Dictionary 2 parameters, String searchString) em D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Extension \ AspNetCoreReportingExtension.cs: linha 27
em BA.UI.WebV2.Controllers.ReportsController.ReleaseProcessToPDF (DateTime de, DateTime para) em D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Controllers \ ReportsController.cs: linha 65
em lambda_method (Closure, Object, Object [])
em Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute (mapeador IActionResultTypeMapper, executor ObjectMethodExecutor, controlador de objeto, argumentos Object [])
em Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync ()
em Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync ()
em Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (contexto ActionExecutedContext)
em Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
em Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()
em Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()
em Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (contexto ResourceExecutedContext)
em Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
em Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync ()
em Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
em Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext)
em Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (contexto HttpContext)
em Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (contexto HttpContext)
em Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke (contexto HttpContext)

@jfmjason : É causado quando o CodeDom Code Compiler (.NET 4.0) tenta compilar alguns arquivos em um caminho temporário no ExprHostCompiler. Ele deseja compilar assemblies NetStandard / NetCore com o provedor .NET 4.0. Isso não funciona. Ao tentar compilar esses arquivos, o csc.exe falha silenciosamente com o valor de retorno -1073741819.
Como não é possível compilar o código .NET Core com o compilador .NET 4.0, você precisa usar o RoslynCompilers, que não está em System.CodeDom. Meu NetStandardFromFileBatch acima corrige exatamente esse problema (e usa CodeDom se compilar para NetFramework 4).

No entanto, observe que o tempo de execução do VB no .NET Core é seriamente limitado.
Basicamente, o .NET Core não oferece suporte a VB.NET.

Se você olhar para coisas básicas do VB, como as funções de string VB de 50 ou mais, como Substituir, Trim, AscW, ChrW, LCase, Len, Mid, em Microsoft.VisualBasic.Strings - .NET Core 2.0 suporta exatamente 2 delas, AscW e ChrW ...

Se você olhar a fonte atual no github, verá que agora, eles estão lá - mas são todos stubs que geram null.
https://github.com/dotnet/corefx/blob/master/src/Microsoft.VisualBasic/ref/Microsoft.VisualBasic.cs

Portanto, além disso, você pode ter que editar um pouco o código VB em seus relatórios - para dar suporte ao .NET Core e ao NetFramework.

Então @ALL : aqui está uma ideia:
Se você deseja que seu relatório com código em execução no .NET Core sem modificações, comece a implementar as funções de string em Microsoft.VisualBasic.cs.
Ou remova coisas específicas do VB-runtime e tente usar as classes e funções de membro fornecidas com C #, como string.Length em vez de Len, IndexOf em vez de InStr, Subtring em vez de Mid, "BLA" .ToLower () em vez de LCase ("BLA") etc.

Além disso, o Código VB em geral, não apenas no .NET Core, tem problemas com a sintaxe anulável?.
Portanto, use System.Nullable (Of Double) em vez de Double ?, se você precisar declarar, por exemplo, um valor de retorno de função.

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

Além disso, você precisa alterar as referências do assembly em 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 : Ainda não o examinei, mas na versão paginada do Viewer, as imagens de um relatório aparecem na renderização de HTML paginado?
Porque quando eu peguei o renderizador completo html4 & 5 do ReportServer, as imagens parecem ser delegadas a um manipulador axd ou ashx de ReportingServices. Eles apareceram na versão MHT, no entanto.

Eles provavelmente devem ser alterados para url ("data: image / png; base64, SOME_BASE64_IMAGE"); em vez disso, para que fiquem embutidos no HTML.
Ou seja, se estiverem indo para um link não externo.
Não testei se isso afeta o visualizador também.

@ststeiger

Obrigado pela resposta. Eu me pergunto por que funciona perfeitamente quando eu publico uma versão de lançamento do meu aplicativo da web (.net core 2.1) no IIS local.

Pode ser que funcione localmente porque você tem o .NET Framework instalado localmente.
Ou porque o seu servidor web local não está no modo integrado, roda sob outro usuário ou atinge outro caminho lógico, configurações de pool de aplicativos, configurações de segurança, redirecionamentos de montagem, etc.
Além disso, ServicePacks, CumulativeUpdates e outros "recursos" interessantes.

Fiz uma pequena aplicação de teste.
Depois de adicionar System.Drawing.Common no Win10, ele funciona bem.
A execução no Ubuntu 16.04 leva a um erro.
AspNetCore.Reporting.LocalProcessingException: Ocorreu um erro durante o processamento do relatório local.; A definição do relatório '/opt/testReportViewer/bin/Debug/netcoreapp2.1/Reports/Report1.rdlc' é inválida.
Ocorreu um erro inesperado no processamento do relatório.
Não foi possível carregar a biblioteca compartilhada 'kernel32.dll' ou uma de suas dependências. Para ajudar a diagnosticar problemas de carregamento, considere definir a variável de ambiente LD_DEBUG: libkernel32.dll: não é possível abrir o arquivo de objeto compartilhado: Não existe esse arquivo ou diretório ---> AspNetCore.Reporting.DefinitionInvalidException: A definição do relatório '/ opt / testReportViewer /bin/Debug/netcoreapp2.1/Reports/Report1.rdlc 'é inválido.
Ocorreu um erro inesperado no processamento do relatório.
Não foi possível carregar a biblioteca compartilhada 'kernel32.dll' ou uma de suas dependências. Para ajudar a diagnosticar problemas de carregamento, considere definir a variável de ambiente LD_DEBUG: libkernel32.dll: não é possível abrir o arquivo de objeto compartilhado: Não existe esse arquivo ou diretório ---> AspNetCore.ReportingServices.ReportProcessing.ReportProcessingException: Ocorreu um erro inesperado no Processamento de Relatórios.
Não foi possível carregar a biblioteca compartilhada 'kernel32.dll' ou uma de suas dependências. Para ajudar a diagnosticar problemas de carregamento, considere definir a variável de ambiente LD_DEBUG: libkernel32.dll: não é possível abrir o arquivo de objeto compartilhado: Não existe esse arquivo ou diretório ---> System.DllNotFoundException: Não é possível carregar a biblioteca compartilhada 'kernel32.dll' ou uma de suas dependências. Para ajudar a diagnosticar problemas de carregamento, considere definir a variável de ambiente LD_DEBUG: libkernel32.dll: não é possível abrir o arquivo de objeto compartilhado: Não existe esse arquivo ou diretório
em AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat (Stream definitionStream, String & descrição, String & language, ParameterInfoCollection & parâmetros, DataSourceInfoCollection & dataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, Boolean & hasExternalImages, Boolean & hasHyperlinks, Byte [] & dataSetsHash)
em AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat (definição de Byte [], String e descrição, String e linguagem, ParameterInfoCollection & parameters, DataSourceInfoCollection & dataSources, DataSetInfoCollection & dataSetIntermediateFormat (Byte [] definição, String e descrição, String e linguagem, ParameterInfoCollection & parameters, DataSourceInfoCollection & dataSources, DataSetInfoCollection & dataSetInfoCollection & dataSetReferencias & dataSetReferencias;
em AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport (PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String & reportDescription, String & reportLanguage, ParameterInfoCollection & parâmetros, DataSourceInfoCollection & dataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, booleanas & hasExternalImages, booleanas & hasHyperlinks, Byte [] & dataSetsHash)
em AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
--- Fim do rastreamento de pilha de exceção interna ---
em AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
em AspNetCore.Reporting.ReportCompiler.CompileReport (ICatalogItemContext context, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
--- Fim do rastreamento de pilha de exceção interna ---
em AspNetCore.Reporting.ReportCompiler.CompileReport (ICatalogItemContext context, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
em AspNetCore.Reporting.LocalService.GetCompiledReport (PreviewItemContext itemContext, Boolean rebuild, ControlSnapshot & snapshot)
em AspNetCore.Reporting.LocalService.CompileReport ()
em AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport ()
em AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession ()
--- Fim do rastreamento de pilha de exceção interna ---

@ststeiger alguma notícia sobre a biblioteca AspNetCore.Reporting? Estou procurando uma solução para criar PDFs a partir de arquivo RDL no .NET Core há dias e a única solução que encontrei foi AspNetCore.Reporting, que mais tarde descobri que só funciona no Windows e as modificações que você fez e relatou aqui são muito atraentes , também porque estou tendo alguns problemas com sub-relatórios e não consigo depurar o AspNetCore.Reporting sem a fonte, que você tem :) ... Eu estaria muito interessado em ajudá-lo com essa biblioteca para melhorar os bits que faltam ( e finalmente poder depurá-lo ...)

@OkunevPY : É possível que isso seja causado por uma das funções de gerenciamento de memória que são usadas para armazenar os dados da fonte de dados com segurança. No Linux, acabei de desligar esse armazenamento de dados não criptografados. Então funciona, embora não seja seguro. Você tem que fazer isso no código ReportViewer, no entanto. O código de nível de produção teria que implementar um método de criptografar / descriptografar, o que não é difícil - mas prefiro apenas fazer com que todos os recursos funcionem primeiro,

@zillemarco;
A criação de PDF ainda não funciona (funciona apenas no Windows).
Além disso, se você criar qualquer aplicativo que implantar com essa dll de engenharia reversa, tecnicamente você está fazendo algo ilegal.

Se você precisa de um PDF gerado no Linux, recomendo gerá-lo a partir de HTML com wkHtmlToPdf.
Esta é uma variante do .NET-Core:
https://github.com/ststeiger/libWkHtml2X
Use apenas a variante executável (wkhtmltopdf.exe, wkhtmltoimage.exe via input / output-stream)
libWkHtmlToX.ProcessManager(opts)
porque wkhtmltox.dll não funciona em cenários de multi-threading, além disso, minha interface C # ainda não está totalmente livre de bugs.

Alguns exemplos de uso (converter.telerik.com para converter para C #):

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

Como alternativa, você pode usar PdfSharp para .NET-Core
https://github.com/ststeiger/PdfSharpCore

Também transferi a biblioteca PDF completa para o NetStandard, que pode ser encontrada aqui:
https://github.com/ststeiger/PdfSharpNetStandard
(se você não precisa de hospedagem Azure, recomendo que você escolha PdfSharpNetStandard)

No que diz respeito ao ReportViewer-PDF no Linux:
Você precisará implementar muitos pinvokes primeiro (o Linux não implementa a API do Windows e você não pode simplesmente encaminhar todas as chamadas dll para o wine).

Eu só fiz GetFontData ainda, pois este é o mais importante (incorporação de fontes).
Se você puder me fornecer o nome da sua conta gitlab (não hub), posso fornecer acesso de leitura ao repositório.

@ststeiger Eu sei que implantar um aplicativo com essa biblioteca seria ilegal e não pretendo fazer isso, mas com o código-fonte eu poderia pelo menos ser capaz de depurar entender por que não consigo carregar um sub-relatório e passe dados para ele (tentei com resharper, mas é um pesadelo). Se você quiser me dar acesso de leitura ao repo, eu adoraria :) Meu nome de usuário gitlab é zillemarco (assim como aqui no github)

@zillemarco : Adicionou você.
Você deve ter recebido um e-mail do gitlab, provavelmente com o link para o repo.

Experimente ILSpy 4.0 Beta 2 em vez de Resharper:
https://github.com/icsharpcode/ILSpy/releases

Se você precisar depurar dentro do .NET Framework, tente descompilar e depurar ao vivo com Rider, o EAP é gratuito:
https://www.jetbrains.com/rider/eap/

@ststeiger recebeu o email, obrigado :) Obrigado pela dica também!

@ststeiger Você pode dar acesso ao repositório AspNetCore.Reporting para okunevpy?

@OkunevPY : Você foi adicionado. Veja o correio.

@ststeiger Obrigado.

        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: 'Ocorreu um erro durante o processamento do relatório local.; Nenhum dado está disponível para a codificação 1252. Para obter informações sobre como definir uma codificação personalizada, consulte a documentação do método Encoding.RegisterProvider.'

@Jhonnybmx : existe um site, chamado google.com, onde você coloca a mensagem de erro e a solução é o primeiro link ...

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

Olá, estou interessado no LocalReport no .NET Core para exportar o relatório rdlc para PDF.
Para mim, apenas a versão do Windows está bem por enquanto.

Eu encontrei o pacote NuGet AspNetCore.ReportingServices por @ amh1979 que é exatamente o que eu preciso.
O problema é que a classe InternalLocalReport neste pacote é interna e preciso acessar a API inteira (como na implementação original do MS LocalReport) para a eq. para usar o evento SubreportProcessing, chame os métodos LoadSubreportDefinition () ou GetParameters ().

Esses métodos não são implementados na classe AspNetCore.Reporting.LocalReport (em AspNetCore.Reporting NuGet), portanto, preciso chamá-los diretamente.

O assembly AspNetCore.ReportingServices.dll definiu InternalsVisibleTo para o assembly AspNetCore.Reporting.dll.
Posso de alguma forma usar isso como está em https://github.com/amh1979/Reporting/tree/master/AspNetCore.Reporting com o certificado Reporting.pfx (para o qual não tenho uma senha).

Por favor você pode me ajudar? Qual é a solução para isso?

@ststeiger Você pode me dar acesso ao repositório GitLab AspNetCore.Reporting também. Meu nome de usuário GitLab é holajan.
obrigado

O AspNetCore.ReportingServices sob esta licença
http://go.microsoft.com/fwlink/?LinkId=826162
Eu fechei

Alguém pode fornecer documentação / dicas ou dicas sobre como usar / implementar este pacote? Muito obrigado.

@ststeiger Você poderia me dar acesso ao repositório AspNetCore.Reporting? Estou tentando fazer funcionar no Linux com PDF.

@holajan , @skivsoft :
Desculpe, estava de férias - foi uma boa viagem para Cingapura e Tailândia.
Acesso concedido, você deve ter recebido um e-mail para o endereço fornecido ao gitlab.

@azharuddinsayed :

quando estou tentando com o arquivo .rdlc, estou recebendo uma exceção
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable 'não está acessível neste contexto porque é' Amigo '.' em localreport.Execute ()
por favor me ajude

Consegui reproduzir esse erro.
As seguintes alterações são necessárias:


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)

e

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

Além disso, a seguinte correção em
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 + "\"")

Então, o código personalizado funciona, pelo menos no meu caso.
Atualizado no mestre.

@ststeiger Obrigado pelo acesso. Você tem alguma ideia de como renderizar PDF no Linux? Existem muitos pinvokes para substituir.

@skivsoft : Ainda não existe nenhum.
Você precisará substituir todos os pinvokes por um equivalente do freetype, o que é muito trabalhoso.

Se você só precisa criar um PDF no Linux, pode tentar PdfSharpCore ou PdfSharpNetStandard:
https://github.com/ststeiger/PdfSharpCore
https://github.com/ststeiger/PdfSharpNetStandard
Eu uso os dois no Linux.
PdfSharpNetStandard é mais completo, mas também usa GDI + / libGDIplus, enquanto PdfSharpCore evita System.Drawing.

@ststeiger Obrigado pelo acesso ao repo.

Consegui fazer meu relatório funcionar (exportar para PDF) em meu aplicativo do Windows .NET core 2.2.
Fiz uma cópia do seu projeto ReportViewer_NetStandard, porque removi LocalReports e alterei InternalLocalReport para LocalReport e tornei a classe pública (eu precisava acessar a API LocalReport original).

Para meu relatório, resolvi dois problemas:
Algumas expressões do Visual Basic:
IIf - acrescentei Importar para Microsoft.VisualBasic.Interaction em _ExprHostBuilder_, alterado para netcoreapp2.2 onde a classe Microsoft.VisualBasic.Interaction em _Microsoft.VisualBasic.dll_ é interno e acrescentou minha classe Microsoft.VisualBasic.Interaction para Microsoft.VisualBasic1.

Formato - adicionado Import a Microsoft.VisualBasic.StringsEx em _ExprHostBuilder_, classe Microsoft.VisualBasic.StringsEx adicionada a Microsoft.VisualBasic1 (porque a classe original Microsoft.VisualBasic.Strings é pública, mas sem a função Format)

System.Environment.NewLine - adicionada referência a System.Runtime.Extensions.dll em _ExprHostCompiler_.

Estas são as mudanças no 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

Corrija sub-relatórios com expressões:
Percebi que os elementos do Sub-relatório estavam usando ReportExprHost do relatório principal, não ReportExprHost para o sub-relatório específico, portanto, as expressões nos sub-relatórios não estavam funcionando. Consegui encontrar um erro em ReportRuntime.LoadExprHostAssembly , onde os assemblies ExpressionHost.dll foram armazenados em cache por nome, mas o nome de todos os relatórios e sub-relatórios é sempre o mesmo "_ExpressionHost_". Eu removi esse cache.
Mudanças no 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();
                }
            }

Reveja essas alterações e, se isso fizer sentido para você, faça-as também em seu repositório.

Obrigado.

@holajan : Se eu adicionar System.String aos namespaces, obtenho:
Ambigous call to Replace - cannot resolve call
e se eu adicionar a classe Microsoft.VisualBasic.Interaction, obtenho:
ambigous call to Microsoft.VisualBasic.Interaction
quando eu o executo no NetCore ou .NET Framework 4.
Talvez isso funcione apenas no .NET Core 2.2.

Se estiver armazenando em cache incorretamente, é melhor não fazer o cache.
Concordo com essa mudança.
No entanto, coloquei o código antigo em #ifdef false (em vez de removê-lo).

@ststeiger Eu editei meu comentário, usando para System.String estava errado, agora implementei Microsoft.VisualBasic.StringsEx em vez de Format e outras funções. Desculpe por isso.

Sim Microsoft.VisualBasic.Interaction funciona apenas no .NET Core 2.2., Porque a classe Microsoft.VisualBasic.Interaction está em Microsoft.VisualBasic.dll para .NETCoreApp v2.2 interno , em Microsoft.VisualBasic.dll para .NETCoreApp v2.09 é público, mas com método interno IIf .
Não sei como resolver isso melhor, mas com o .NET core 3.0 provavelmente será alterado de qualquer maneira.

@holajan : Até
Tornei o InternalLocalReport público.
Nome estranho agora em relação à sua publicidade;)

@holajan : Adicionado Microsoft.VisualBasic.StringsEx, agora funciona
Tive que adicionar IReadOnlyDictionary para .NET 4, mas apenas uma observação secundária.
Você poderia testar se isso funciona com você.

@ststeiger eu testei.
Devo alterar #if false para #if true em Microsoft.VisualBasic1._Interaction.cs para que a expressão IIf funcione.
Caso contrário, funcionará bem.
Obrigado

@holajan : OK, é assim que deve ser. talvez uma definição na solução seja melhor.

Todos neste tópico devem votar para que isso seja adicionado, aqui: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- testemunho

Em 2019/03, seu sétimo recurso mais procurado: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Edit: A partir de 2019/05 é o quinto a partir do topo

Edit: A partir de 2019/07 é o quarto a partir do topo

        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: 'Ocorreu um erro durante o processamento do relatório local.; Nenhum dado está disponível para a codificação 1252. Para obter informações sobre como definir uma codificação personalizada, consulte a documentação do método Encoding.RegisterProvider.'

Adicione o código abaixo:
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
Resolve meu problema

Oi,

Tentei exportar o relatório em Html usando o código abaixo, mas não está renderizando corretamente.

Arquivo .rdl contém gráfico

Anexei uma captura de tela de Html

Agradeço muito se você puder nos ajudar a resolver esse problema.

obrigado

PlatForm: ASP.NET Core

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

string mimtype = "";
extensão interna = 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 : O que mostra o URL do elemento "gráfico de relatório"?
O renderizador html tem um fluxo de saída secundário para CSS.
Ele contém uma imagem codificada em base64? Ou é apenas um link para um manipulador de imagens?

@ststeiger
Olá, por favor, encontre HTML e CSS abaixo
HTML:

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







CSS:

"#rsoReportDiv .A97993c8d452f40d4910a317776d607f616xBc {
borda: 1pt nenhum Preto;
cor de fundo
}

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 do gráfico de relatório
Report chart
eu acho que esse erro causa o problema

Obrigado..

@ststeiger

Olá, alguma atualização?

@chinturathod :
Atualmente estou trabalhando em CEF-pdf como substituto wkhtml2X e em relatórios SwissRe.

Terei tempo para examinar este projeto em mais de duas semanas, no mínimo.

Existe um repositório (privado ou outro) para o pacote AspNetCore.ReportingServices ao qual eu poderia ter acesso?

@clintb : Preciso do nome da sua conta do git LAB , para poder conceder acesso a você.
Você então receberá um e-mail no endereço de e-mail da conta do git lab contendo o acesso ao repo.

Ei Stefan, meu gitLab é c_l_i_n_t. Obrigado!

Na sexta-feira, 26 de abril de 2019 às 12h18 Stefan Steiger [email protected]
escrevi:

@clintb https://github.com/clintb : Eu preciso do nome da sua conta git LAB , então
Eu posso conceder acesso a você.
Você então receberá um e-mail para o endereço de e-mail do laboratório git
conta que contém o acesso repo.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/aspnet/AspNetCore/issues/1528#issuecomment-487133308 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ABURO5ILQUEGMZARNW2HNALPSM2M5ANCNFSM4CFRN7MQ
.

@clintb : Você foi adicionado.

Olá @ststeiger , se você quiser, conceda acesso de repo para o lote. Obrigado pelo seu trabalho e ajuda.

@lotsatrees : Você foi adicionado.

Obrigado Stefan, fico feliz em comprar uma boa cerveja para você a qualquer hora.

Olá @ststeiger , meu gitlab é edgardoreyes. Muito obrigado.

@ststeiger
Meu gitlab é ikourfaln
Obrigado

@ikourfaln , @edgardoreyes : Adicionaram vocês dois; você deve ter recebido um e-mail na conta de e-mail registrada no gitlab.

@ststeiger , seria possível também adicionar a mim mesmo (Mhirji no gitlab)?

Obrigado!!

@Mhirji : Pronto.

Obrigado!!!

Por que não apenas criar um projeto de servidor de relatório e usá-lo como um serviço para qualquer tipo de projeto?
Seu projeto ASP.NET Core precisará apenas da URL do serviço de relatório para mostrar os relatórios.
Algum problema com essa abordagem?

@ststeiger também posso obter acesso? (ConstantDisaster no gitlab) obrigado antecipadamente

@ConstantDisaster : adicionado.
@mshwf : Não, na verdade isso é exatamente o que eu quero fazer - para que possamos executar relatórios em nosso próprio aplicativo e nenhum servidor de relatórios necessário (sempre um problema com a autenticação do Windows - por alguns motivos, os departamentos de TI são incapazes de adicionar novos usuários a um grupo - além de sempre um problema com service packs desinstalados, não querendo atualizar para a versão mais recente do SQL-server porque os clientes querem pular uma versão, renderizando inconsistências entre ReportViewer e ReportServer, nosso próprio administrador de sistema com preguiça de instalar qualquer coisa, etc.). Só falta tempo, como sempre. Além disso, são os primeiros dias de sol do verão, aqui no noroeste da Europa, e não quero perdê-los.

@ststeiger Existem alternativas melhores? (Tentei ler este tópico, mas é muito longo!)
você também poderia me conceder acesso ao repositório GitLab (mshwf)?
obrigado

Por favor, apoie este pedido , esperamos que a Microsoft nos ouça!

Ei @ststeiger , você poderia me adicionar também?
Meu nome de usuário gitlab é k3flo
muito obrigado
Vielen Dank 😊

@ststeiger obrigado por adicionar, então como faço para começar a usar isso novamente? em um projeto asp net core? pensei que tinha um readme ou algo assim, obrigado novamente.

@ConstantDisaster : Existe um "exemplo", em AnyWebReporting\Any_TestCode\TestReport.cs .
Mostra como renderizar um relatório com parâmetros e conjuntos de dados em um PDF.

Resumindo:
1) Crie um dicionário para os parâmetros do relatório:

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

2) Adicione todos os parâmetros que você tem em seu relatório ao dicionário, por exemplo

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

3) Crie um novo relatório LocalReport baseado e carregue o relatório

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

Então, para todos os conjuntos de dados que são usados ​​apenas em parâmetros, você pode adicionar uma tabela de dados vazia (não NULL)
lr.AddDataSource("SEL_Standort", new System.Data.DataTable());

E para cada conjunto de dados usado, você precisa preencher uma tabela de dados com o resultado da consulta para esse conjunto de dados e adicionar o conjunto de dados às fontes de dados:

lr.AddDataSource("DATA_Schluesselbestandeskontrolle", dt);

Então, você pode executar o relatório, buscar o resultado e gravá-lo em algum lugar, por exemplo, drive d:

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

Eu adicionei uma página HTML de exemplo que imita o design da interface do relatório ReportViewer 2014 e 2017, que eu tinha em uma versão de rascunho. Se você buscar novamente do git, você o encontrará em:

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

E é isso.
Se você precisar exibir o relatório na web, pode renderizar em html passando o respectivo Enum em lr.Execute (RenderType.HTML5_0 ou HTML4_0 ou Mhtml) e passar o número de página correto. O resultado (HTML) está em MainStream e o CSS está em SecondaryStream.

No entanto, conectando o index.htm do ReportViewer com lr.Execute por JavaScript, você precisa fazer você mesmo, por enquanto. Ainda não consegui fazer isso. Por enquanto, preciso gerar PDFs para anexar a e-mails.

@ k3flo @mshwf : Adicionado.

@mshwf :

@ststeiger Existem alternativas melhores? (Tentei ler este tópico, mas é muito longo!)

Não que eu saiba, caso contrário, eu estaria usando.
Talvez veremos algo a esse respeito após o lançamento do .NET Core 3.1 (LTS) , porque então o caminho estaria livre para criar um ReportViewer somente para Windows baseado no .NET Core.

No entanto, tal coisa seria tão bricolage quanto este projeto, então talvez eles levem algum tempo para remover todo o código System.Drawing (e chamadas WinAPI para GDI +) e fazer isso corretamente, ou seja, plataforma cruzada. Embora, em minha opinião, isso seja improvável. Não estou infeliz por ter sido surpreendido positivamente (tosse).

O fato é que os relatórios podem conter código VB e o suporte VB no .NET Core (<3) é, no momento, questionável - na melhor das hipóteses. Isso será (= teoricamente deveria ser) retificado pelo .NET Core 3 e, se eles fizerem um ReportViewer, provavelmente esperarão pelo menos até o lançamento do LTS.

@mshwf :
Você não precisa ler este tópico inteiro.
Tudo que você precisa fazer é clonar o projeto com git e ver o relatório de exemplo (embora você não tenha o banco de dados para executá-lo).

Você poderia me adicionar no gitlab, por favor?
dcga

@dcga : adicionado.

Olá, você poderia me adicionar em seu gitlab? Estou convertendo o relatório para o projeto ASP.net Core agora.

@ ericyu67 : Suponho que o nome da sua conta gitlab seja ericyu? Nesse caso, você foi adicionado.

Correto, obrigado.

@ststeiger você poderia me adicionar por favor?
Rodrigorrl

@rodrigorrl : adicionado.

@ststeiger você poderia me adicionar por favor?

@myersBR : Pronto.

@ststeiger você pode me adicionar, por favor?

@acofalc : Adicionado @ aco.mit

Olá, @ststeiger , por favor, me adicione: oblin228, obrigado.

Alguma novidade sobre isso? Estou usando o ASP.NET Core e me recuso a voltar para webforms. Tenho um projeto de relatórios e alimentei a url do servidor de relatório para o meu aplicativo para baixar o arquivo. O problema é que ele constantemente pede autenticação do Windows e eu gostaria de evitar isso ...

@oblin : adicionado.

@jfcaldeira : Contanto que você execute o aplicativo no Windows, o reportviewer no gitlab deve funcionar, mais ou menos (problema aberto com imagens na saída HTML, até agora). Execute-o no Linux, e ele deve funcionar contanto que você não use PDF, TIFF ou PowerPoint como formato de saída (não sei sobre o word), mas Excel, html, xml e json funcionaram no Linux também (em meu teste de 1 relatório - não posso dizer se nada explode se você usar o conjunto completo de recursos).

Mas se o seu problema é a autenticação do Windows no SSRS, por que você não usa a segurança personalizada (também conhecida como autenticação de formulários SSRS).

Para isso, veja aqui:
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

Você pode precisar fazer o login do usuário com um Form-Post em JavaScript e definir uma P3P-policy (no SSRS via módulo http) para que o SSRS-auth-cookie persista nos domínios do IE ... (nota: se você usar diretórios virtuais e tiver 2 aplicativos em um SSRS, o auth-cookie do aplicativo1 [que está no domínio SSRS] substituirá o auth-cookie do aplicativo2, que também está no domínio SSRS)

@oblin : adicionado.

@jfcaldeira : Contanto que você execute o aplicativo no Windows, o reportviewer no gitlab deve funcionar, mais ou menos (problema aberto com imagens na saída HTML, até agora). Execute-o no Linux, e ele deve funcionar contanto que você não use PDF, TIFF ou PowerPoint como formato de saída (não sei sobre o word), mas Excel, html, xml e json funcionaram no Linux também (em meu teste de 1 relatório - não posso dizer se nada explode se você usar o conjunto completo de recursos).

Mas se o seu problema é a autenticação do Windows no SSRS, por que você não usa a segurança personalizada (também conhecida como autenticação de formulários SSRS).

Para isso, veja aqui:
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

Você pode precisar fazer o login do usuário com um Form-Post em JavaScript e definir uma P3P-policy (no SSRS via módulo http) para que o SSRS-auth-cookie persista nos domínios do IE ... (nota: se você usar diretórios virtuais e tiver 2 aplicativos em um SSRS, o auth-cookie do aplicativo1 [que está no domínio SSRS] substituirá o auth-cookie do aplicativo2, que também está no domínio SSRS)

Olá, obrigado por responder sobre meu problema. Eu não ouvi falar deste reportviewer no gitlab, você pode me mostrar uma âncora para ele?

E sobre a autenticação do Windows, o problema é que eu tenho o usuário autenticado usando autenticação de cookie em meus aplicativos no ASP.NET Core e a solução alternativa para fazer os usuários acessarem o relatório é basicamente passar a URL direta com parâmetros para o href de uma âncora e escolha PDF como formato nele também. Eu estava tentando encontrar uma maneira de não solicitar autenticação ao usuário porque é irritante para o usuário final ter que se autenticar duas vezes. já estou usando uma conta específica apenas para acesso à fonte de dados, isso é um para baixo.

Olá, @ststeiger - meu gitlab é arunputhran. Você pode me conceder acesso, por favor? Muito Obrigado!

Repostar isso porque foi enterrado em todas as solicitações "dê-me acesso ao gitlab".

Todos que encontrarem este tópico devem votar para que o SSRS do .NET Core seja adicionado, aqui: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for -asp-net-core

Começou na 7ª posição e subiu para a 4ª posição, o recurso do SQL Server mais solicitado (https://feedback.azure.com/forums/908035-sql-server?category_id=325159)

Edit: Por causa deste post, está até o 3º lugar agora

Não tenho certeza se isso ajuda ...

@arunputhrankyc : Adicionado.

@ k290 : Nah, como você pode ver, um Tema escuro para SQL Server Management Studio 2017 é claramente mais importante: scream:: man_facepalming:: woman_facepalming:
Aparentemente, eles ainda não ouviram falar sobre SQL-ops-studio / AzureDataStudio .

Acho que, com esse espírito, alguém deveria adicionar design plano a essa lista de desejos, apenas como uma piada.
Infelizmente, ainda não é 1º de abril: wink:

A propósito, recebo relatórios em pdf de uma API da web e não uso nenhum bit wcf.
apenas chamadas soap / asmx e chamadas http.
em fazê-los eu passo credentails sem problemas.
meu código é asp.net 4.6 / web api 2
se você quiser ver o que eu faço, posso colocar alguns códigos em um github na próxima semana para você verificar.
Estou ligando para o servidor de relatório 2016, mas a maior parte do que estou fazendo funcionará com as versões mais antigas do ssrs.

Olá, li este seu comentário sobre como você está lidando com o SSRS. Estou fazendo algo semelhante também, tenho uma âncora em um aplicativo ASP.NET Core que tem a URL diretamente para o relatório com parâmetros incluídos e a extensão de formato. No entanto, o problema é que ele pede autenticação do Windows. Existe uma maneira de parar de perguntar isso, já que os usuários já efetuaram login no meu aplicativo usando autenticação de cookie? Eu nem me importo em mostrar o relatório, desde que seja baixado, mas seria bom pular a autenticação

@arunputhrankyc : Adicionado.

@ k290 : Nah, como você pode ver, um Tema escuro para SQL Server Management Studio 2017 é claramente mais importante 😱 🤦‍♂ 🤦‍♀
Aparentemente, eles ainda não ouviram falar sobre SQL-ops-studio / AzureDataStudio .

Acho que, com esse espírito, alguém deveria adicionar design plano a essa lista de desejos, apenas como uma piada.
Infelizmente, ainda não é primeiro de abril 😉

Bem, eu mataria por um tema escuro para SSMS com certeza, mas eu comeria minhas próprias mãos por esse SSRS. A quantidade de trabalho economizada ao renderizar dados agrupados diretamente do SQL é incrível.

Ótima solução, por favor me adicione no gitlab: @kholossok , obrigado

Por favor, me adicione também no gitlab: @EMaderbacher

@kholossok , @EMaderbacher : Adicionado.

Me adiciona também por favor @jfcaldeira

@jfcaldeira : Você precisa me dar uma conta do git lab .
Esta é uma conta de hub git.
É grátis. https://gitlab.com
Repositórios privados não eram gratuitos no github na época.

@ststeiger
Repositórios privados agora são gratuitos no GitHub, a limitação está no número de colaboradores.

@jfcaldeira : Você precisa me dar uma conta do git lab .
Esta é uma conta de hub git.
É grátis. https://gitlab.com
Repositórios privados não eram gratuitos no github na época.

Eu criei uma conta com o mesmo nome de usuário

@jfcaldeira : Adicionado. Você deve ter recebido um e-mail com as informações de acesso.
@ikourfaln : Eu sei. Não sabia que havia uma limitação de 3 colaboradores em repositórios privados do github. É bom saber disso, obrigado .

Limitações do Gitlab:

Para comemorar as boas notícias de hoje, aumentamos permanentemente nosso limite de armazenamento por repositório no GitLab.com de 5 GB para 10 GB. Como antes, os repositórios públicos e privados no GitLab.com são ilimitados, não têm limite de transferência e incluem colaboradores ilimitados.

Posso ser adicionado também? Minha conta GitLab é barryjsilver. Obrigado!

Posso ser adicionado, por favor? @jyanosu Obrigado!

@BarryJSilver : adicionado.

@jyanosu : eu preciso da conta git lab .com, não do github.

@ststeiger Opa, basta configurar .. mesmo nome de usuário @jyanosu

@jyanosu : Adicionado.

@ststeiger você pode adicionar minha conta gitlab @ kanichi123
Obrigado!

@ kanichi123 : Adicionado.

@ststeiger por favor, minha conta também sheryever

@sheryever : Adicionado.

@ststeiger, por favor, você pode adicionar minha conta gitlab @PentaTech
Obrigado!

@ststeiger você poderia me adicionar também? @glebteterin
Obrigado!

@PentaTech , @ g-rad: adicionado.

@ststeiger bom esforço nisso, você poderia adicionar a conta gitlab brad0000?

@ brad0000 : Pronto.

Olá @ststeiger , você também poderia me adicionar? conta gitlab: wyepez. obrigado

@wyepez : Adicionado.

@ststeiger Você pode me adicionar também?

Nome de usuário Gitlab: choudeshell

@choudeshell : Adicionado.

Você pode me adicionar? Obrigado!

A sua solução funciona com .rdlc (assim como .rld do lado do servidor)? obrigado

A sua solução funciona com .rdlc (assim como .rld do lado do servidor)? obrigado

@mpirritano : Sim, de fato, não há muita diferença entre RDL e RDLC.
Mas é apenas web. Sem Windows-Forms.
Preciso de uma conta de laboratório git para adicionar você, não github.

@ststeiger Obrigado - criei uma conta GitLab agora

Isso é ótimo - eu só preciso dele para ASP .NET Core direcionado ao .NET Core. Obrigado!

@mpirritano : adicionado, você deve ter recebido um e-mail na conta de e-mail que usou para registrar o gitlab.

Entendi; obrigado!

@ststeiger funciona muito bem, exceto que não pode renderizar gráficos. - ele renderiza a área do gráfico com o erro: " Não foi possível carregar o arquivo ou montagem" System.Windows.Forms, Versão = 4.0.0.0 "

Esta é uma limitação conhecida ou estou faltando alguma coisa?

obrigado

@ststeiger Além disso, não parece que haja suporte para sub-relatórios. ou seja, não parece haver um manipulador de eventos de processamento de sub-relatório para adicionar fontes de dados à instância do sub-relatório

obrigado

Você pode me adicionar? Obrigado! @ashabyralieva

A sua solução funciona com .rdlc (assim como .rld do lado do servidor)? Obrigado

@mpirritano : Sim, realmente não há muita diferença entre RDL e RDLC.
Mas esta é apenas uma rede. Sem Windows Forms.
Preciso de uma conta do Git Lab para adicionar você, não do GitHub.

Você pode me adicionar? Obrigado! @ashabyralieva

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

@mpirritano :

Esta é uma limitação conhecida ou estou faltando alguma coisa?

Sim, uma limitação que eu sabia que poderia existir.
E também tem um problema com a saída de imagens em HTML.
Pontos abertos.
Eu nem pensei em sub-relatórios ainda.
Infelizmente, temos alguns deles também, então esse também será o meu problema.
Por falar nisso, nem sei como os sub-relatórios são tratados no ReportViewer normal do framework completo, principalmente porque podem ser recursivos.

Provavelmente há um problema em algum lugar, porque "System.Windows.Forms, Version = 4.0.0.0" não existe nessa versão no .NET Core, e também, o assembly é denominado System.NetStandard.Forms no ReportViewer para .NET Core. Pode funcionar no framework completo, porque existe System.Windows.Forms, Version = 4.0.0.0.

O problema com System.Windows.Forms provavelmente pode ser retificado tão facilmente quanto colocar o nome do assembly e a versão (onde quer que ele esteja oculto no código-fonte) em um ifdef, os sub-relatórios, não, eu acho.

Ainda tenho que terminar o serviço de envio de relatórios esta semana, então posso dar uma olhada no problema System.Windows.Forms na próxima semana.

No que diz respeito aos sub-relatórios: eles são uma má ideia de qualquer maneira, tendem a criar problemas com PDF e Excel, e caso você tenha apenas 1 relatório, eu recomendo ver se não é possível eliminar o sub-relatório de alguma forma. e faça tudo contido em um relatório.

Добавлено
Como obter o banco de dados COR_Basic_SwissLife_UAT?

: rofl: Haha, boa, você não, esse DB é confidencial.
Mas você pode fazer seu próprio relatório de exemplo, usando seu próprio banco de dados.
Você deve ver no exemplo como usá-lo.

@ststeiger Obrigado. Na verdade, vejo que há um evento SubreportProcessing definido em AsNetCore.Reporting.InternalLocalReport. Posso tentar criar uma interface pública para isso e ver se consigo passar as fontes de dados para as instâncias do sub-relatório. Posso não chegar a isso até a próxima semana também ...

Tento evitar sub-relatórios também, mas os considero necessários nos casos em que você precisa de uma seção de repetição dentro de uma seção de repetição. Com relação ao Excel, é possível renderizar cada instância de sub-relatório como uma planilha no Excel com rdlc / rdl

Repostagem para recém-chegados.

Todos neste tópico devem votar para que isso seja adicionado, aqui: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- testemunho

Em março deste ano estava em 7º lugar no topo.

Agora, estamos em segundo lugar a partir do início das sugestões do SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Podemos vencer o Modo escuro?

@ststeiger Na verdade, tive um pouco de tempo hoje e consegui renderizar relatórios com sub-relatórios em .docx, .xlsx e .pdf com sucesso.

Como um teste rápido em minha cópia local - alterei o modificador de acesso da propriedade "localReport" da classe "LocalReport" de "interno" para "público". Então eu poderia escrever um manipulador para o evento "SubreportProcessing" como sempre faria (onde eu leria o valor do parâmetro para a instância do sub-relatório e usaria para filtrar um conjunto de dados que eu passaria para a fonte de dados da instância do sub-relatório)

Não tenho ideia de como consertar o problema de renderização de gráficos com o .NET Core; então, se você conseguir chegar a uma solução, isso seria incrível. Mas, além disso, acho que sua solução faz tudo o que preciso (pessoalmente nunca renderizo relatórios em formato HTML)

obrigado

export- word, excel not woking?
FormatException: O cabeçalho contém valores inválidos no índice 0: ''

o serviço é muito lento. o que pode ser feito? Por favor ajude....

Olá a todos, acabei de escrever uma porta personalizada do controle do visualizador de relatório usando ReportExecutionService.asmx que está embutido no SSRS e estava visando a ASP.NET MVC. Alguém sugeriu portá-lo para .NetCore & MVC, então concluí isso. Experimente e me diga o que vocês acham: https://github.com/alanjuden/MvcReportViewer

Alan

export- word, excel not woking?
FormatException: O cabeçalho contém valores inválidos no índice 0: ''

o serviço é muito lento. o que pode ser feito? Por favor ajude....

@azikaa : Você está usando MvcReportViewer ou AspNetCore.ReportViewer?

Estamos encerrando este problema porque não é diretamente relevante para este repo e com base nos comentários aqui, a equipe do SSRS já está ciente deste feedback. Dada a quantidade de comentários que isso recebeu, agora é incontrolável.

A resposta de @ k290 é a mais acionável aqui, portanto, siga sua sugestão aqui :

Repostagem para recém-chegados.

Todos neste tópico devem votar para que isso seja adicionado, aqui: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- testemunho

Em março deste ano estava em 7º lugar no topo.

Agora, estamos em segundo lugar a partir do início das sugestões do SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Podemos vencer o Modo escuro?

Esta página foi útil?
0 / 5 - 0 avaliações