Aspnetcore: Rapports Asp.Net Core (SSRS)

Créé le 2 juin 2016  ·  269Commentaires  ·  Source: dotnet/aspnetcore

Je travaille sur l'application ASP.NET Core et je ne trouve pas de solution pour afficher les rapports SSRS. Avec les absents de "Microsoft.Reporting.WebForm" ne fonctionne plus. Quelle est la meilleure pratique pour afficher des rapports SSRS sur le Web dans ASP.NET Core

External

Commentaire le plus utile

Presque 2 ans. Le Core 2.0 est publié. Équipe SSRS, réveillez-vous.

Tous les 269 commentaires

Avec Core toujours en RC (RTM d'ici la fin du mois), je ne pense pas qu'un scénario SSRS soit prévu dans les 6 prochains mois mais je ne fais pas partie de l'équipe.

Je générerais ces rapports côté client en utilisant certaines bibliothèques javascript ou je pré-générerais ces rapports.

Si vous avez besoin de quelque chose de plus "intégré", vous pouvez consulter ce package communautaire:

https://github.com/ilich/MvcReportViewer

Au regard du numéro https://github.com/ilich/MvcReportViewer/issues/121 , ils sont intéressés à l'intégrer mais sans succès jusqu'à présent.

Je ne comprends pas pourquoi les initiatives de base dotnet et ASP.net gardent le silence sur cette question sur toutes les annonces précédentes. C'est comme
[La création de rapports n'est pas une préoccupation majeure pour les développeurs et ils peuvent y faire face en utilisant des classes html et print css]
actuellement, nous migrons un petit fichier ERP avec beaucoup de fichiers ssrs rdlc et l'approche css ne fait aucun bien dans les rapports entre navigateurs.
d'autre part, la semaine dernière, microsoft a publié ssrs 2016 avec une visionneuse html5 pure qui éliminait le besoin d'installation activex [ce qui était le seul inconvénient de l'utilisation de ssrs sur un navigateur non-ie]
La visionneuse ssrs 2016 s'intègre parfaitement dans le core eco system asp.net
mais aucune déclaration officielle concernant le support de base asp.net n'a été déclarée.

est-ce que tout est bloqué par System.Drawing ?? parce que même itextsharp n'avait pas encore sorti de bibliothèque.
s'il s'agit de System.Drawing, alors au moins l'implémentation de Windows peut être terminée avant [linux et OSX] afin d'augmenter l'adoption pour le développeur Windows actuel au lieu d'attendre l'implémentation multiplateforme complète de System.Drawing

J'espère que cet article incitera l'équipe à reconsidérer certaines priorités pour activer ssrs dans le noyau asp.net

avec le respect de MvcReportViewer mentionné dans le post précédent (c'est un wrapper autour de la visionneuse de formulaires Web) et cela a aidé beaucoup de développeurs mvc dans le passé à surmonter le manque de visionneuse de rapport mvc dans mvc1 à mvc5 [Merci beaucoup ilich], j'espère voir une solution complète parce que ssrs n'était pas une priorité de première classe et que les gens s'en tenaient à ce sujet dans le mvc pré-core.

Merci aux développeurs,
transmettre ce numéro à vos collègues afin de commenter.
cela pourrait lui donner une priorité et motiver l'équipe à faire quelque chose.

@ ddddddddeee22211 C'est une V1.

Vous ne livrez pas initialement avec le support SSRS. Le support avec SSRS proviendrait probablement de l'équipe SSRS et non de l'équipe .NET. Puisque nous ne sommes même pas encore sortis de RC, je ne vois pas cela comme une fonctionnalité critique de la V1.

Si vous avez besoin de créer des rapports, puis-je recommander d'exécuter simplement la version des formulaires Web? Ouais. C'est vieux. Mais au moins cela fonctionne et c'est pris en charge.

Si vous avez besoin de rapports X-Plat, je vous recommanderai quelque chose comme Chartist . Il vous permet de générer des graphiques directement sur le client. Ajoutez un fichier CSS à des fins d'impression et de boom. Vous avez des rapports qui peuvent être imprimés.

de votre point de vue, ce n'est peut-être pas critique
mais certains autres développeurs considèrent que c'est très important pour leurs projets, car une fois qu'ils ont développé une application et mis en ligne avec elle, les tâches de développement sont suspendues et les tâches de rapport deviennent des tâches de routine quotidienne. certains projets gèrent également la création de rapports à l'équipe de BI (intelligence d'affaires) qui sait comment utiliser ssrs mais n'a pas d'idée sur asp.net core.

le but de mon article était de comprendre la position de ssrs au sein de l'écosystème central asp.net. ou s'il sera ignoré comme dans mvc1 à mvc5. L'équipe ssrs fait partie de Microsoft et l'équipe principale d'asp.net peut discuter du problème avec eux.
ce qui m'a rendu fou, c'est quand j'ai vu la note de sortie de ssrs 2016 la semaine dernière sans rien mentionner à propos du noyau asp.net. tandis que d'un autre côté vous voyez un support continu pour azure dans asp.net core. Croyez-moi si nous n'augmentons pas une demande pour ssrs, il sera ignoré comme dans le mvc 5 précédent.

vos conseils sur l'utilisation des formulaires Web sont un exemple pour ralentir l'adoption d'une initiative de base. Du moins si j'avais une déclaration sur le fait qu'elle sera soutenue ou non, je serai en mesure de prendre des décisions stratégiques à ce sujet.

merci pour le conseil chatiste. Je vais vérifier et j'espère que vous avez compris mon point de vue.

@ ddddddddeee22211 Ahhh ... alors je ne peux pas répondre.

À l'heure actuelle, la seule façon de faire fonctionner les composants SSRS sur ASP.NET est sur WebForms.

Si vous voulez leur position stratégique ou s'ils la soutiendront, nous devrons attendre qu'un employé de la SP vous réponde.

Peut-être pouvons-nous / cc @coolcsh ? Il pourrait ne pas répondre ici, mais un article de blog clarifiant la position serait bien.

Dans l'équipe SSRS, nous sommes conscients des limites des WebForms ASP.NET et nous étudions et travaillons activement sur de nouvelles options pour le contrôle Report Viewer
Merci

@jtarquino

Merci pour l'homme de réponse!

Nous voulions une alternative depuis MVC. : stuck_out_tongue_winking_eye:

Cela a juste fait ma journée. [~ fin heureuse ~]
Merci @jtarquino , @MaximRouiller pour tous les efforts.

@jtarquino
Cela sonne bien :-)

Pouvez-vous dire quoi que ce soit à propos de la sortie de la première version de la "nouvelle option" pour Report Viewer Control?
(Existe-t-il une feuille de route / un plan pour cela?)

Br.
Boe

Malheureusement, je n'ai pas de calendrier à partager pour le moment

avez-vous essayé d'utiliser une bibliothèque en installant un package sur la console du gestionnaire de package et en tapant la commande suivante dans la fenêtre de commande.

PM> Install-Package ReportViewerForMvc
même si j'ai essayé des formulaires Web et ils ont l'air plutôt bien.

untitled

@bethwellagat
à nouveau une erreur de feu " la dépendance ReportViewerForMvc ne prend pas en charge le framework .NetCoreapp "
Remarques:
travailler sur le projet ASP.NET Core

@jtarquino envoie un ping à ce sujet. On dirait qu'il y a plus d'intérêt: https://github.com/aspnet/Mvc/issues/5332

@jtarquino BTW si vous souhaitez entamer des discussions avec mon équipe, veuillez m'envoyer un e-mail et nous pourrons discuter.

Ohhh moi comme! La balle roule! 😀

Salut tout le monde, je viens de terminer l'écriture d'un port personnalisé du contrôle de la visionneuse de rapports à l'aide de ReportExecutionService.asmx qui est intégré à SSRS et je ciblais ASP.NET MVC. Quelqu'un m'a suggéré de le porter sur .NetCore & MVC, donc j'ai terminé cela. Essayez-le et dites-moi ce que vous en pensez: https://github.com/alanjuden/MvcReportViewer

Alan

Il semble que cela fait environ trois mois que ReportViewer dans ASP Netcore MVC a été discuté ici. Je travaille avec la version fournie par Alan Juden dans un projet que je passe de WinForms à netcore. Existe-t-il des signes que Microsoft intensifie ses efforts pour fournir une prise en charge de SSRS ReportViewer de première classe ou ont-ils mis SSRS dans le même placard qu'ils ont mis Visual FoxPro il y a quelques années?

Des progrès MS? La meilleure option pour le moment est d'utiliser un outil tiers tel que Telerik Reports pour le rendu du navigateur et le backend SSRS pour les abonnements aux rapports. Peut-être que comme l'a écrit ddddddddeee22211, SSRS 2016 a déjà une capacité via le moteur de rendu HTML5 mais aucune documentation n'existe?

Salut @Eilon.

Des nouvelles depuis septembre? D'autant plus que vous avez lancé la version 1.0 (félicitations!), La pression doit baisser un peu.

Quelque chose que vous pouvez partager?

/ cc @jtarquino

Rien que je puisse encore partager, dès que j'aurai des nouvelles pour .NET core, vous serez le premier à savoir.
Comme vous l'avez mentionné, nous venons de publier le dernier nuget pour le contrôle ASP.NET Webforms et Winforms

Je voudrais également ajouter mon message à l'équipe ... C'est un problème majeur. J'apprécie la solution d'AlanJuden, mais nous avons besoin d'une solution "officielle" ... Etant donné que le noyau 1 est sorti depuis des mois maintenant, il serait utile d'avoir un mot sur le statut de cela. Si vous pouviez nous donner un mot sur l'échéancier d'une solution, ce serait quelque chose. Ce problème est suffisamment important pour nous empêcher d'utiliser mvc core. Une note. Nous avons vraiment besoin d'une solution qui contourne la nécessité pour les utilisateurs de se connecter au serveur ssrs. C'est pourquoi mon projet doit utiliser le visualiseur de rapports actuel (en utilisant reportviewer, le projet mvc fournit une connexion standard au serveur ssrs pour tous les utilisateurs)

Sql Server 2017 est la communauté preview2 maintenant
Et
La version 2.0 standard .net est proche avec la dernière annonce
Et toujours pas de mot sur la visionneuse native du service de reporting asp.net
Veuillez inviter d'autres développeurs à ce numéro à faire part de leurs commentaires et à sensibiliser l'équipe à la nécessité d'un tel effort pour un cadre de chef-d'œuvre dont chaque développeur rêve.

@jtarquino : existe-t-il un forum ou un service utilisateur pour SSRS?
comment les utilisateurs peuvent-ils contacter l'équipe SSRS?

Merci, j'aimerais vraiment avoir de l'aide pour que ma nouvelle application fonctionne avec SSRS.
Existe-t-il un moyen d'obtenir le code utilisé par le contrôle des formulaires Web pour une page aspx à déchirer?
J'aimerais voir si je peux créer une vue angulaire 2 qui «fonctionne comme» et «ressemble» au contrôle des formulaires Web.

Salut,

Nous cherchons à migrer certains de nos sites Web, etc. vers le noyau asp.net, mais certains incluent un contrôle de visionneuse de rapports SSRS. Y a-t-il des progrès sur un contrôle de visionneuse de rapports pour .net core?

Merci
Tim

si vous ciblez Full .NET 4.x et non .NET Core, veuillez prendre en compte ce # 2022 avant de passer à ASP.NET Core.
ASP.NET Core 2 ne prend pas en charge Full .NET 4.x

@ikourfaln. Plutôt un point discutable à ce stade, car il n'y a pas de visionneuse de rapport dans le noyau asp.net à casser. Avec les changements à venir dans Q3 dans asp.net core 2 ainsi que .net standard 2 avec les shims de compatibilité qui permettent de cibler le framework .net, je pense qu'il est très peu probable que Microsoft écrira un reportviewer pour le core asp.net actuel 1.1.

actuellement, j'ai essayé d'entrer dans les extensions d'authentification pour SSRS et j'ai trouvé que c'était un vrai gâchis d'essayer de changer, vous pouvez mettre une nouvelle authentification / connexion, mais lorsque vous essayez d'activer CORS afin qu'une application Web puisse appeler SSRS pour exécuter un rapport, le navigateur ne peut pas faire fonctionner une demande de contrôle en amont OPTIONS et cela met fin à toute cette idée.

Alors maintenant, je crée une application Web de formulaires Web à laquelle j'ajoute la prise en charge d'OpenId Connect afin de pouvoir faire fonctionner SSO entre ma nouvelle application angulaire brillante et mes rapports

alors je verrai si je peux un peu comment les réunir avec le piratage iframes ou d'autres moyens.

souhaite que Microsoft mette à jour ssrs pour mieux jouer avec la nouvelle technologie Web.

une autre ligne de pensée: SSRS KPI et rapports mobiles: existe-t-il un moyen de les utiliser dans une application Web ??

@alanjuden Avez-vous une chance de configurer votre package pour activer le rendu des rapports rdlc? Installer Reporting Server et le gérer pour chaque client est une vraie douleur.

@IonRobu , je suis peut-être fou ... mais je ne suis pas fou! : P

La vraie raison pour laquelle je ne le ferai pas est que je n'ai fait que la visionneuse frontale de la visionneuse de rapports. Je compte entièrement sur SSRS pour rendre le rapport et me rendre les données du rapport via l'API SSRS. Il faut donc disposer du backend du serveur de rapports. Désolé, mais ce serait beaucoup plus de travail que je ne cherche à faire sur ce projet. J'ai créé mon MvcReportViewer comme une solution simple pour contourner les difficultés liées à l'introduction de la version ASP.NET WebForms du contrôle.

Report Server ou RDLC appelé "rapports clients"
Le serveur de rapports demande plus de travail à configurer et à gérer, oui c'est vrai.
mais il présente un certain nombre d'avantages:

les rapports sont rendus sur un serveur principal, ce qui réduit la charge de travail des serveurs Web frontaux.
les résultats d'un rapport peuvent être encaissés et cela peut alléger la charge de travail de votre serveur SQL de productions.
des rapports complexes peuvent être exécutés selon un calendrier et fonctionner à un moment où peu d'utilisateurs sont sur le système et
les demandes peuvent ensuite être servies à partir de cet instantané pré-compilé.
en utilisant également SSRS, les chaînes de connexion au serveur sql restent sur le serveur de rapports et n'ont pas besoin d'être gérées dans le fichier de configuration du serveur Web
le serveur SSRS devient également un point central sur lequel les auteurs de rapports peuvent publier et tous les utilisateurs peuvent obtenir les rapports du serveur.
SSRS peut configurer l'envoi automatique de rapports par e-mail aux utilisateurs, vous pouvez envoyer par e-mail un lien vers le serveur de rapports pour certains utilisateurs et un fichier pdf, Word ou Excel à d'autres.

également, si vous avez besoin de servir plus d'utilisateurs, vous devrez peut-être ajouter plus de serveurs Web avant d'avoir besoin de plus de serveurs de rapports, vous n'avez alors pas besoin de copier un grand nombre de fichiers rdlc sur tous les serveurs Web.

alors oui, si vous n'avez que quelques rapports et n'avez besoin d'aucun des avantages, vous pouvez utiliser rdlc.
mais pour un système plus grand qui devra fournir de nombreux rapports à de nombreux utilisateurs, le serveur SSRS présente de très bons avantages.
aussi que l'API SSRS est très puissante à utiliser, vous pouvez appeler l'API pour renvoyer un rapport pdf par exemple sans avoir besoin d'avoir des formulaires Web côté client ou des contrôles de visionneuse mvc.
l'API peut également gérer les rapports, les télécharger sur le serveur, définir les autorisations et répertorier les rapports.
au travail, j'utilise l'API pour permettre à notre application cliente de répertorier les rapports que l'utilisateur peut exécuter, de vérifier les paramètres dont le rapport a besoin, puis d'exécuter le rapport pour l'utilisateur.

alors jetez un coup d'œil aux avantages, pas seulement au niveau des frais d'administration.

@figuerres
Les rapports clients excellent dans un contexte différent de celui que vous avez décrit
De nombreux clients n'utilisent pas de serveur de rapports et n'ont pas de personnel qualifié pour administrer et gérer ses problèmes
De plus, lorsque vous expédiez un produit avec des rapports personnalisés (60+) pour chaque client, vous êtes confronté à une surcharge de déploiement d'application + de déploiement de rapports
De nombreux utilisateurs ne sont pas des techniciens capables de comprendre les rapports générés par le serveur et rendus selon la réponse sans les prévisualiser au préalable (la facture par exemple peut être vérifiée facilement via le visualiseur que de télécharger plusieurs factures corrigées dans différents onglets)

Comme vous pouvez le voir, il est facile pour l'utilisateur de s'adapter à une simple visionneuse de rapports plutôt qu'à des scénarios complexes
Également développé, a passé d'innombrables efforts pour développer des rapports clients et maintenant ils sont rendus inutiles dans leur véritable utilisation

J'espère que l'équipe Microsoft comprend notre douleur

Je ne suis pas tout à fait sûr de comprendre tout ce que vous avez dit, mais oui, les rapports des clients sont utiles, je décrivais simplement les raisons du serveur, pourquoi cela pourrait valoir la peine d'être examiné. Votre kilométrage peut varier et tout ça.

aujourd'hui, net standards 2 est disponible avec plus de surface API pour le système.
cela pourrait-il être une chance pour un mot de l'équipe srss à propos de la visionneuse ssrs pour asp.net core?

Mon entreprise s'appuie fortement sur les rapports RDLC pour exporter des documents au format PDF. Ne pas pouvoir faire cela dans .net core est fondamentalement un bloqueur pour nous utilisant .net core et fonctionnant sur d'autres plates-formes comme docker.

j'espère que chaque codeur encouragera ses collègues à commenter ce problème ici

Pour ceux qui recherchent encore une solution:
Si Java est installé, vous pouvez également intégrer Eclipse BIRT ou JasperReports.
Des deux, JasperReports est certainement la meilleure alternative SSRS (un peu plus compliquée, mais aussi beaucoup plus puissante / pixel-parfaite).
Il dispose d'un serveur de rapports autonome et intégrable, capable d'accéder à n'importe quelle source de données JDBC, ainsi qu'à des BigData comme Cassandra ou Apache Spark (SparkSQL).

Il fournit des rapports et des analyses qui peuvent être intégrés dans une application Web ou mobile et fonctionner comme un centre d'informations central pour l'entreprise en fournissant des informations essentielles à la mission en temps réel ou sur une base planifiée au navigateur, à l'appareil mobile ou à la boîte de réception des e-mails. dans une variété de formats de fichiers.

Vous pouvez effectuer un déploiement autonome du runtime Java en fournissant BIRT / Jasper via Launch4j.

@jtarquino une bonne nouvelle pour .Net Core?

Je ne peux pas croire que ce soit encore un problème quelque 15 mois après qu'il ait été soulevé. Très déçu.

Nous avons vraiment besoin de cela pour fonctionner, même un simple point sur SSRS, ReportName et Params, ouvert dans DIV ou quelque chose. Nous avons investi beaucoup de temps dans la création directe de rapports SSRS sur SQL et j'ai besoin d'un moyen de les afficher dans une simple application Core2.0 MVC.

Des conseils?

@cgountanis , cela fonctionne pour moi:
https://github.com/aspnet/Home/issues/1528#issuecomment -259169426

@cgountanis
avez-vous besoin d'un pdf du rapport ou de rapports interactifs complets comme le montre le portail Web ??

je peux vous donner quelques entrées sur la façon dont je les fais à partir d'une application angulaire

C'est ce que je fais. Utilise les informations d'identification du client qui peuvent ne pas fonctionner pour la plupart.
Redimensionner la page plus grande fonctionne, mais pas la réduire.


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

une chose est d'utiliser les services Web du serveur de rapports, à partir desquels vous pouvez obtenir des listes de rapports, de dossiers et de sources de données, etc. et d'utiliser ces données pour créer votre propre portail / menus de rapport et gérer les rapports que les utilisateurs peuvent voir dans votre appli.
nous avons créé un ensemble d'utilisateurs Windows sur le serveur de rapports et les avons utilisés pour limiter les rapports qu'ils reçoivent,
a mappé le rôle des utilisateurs d'application sur un utilisateur du serveur de rapports.

lorsque nous exécutons un rapport, nous passons l'utilisateur du serveur de rapports en tant qu'utilisateur qui exécute le rapport, un peu nul car cela signifie que nous perdons le "vrai utilisateur" à moins que nous ne le connections dans notre code.
mais cela traite de la dépendance du serveur de rapports à l'égard des comptes d'utilisateurs Windows. s'ils le mettaient à jour pour utiliser un jeton jwt et obtenir des rôles à partir du jeton, ce serait mieux pour nous.

nous utilisons un iframe pour placer le contrôle des formulaires Web dans une vue d'application angulaire, ce n'est pas non plus le meilleur, mais cela fonctionne.
l'utilisateur ne peut pas vraiment voir les hacks derrière la scène que nous faisons.

@ ctrl-brk J'ai ce problème avec Core 2.0, j'ai peut-être manqué quelque chose. https://github.com/alanjuden/MvcReportViewer/issues/43

@steelwil Merci mais j'ai besoin de NetworkCredential personnalisé.

@figuerres Nous

Merci a tous!

Finalement, ils publieront un NUGET officiel pour ce droit?

@cgountanis Le «ils» est l'équipe SQL Server, pas l'équipe ASP.NET Core. C'est là que réside le problème. C'est une équipe différente.

@giddev la vraie question ici est de savoir si cette autre équipe à laquelle vous faites référence existe toujours chez Microsoft et a des développeurs actifs qui travaillent toujours dans l'équipe et s'ils sont suffisamment fiers de leur travail pour produire et publier une solution de première classe pour intégrer SSRS rapports dans une application Web ASP.Net Core 1 ou 2. Ont-ils une feuille de route publiée? ASP.Net Core fait-il partie du plan ou SSRS a-t-il été abandonné et remplacé par les éléments POWER BI? Je commence à voir des signes que SSRS se dirige vers le même trou de rat dans lequel Microsoft Visual FoxPro est tombé.

@wqwalter quelque chose comme ça .....
J'ai l'impression que Microsoft a beaucoup d'équipes qui suivent chacune leur propre carte et peu de gens s'assurent qu'ils ont un ensemble commun de livrables et de communication entre eux.
c'est comme garder les chats, ils décollent tous dans des directions différentes ...

si cela est faux - eh bien, il semble que ce soit le cas.

J'ai du mal à croire qu'ils abandonneraient SSRS car il est largement utilisé par les développeurs maintenant que Crystal Reports est impopulaire.

@cgountanis
bien que j'aime certaines choses de Microsoft, j'ai vu une histoire de 20 ans d'entre eux, arrêtant à plusieurs reprises des produits et faisant des choses qui défient ma compréhension. Un exemple était Virtual PC, acquis par Microsoft, vendu par Microsoft pendant un certain temps, puis ils l'ont rendu gratuit, puis ils l'ont tué.
ce n'est qu'un des nombreux cas comme celui-là ...

J'ai entendu parler de Power BI et des rumeurs selon lesquelles il pourrait s'agir du nouveau SSRS à temps.
je ne sais pas si c'est sûr ou juste des potins. il suivrait le modèle de pousser les services basés sur Azure.

J'adore voir SSRS prendre en charge l'authentification Web - OpenID Connect de préférence - prête à l'emploi. Un pas de plus - ce serait génial si SSRS était un nuget pour ASP.NET Core. Planification des rapports et administration des utilisateurs - peut-être fournir un exemple de projet, mais je serais bien de développer cette partie en fonction de la documentation sur l'API SSRS.

@Morgma
D'accord!
L'OIDC conviendrait parfaitement à ce que je fais.
les rôles doivent être définis afin que nous puissions fournir un mappage des rôles de serveur de rapports à nos rôles d'application.

en ce moment, j'ai une application qui utilise OIDC avec un frontal Angular 4/5 qui doit charger une page de rapport de formulaires Web dans un iFrame et doit utiliser des comptes d'utilisateurs Windows pour contrôler les autorisations, donc si j'interroge la base de données du serveur de rapports, je peux ne voyez pas réellement quels utilisateurs exécutent les rapports. c'est une kluge que l'on peut utiliser mais loin d'être idéale.

C'est également un problème majeur pour nous et je ne peux vraiment pas croire que nous n'ayons encore rien entendu de Microsoft à ce sujet. Cela nous amène sérieusement à envisager des options non-Microsoft à ce stade. Si nous avions au moins un calendrier, nous pourrions prendre une décision éclairée.

Je suis d'accord, j'ai choisi d'utiliser directement ReportServer / ReportExecution2005.asmx juste pour que l'exportation fonctionne directement. Fonctionne très bien alors lorsqu'il est hébergé sous IIS et reçoit des erreurs étranges.

Cela a été frustrant.

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

cette erreur indique que l'en-tête d'autorisation est manquant, la requête http doit inclure l'en-tête. Nust the one call est un problème?

Fonctionne bien jusqu'à ce qu'il soit hébergé sous IIS. Même ma machine de développement parle au même serveur de rapports et cela fonctionne, mais une fois publié et hébergé avec IIs, vous obtenez cette erreur. Pensez à ce qu'il dit, c'est que le serveur répond avec une sorte d'erreur vide mais je l'envoie tout.

N'oubliez pas qu'IIS Express s'exécute sous vos informations d'identification utilisateur, donc le double saut est probablement correct. Ce qui se passe probablement, c'est que vous n'avez pas configuré de Kerberos sur votre serveur IIS et même si vous avez activé la délégation, votre rapport ne fonctionnera pas car le rapport s'exécute de manière anonyme.

Réponse courte: vous ne pouvez pas utiliser la délégation sans la configuration de Kerberos, qui nécessite des paramètres sur votre contrôleur de domaine pour le compte sous lequel le pool d'applications IIS s'exécute.

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

Je sais que ce n'est pas le bon endroit mais je voulais faire un suivi. En hébergeant Core sur IIS, peu importe sur quoi vous définissez les paramètres IIS. Juste pour S&G, j'ai créé l'administrateur des utilisateurs appPool et cela a fonctionné. Allez comprendre ... Ceci est sans paramètres d'authentification IIS activés autres que Anonyme. Quelqu'un explique-t-il cela? At-il besoin d'accéder à une bibliothèque pour WCF sur Core pour laquelle il a besoin d'un accès spécial? Ce qui donne? Je suis confus ... et inquiet pour la sécurité.

@cgountanis pouvez-vous ouvrir un nouveau numéro avec votre question?

@jtarquino Avez-vous des mises à jour pour la chronologie de la sortie d'un visualiseur de rapports basé sur .net? Je veux désespérément avoir au moins une chronologie. Parlons-nous de 6 mois? 12 mois? Nous sommes fondamentalement confrontés à la décision d'abandonner tous nos rapports SSRS actuels et d'opter pour une autre solution, car nous n'avons aucune alternative et aucun calendrier sur la disponibilité.

@ExcaliburVT c'est dans notre backlog mais je n'ai pas de chronologie que je puisse fournir pour le moment.

L' open source

c'est le seul domaine où la migration de Microsoft n'est pas si grande. si, en tant que clients, nous ne pouvons pas obtenir les bonnes réponses, combien de temps allons-nous continuer à revenir?

ce même genre de chose se produit dans plusieurs produits, pas seulement celui-ci. Pourquoi devrais-je conseiller à mes responsables d'acquérir une licence pour la prochaine version de SQL Server et SSRS si nous ne pouvons pas obtenir les mises à jour dont nous avons besoin pour gérer l'entreprise?

@jtarquino Je suis d'accord avec @figuerres car je viens littéralement de

L'utilisation du nouveau service de connecteur WCF VS2017 (Core 2) vous permet d'exporter les rapports avec des paramètres au format PDF, Word, Excel, CSV ... assez facile si vous voulez de l'aide avant que ce package de visionneuse NUGET ne soit publié. Oui, vous devez utiliser le ReportExecution2005.asmx fourni avec SSRS, mais tout ce qu'ils créent aussi. Nous avons juste décidé de vider l'aspect de la visionneuse pour le moment et de faire des téléchargements de fichiers directs.

Edit: Le seul problème concerne les autorisations AppPool que j'ai mentionnées plus tôt.

en passant, je reçois des rapports au format pdf à partir d'une API Web et je n'utilise aucun bit wcf.
juste des appels soap / asmx et des appels http.
en les faisant, je passe des crédits sans aucun problème.
mon code est asp.net 4.6 / web api 2
si vous voulez voir ce que je fais, je peux mettre du code sur un github la semaine prochaine pour que vous puissiez le vérifier.
J'appelle le serveur de rapports 2016 mais la plupart de ce que je fais fonctionnera avec les anciennes versions ssrs.

Quelque chose de nouveau pour Core 2 avec SSRS (RDLC Designer)?

@figuerres si vous avez mis du code dans la requête github, veuillez partager le lien.

@apondu
publiera la semaine prochaine, pas en fonction jusque-là. personne n'a demandé de code jusqu'à présent.

Je travaille sur une application intranet Angular5 / .NetCore2 MVC5 (pile RC actuelle de MS), nous utilisons SSRS 2012 et nous devons créer des abonnements aux rapports basés sur le temps pour les utilisateurs qui ne sont pas le compte Windows connecté.

@figuerres Peut-être avez-vous des idées?

Vous pouvez utiliser SSRS et le service d'exécution de rapports intégré pour cracher des PDF toute la journée.

@cgountanis Merci pour une réponse aussi rapide, vous m'avez aidé à réaliser que je n'étais pas assez descriptif / précis lorsque je décrivais ce que je devais faire. J'ai mis à jour mon commentaire d'origine pour dire "créer des abonnements aux rapports basés sur le temps"

Hmm pense que j'ai fait quelque chose comme ça en insérant des lignes de planification d'abonnement directement dans la base de données du rapport (j'ai deviné comment le service d'abonnement fonctionnait en fonction de la table et des lignes existantes).

@ExcaliburVT J'ai utilisé l'API SOAP et un grand SP pour interagir avec la base de données jusqu'à présent et j'aimerais éviter de modifier la base de données directement. Je suis heureux de savoir qu'il existe une option de secours.

qu'entendez-vous par basé sur le temps?

avez-vous besoin d'exécuter un rapport à un moment donné?
avez-vous besoin d'exécuter un rapport lorsqu'un utilisateur fait quelque chose?

@figuerres basé sur l'heure, c'est-à-dire sur un horaire récurrent tel que tous les mercredis à 8h.

Oui, je n'ai pas été en mesure de trouver un moyen de le faire sans insérer un enregistrement manuellement au moins retour à SQL 2012. Si je me souviens bien, vous n'avez pas à modifier le schéma ou quoi que ce soit, insérez simplement une ligne dans le tableau des abonnements et j'ai pu pour envoyer un rapport à un groupe de distribution de cette façon.

ok alors le portail du serveur de rapports peut exécuter un rapport sur un calendrier planifié, il peut l'enregistrer dans un fichier ou envoyer un e-mail lorsque cela se produit.
vous n'avez pas besoin de connecter quelqu'un lors de son exécution.

vous créez simplement l'abonnement à partir du portail.

vous pouvez également le faire à partir de l'API de savon, mais je ne suis pas sûr de l'ensemble exact d'appels d'API à effectuer.

Permettez-moi de donner plus de contexte avant de parler de ce que j'ai vu du soapAPI.

J'écris une webapp qui utilise le SSRS soapAPI et des informations d'identification comme "ssrsReportWebAdmin". En cours de développement, "ssrsReportWebAdmin" a tous les rôles de sécurité, mais d'après la documentation, il semble que le rôle de gestionnaire de contenu soit celui qui est nécessaire. Un utilisateur utilisera l'application Web pour créer des abonnements pour d'autres personnes et soumettre ces demandes via soapAPI.

L'appel CreateSubscriptionAsync renvoie une erreur indiquant que l'utilisateur ne dispose pas des autorisations.

donc en appelant l'API vous passez un objet cred pour l'utilisateur "ssrsReportWebAdmin" qui a tous les rôles mais vous obtenez une erreur qu'il n'a pas l'autorisation ?? intéressant....

d'après ce que j'ai lu, SSRS est configuré de sorte que la seule personne qui peut créer des abonnements standard (récurrents, basés sur le temps) est l'utilisateur lui-même. Les abonnements basés sur les données peuvent être configurés par le rôle Content Manager.

Voir ContentManagerTasks - Gérer tous les abonnements
https://technet.microsoft.com/en-us/library/ms159693 (v = sql.105) .aspx

Voir la première phrase sous l'en-tête commence "Reporting Services prend en charge deux types de ..."
https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/subscriptions-and-delivery-reporting-services#bkmk_standard_and_datadriven

@figuerres @ExcaliburVT
J'ai pu créer des abonnements standard à la fois aux e-mails et aux partages de fichiers à l'aide d'un compte AD avec le rôle Content Manager SSRS. D'après ce que je peux voir, le problème d'autorisations que je rencontrais vendredi était un effet secondaire d'un paramètre MatchData vide / mal formé.

Presque 2 ans. Le Core 2.0 est publié. Équipe SSRS, réveillez-vous.

@ codehippie1 ne

C'était simplement une blague dans la caverne des développeurs. Aucune infraction ne signifiait quoi que ce soit. Blagues à part, ReportViewerForMVC compte 72799 téléchargements depuis le début de 2014 (https://www.nuget.org/packages/ReportViewerForMvc). L'équipe SSRS a ignoré ASP.NET MVC pendant de nombreuses années et ignore maintenant ASP.NET Core depuis 2 ans. Parler d'être impoli, 72 799 fois, c'est beaucoup.

Je me contenterais d'une belle exportation vers une bibliothèque PDF officiellement prise en charge, pas besoin de la visionneuse de nos jours avec des exigences réactives telles qu'elles sont.

@cgountanis : Générez un modèle HTML (taille de papier correcte - html uniquement, images en base64, styles en ligne). Remplissez les espaces réservés et n'oubliez pas de définir le codage HTML sur utf8. Envoyez le texte à StandardInput de wkhtmltopdf - récupère la sortie de StandardOutput de wkhtmltopdf. Et puis, vous avez quelque chose de bien meilleur que SSRS.

@cgountanis J'ai envisagé une telle approche, mais générer un rapport pixel parfait avec des en-têtes / pieds de page et des sauts de ligne à des endroits logiques n'est pas facile.

Pour tous ceux qui partagent ma douleur de ne pas avoir de visionneuse de rapports locaux MS RDLC sur aspnet core; J'ai essayé une approche alternative avec l'aide de pdfJs et ViewerJs de mozilla - démo pdfJs avec la visionneuse de rapport MS RDLC pour cracher le rapport sous forme d'octets. Pour moi, c'est le meilleur des deux mondes, car je pourrais toujours utiliser des fichiers RDLC, les utiliser pour générer des rapports côté serveur et avoir le puissant visualiseur de documents intégré à Firefox pour afficher la sortie. PdfJs n'est toujours pas une visionneuse de rapports, mais pour mon cas avec la navigation dans les pages, l'aperçu avant impression, la recherche et un tas d'autres fonctionnalités utiles, ce n'est pas moins non plus.

Si vous êtes intéressé, voici un résumé pour vous aider à l'utiliser dans l'application principale aspnet (avec le côté client en angular 2 ou supérieur, rxJs et Typescript). Pour moi, c'est tout simplement le meilleur des deux mondes.

Comment ajouter pdf.js et viewer.html à l'application angular 2. (Avec la génération de rapports backend aspnet core / webapi / mvc en option à l'aide de la visionneuse de rapports MS Local RDLC)

Je crois que vous pouvez très bien changer angular 2 avec react ou toute autre bibliothèque côté client, mais les principes restent les mêmes.

Fonctionne-t-il directement avec SSRS?

@cgountanis le post précédent est RDLC ce qui signifie qu'il n'y a pas de serveur de rapports, le serveur Web rend le rapport.

Une mise à jour intéressante de Microsoft ...

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

Nous sommes heureux d'annoncer que nous avons acquis la technologie de Forerunner Software https://forerunnersw.com/ pour accélérer nos investissements dans Reporting Services. Cette technologie comprend, entre autres, le rendu côté client des rapports Reporting Services (* .rdl), des widgets d'interface utilisateur réactifs pour afficher les rapports et un SDK JavaScript pour intégrer des rapports dans d'autres applications - un témoignage de ce que nos partenaires peuvent réaliser en s'appuyant sur notre plateforme ouverte.

C'est une excellente nouvelle pour vous, car nous voyons des opportunités d'appliquer cette technologie à plusieurs points de commentaires que nous avons entendus de votre part:

  • Vous recherchez un logiciel en tant que service (SaaS) ou une plateforme en tant que service (PaaS) dans le cloud qui peut exécuter des rapports SSRS. Comme vous l'avez peut-être vu dans nos notes de publication Spring '18 https://aka.ms/businessappsreleasenotes , nous travaillons activement à apporter des rapports SSRS au service cloud Power BI, et nous nous appuyons sur le rendu côté client pour rendre cela possible.
  • Vous souhaitez afficher les rapports SSRS sur votre téléphone, peut-être à l'aide de l'application Power BI. Nous pensons que cette technologie nous aidera à fournir une interface utilisateur meilleure et plus réactive pour fournir des valeurs de paramètres de rapport, naviguer dans les rapports et peut-être même afficher le contenu des rapports.
  • Vous aimez le contrôle Report Viewer… mais c'est un contrôle ASP.NET Web Forms. Vous avez besoin de quelque chose que vous pouvez intégrer à votre application ASP.NET Core / MVC ou à une application non -ASP.NET. Avec cette technologie, nous espérons fournir une visionneuse de rapports côté client / JavaScript que vous pouvez intégrer dans n'importe quelle application moderne.

Ce sont de grandes entreprises et nous n'avons pas encore de délais à partager, mais restez à l'écoute au cours des prochains mois, car nous nous efforçons toujours de partager nos progrès avec vous et d'entendre vos commentaires le plus tôt et le plus souvent possible.

Cordialement

Paul


De: Denny Figuerres [[email protected]]
Envoyé: vendredi 23 mars 2018 02:19
À: aspnet / Accueil
Cc: Paul Sheldon; Commentaire
Objet: Re: [aspnet / Home] Asp.Net Core Reporting (SSRS) (# 1528)

@cgountanis https://github.com/cgountanis la publication précédente est RDLC ce qui signifie qu'il n'y a pas de serveur de rapports, le serveur Web rend le rapport.

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, affichez-le sur GitHub https://github.com/aspnet/Home/issues/1528#issuecomment-375408680 , ou désactivez le fil https://github.com/notifications/unsubscribe-auth/AEHciZa6- jjUl8kgdHtuCdH6lSwhoCyyks5tg-s6gaJpZM4IsW_Z .

Oh mon dieu, pas encore cette merde jQuery.
Bloatware.
Et pas seulement bloatware, mais aussi slowwwwwww ...

Si vous avez besoin d'une définition de bloatware, ce serait une bonne.
Pour la perfection, il ne manque essentiellement que l'interface utilisateur jQuery, mais je suis sûr que les personnes qui font des choses comme celles-là trouveront toujours le temps de l'ajouter pour le sélecteur de date.

Oh attend, je viens de voir

jquery-ui-1.10.3.forerunner.js

Mon mauvais, tant pis.
C'est définitivement un exemple parfait.
Bien sûr, nous ne nous contentons pas d'ajouter jQuery-UI, nous proposons également notre propre version modifiée.

Dieu, ça ressemble à de la merde. Rapports sur le téléphone - exactement ce dont nous avons besoin - juste après les iPad et les écrans tactiles CrApple sur le bureau ...
Et je me contenterais toujours pour SSRS de travailler avec un serveur proxy, ou pour pouvoir faire un partage de cookies d'authentification (hébergement basé sur un nom virtuel multi-locataire - inclusion d'iframe multi-répertoires virtuels à un seul domaine sans écraser le cookie d'authentification d'un autre répertoire virtuel). Ou si cela (dans SSRS 2016+) rendrait les bordures de table de manière égale sur IE et Chrome, et éventuellement Firefox.
Ou simplement pour pouvoir définir la culture manuellement via une chaîne de requête, faire traduire les titres des paramètres et faire simplement ce sélecteur de date moi-même, car MS ne le fera pas de toute façon ...

C'est LA définition du 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>

Que diriez-vous:

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

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

Des points bonus s'il ajoute un horodatage unix à chaque script et feuille de style, les modifications / corrections prennent donc effet. Points bonus étendus s'il transmet une valeur datetime comme horodatage unix au lieu d'une chaîne spécifique à la culture, et n'échoue pas pour une date> 2030 ou 9999. Ou sur des caractères UTF8. Maintenant, en ce qui concerne la prise en charge des langues de droite à gauche, nous ne voulons pas étendre la limite de Microsoft trop loin. Ils échouent bien avant cela. Ils dépasseraient déjà mes attentes si cela fonctionnait pour plus d'une langue européenne simultanément (par exemple l'anglais, l'allemand, le français et l'italien).

Cher Microsoft, je voudrais peut-être également tester si un rapport a tous les champs traduits, et pour cela, je voudrais simplement me connecter en tant qu'utilisateur différent avec une langue différente - sans avoir à modifier les paramètres de langue de mon navigateur à chaque fois (ou dire à un client comment faire cela - c'est votre ultime réalisation à ce jour - une expérience inoubliable [très négative] que je pourrais ajouter - surtout après le passage à Windows 8).
Si vous avez besoin de quelque chose auquel VOUS pouvez vous rapporter, il existe peut-être parfois un utilisateur anglais qui travaille sur un ordinateur configuré pour des utilisateurs non anglophones. Ce serait donc bien si, en tant que développeur, je pouvais définir la langue d'affichage à partir de mon application, et pas seulement la faire déterminer par les paramètres de langue de l'agent utilisateur. Peut-être que vous pourriez au moins en tenir compte CETTE fois.

Mais si je regarde la merde ci-dessus, je peux déjà dire que vous ne le ferez pas.

À propos, pour définir la culture dans l'incarnation actuelle de SSRS, vous devez effectuer les opérations suivantes:

appeler un rapport avec & in_language = IETF-language-tag

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

Ensuite, la langue doit être écrasée dans la requête http, (module HTTP personnalisé dans SSRS)
(et la politique P3P est pour cela qu'un formulaire-login-post fonctionne quand il est sur une iframe sur un domaine différent).

Pourriez-vous faire en sorte que vous ne rompiez pas cela sans offrir un paramètre de langue (DISPLAY)?
Votre paramètre rs:ParameterLanguage affecte uniquement les paramètres de l'URL, pas l'affichage du rapport. Et il ne devrait pas avoir à exister en premier lieu, par exemple si vous venez de passer datetime comme unix-timestamp (UTC). Et bien sûr, vous devriez toujours le même en-tête d'origine, ou en-tête allow-from (iframe est sur un domaine différent de celui du ReportServer). À propos, la définition de la langue de requête dans le module HTTP sert à définir le sélecteur de date avec SSRS 2016 sur la langue requise - sinon, le JavaScript échoue s'il a un sélecteur de date en-US. Génial, non?

Que diriez-vous: & rs: language = balise de langue IETF / IANA?


namespace libRequestLanguageChanger
{


    public class RequestLanguageChanger : System.Web.IHttpModule
    {


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


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


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

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


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

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

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

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

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

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

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


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

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

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

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

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


        } // End Sub context_BeginRequest 



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

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


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


    }


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

    } // End Using context_EndRequest


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


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


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

        return false;
    } // End Function Contains 


} // End Class RequestLanguageChanger 


} // End Namespcae libRequestLanguageChanger 

Microsoft S'IL VOUS PLAÎT, n'utilisez pas ce code avant-coureur tel quel!
Les applications Web modernes côté client passent de j query aux modules es et autres.
nous n'avons pas besoin ou ne voulons pas extraire un tas de code de requête j.
Je préfère donner au client un pdf ou le contrôle asp.net actuel plutôt que cette pile de requêtes j.

créer un package npm qui fonctionne bien avec Angular 2-6 et node et d'autres frameworks de client Web.
continuez également à travailler avec le rendu SSRS, il présente de nombreux avantages. il suffit d'obtenir un ensemble d'API de service Web mis à jour

Une mise à jour pour ceci?

Eh bien, nous aurions déjà tout ce dont nous avons besoin.
Ce dont nous aurions besoin, c'est d'une implémentation d'une version REST / JSON de
http: //localhost/ReportServer/ReportExecution2005.asmx
(Cela ne ferait pas de mal si nous / quiconque pouvait personnaliser l'URL)
en tant que package nuget - qui fonctionne également sur Linux / Mac.
La seule chose à faire est de porter le code .NET vers .NET Core / NetStandard et de supprimer tous les pinvokes des DLL Windows. Ensuite, ajoutez la capacité de sortie du html PAGED via le service Web (qui manque actuellement - car il est dans le contrôle de rendu asp.net), bien sûr, et permettez de définir le nom du fichier de téléchargement.

La sélection des paramètres que nous pourrions même faire nous-mêmes - lire le RDL avec XmlDocument.
(certains problèmes avec l'option explicit off, l'option strict off, l'option infer avec VB-Code seront probables)
Un peu comme le contrôle ASP.NET actuel, juste sans tous les éléments ASP.NET-WebForms.

Donc, je ne pense pas qu'il y ait même une exigence pour une seule ligne de JavaScript - qui sera de toute façon différente d'un projet à l'autre, d'une entreprise à l'autre, d'une personne à l'autre.
Certains aiment jQuery. Certains aiment Angular. Certains aiment Vue. Certains aiment React. Certains aiment NodeJS avec NPM, certains aiment bower, certains comme TypeScript, certains comme Babel, certains flux, certains utilisent même jQuery-UI pour le sélecteur de date.

Je déteste par exemple largement tous ces frameworks (en particulier jquery-ui) avec la durée de vie d'une mouche des fruits, des incompabilités entre les versions, des ballonnements, une non-modularité et une courbe d'apprentissage de n'importe quoi, une communauté de gens qui ne savent pas ce font (note: je ne veux pas par la présente insinuer que je sais toujours ce que je fais), et un gestionnaire de paquets cassé comme npm / bower, qui a les caractéristiques désagréables de toujours trouver un moyen de créer de nouvelles joies à chaque fois que vous aurait voulu les utiliser.

Donc j'utilise juste VanillaJS (avec des modules ECMA et async - transpilés avec babel ou tapuscript - et qui se soucie du transpilateur.

Maintenant, bien sûr, beaucoup de gens seront en désaccord - et vous avez le droit de ne pas être d'accord, car il y a des raisons de ne pas être d'accord. En fin de compte, je me fiche de ce que vous utilisez - utilisez coffeescript et emacs avec jquery-ui et vue si vous le voulez absolument - ne me forcez pas dans cette voie. Je n'ai pas besoin / veux de jquery / angular / vue / react / bower / npm ou de tout ce gonflement et manque de fiabilité.

Maintenant, cela dit, si vous souhaitez fournir une bibliothèque JavaScript que n'importe qui peut mettre sur son site pour sélectionner les paramètres automatiquement, comme dans ReportServer (par opposition à RDLC), et contrairement au contrôle de reportviewer actuel, je suis tout à fait pour . Si vous faites cela, rendez-le indépendant du rapport "contrôle". Et utilisez une structure de type nœud pour composer des modules ECMA, de sorte que les personnes qui souhaitent utiliser node puissent l'utiliser avec node / npm, et celles qui ne le sont pas.

En tant que sidenode, si la version REST / JSON permettait de récupérer les données de filtre du service en tant que json, tout comme les fichiers rendus, nous n'aurions même pas besoin de lire le fichier RDL, et nous aurions un JS très UN compliqué bibliothèque. Le code VB qui est actuellement autorisé dans les paramètres ne permettrait de toute façon pas de le faire du côté client.

Ou encore, ce serait encore mieux si le service permettait de récupérer chaque ensemble de données du rapport au format JSON. Je suppose que nous devrions également être en mesure de lire les valeurs par défaut pour chaque paramètre. Ensuite, nous pourrions même faire des tests unitaires de l'exactitude des données SQL utilisées dans le rapport!
(les rapports de tests unitaires sont actuellement plutôt impossibles)

Une feuille de style supplémentaire pour le formatage terminerait alors le tour (SASS s'il vous plaît). Et un système de plugin pour des moteurs de rendu supplémentaires / alternatifs compléterait cela. ¨

Mais au fond, nous n'avons vraiment besoin que d'une bibliothèque de rendu de rapports multi-plateforme.
Tout le reste pouvait déjà être fait aujourd'hui par la communauté.
Je suppose que si les sources des contrôles existants étaient disponibles, la totalité ou la majeure partie du travail requis pourrait même être entièrement effectuée par la communauté - ne coûterait même pas un centime à Microsoft.

Is alanjuden MvcReportViewer fonctionne avec SSRS 2017 et core 2. Puis-je utiliser cette approche pour SSRS 2017 et core 2

Non, pas sans beaucoup de maux de tête. La solution la plus simple consiste à exporter des PDF directement à l'aide de reportexecution2005 directement, à mon humble avis. Essayer d'obtenir l'un des anciens téléspectateurs dans un format réactif, en particulier pour les téléphones et les tablettes, est une douleur.

@Mahenbisht , je dois le construire à partir des sources avec des packages mis à jour avec les dernières versions afin de le faire fonctionner dans le noyau 2. Je n'ai pas encore essayé 2017.

J'utilise SQL Server 2017 avec SSRS 2017 et core 2.
Si je ne peux pas utiliser alanjuden.MvcReportViewer.NetCore alors y a-t-il une autre approche

@Mahenbisht , je sais que je n'ai pas été très actif sur le mien depuis un moment ... cependant, vous pouvez toujours utiliser une approche similaire. Vous pouvez toujours vous connecter à l'API Reporting Service que j'utilise (qui est intégrée à SSRS) pour exécuter vos propres rapports et les mettre dans le format de votre choix.

@Mahenbisht : Il existe un package nuget .NET Core ici:
https://www.nuget.org/packages/AspNetCore.ReportViewer/
Malheureusement, il n'y a aucune source, vous ne pouvez donc pas voir ce qu'il fait et comment l'utiliser.
Alors je l'ai décompilé ici (il compile).

Il semble que ce soit les classes générées à partir de ReportExecution2005 & ReportService2010-WSDL pour .NET Core.
Rien ne vous empêche donc d'écrire votre propre visualiseur, si vous avez un accès réseau à une instance en cours d'exécution de SQL-server avec SSRS.
Si je me souviens bien, vous devez passer deviceinfo pour le rendu pour que vous obteniez une sortie html paginée.
Cela vous laisse faire les paramètres manuellement - ce sur quoi je travaille (théoriquement) actuellement.

@alanjuden : Le problème avec votre approche est qu'elle nécessite une instance de SQL-Server avec ReportingServices installé. Si vous avez cela, vous pouvez tout aussi bien mettre un iframe dans / ReportServer et ajouter une petite DLL d'authentification personnalisée + d'en-tête W3C et de localisation de langue aux services de rapport. Alors vous n'avez pas du tout besoin de votre travail.

Le problème avec cela est que
A) N clients n'ont pas toujours la même version de SSRS installée (avec toutes les mises à jour cumulatives / servicepacks - dans mon cas actuellement allant de SSRS-2008R1 à 2016),
et B) que les installations SSRS-Express n'ont accès qu'aux bases de données sur la machine locale. Et ce qui est vraiment nul, c'est qu'il n'y a pas de contrôle ReportViewer qui fonctionne sur les PC non Windows (Linux, Mac) - vous devez donc combiner .NET avec Java pour Birt ou Jasper - ce qui rompt le déploiement xcopy - sans parler d'un énorme surcharge dans les deux formats de rapport 2-3, et l'ensemble de la JVM java et le bloatware birt / jasper, y compris tomcat et / ou autre merde.
et C) que ReportingService utilise l'authentification Windows intégrée. Ainsi, même si vous utilisez Windows, vous devez ajouter une authentification personnalisée pour l'extérieur de l'intranet, ce qui signifie que vous devez avoir un accès en modification à ReportingServices, et vos modifications peuvent endommager d'autres logiciels, donc tout client sensé doit installer une nouvelle instance de SSRS / SQL-Server (qui coûte de l'argent).
également D) que les paramètres ReportingService ne sont pas localisables sans modifier ReportViewer.aspx, voir C)
et aussi E) que toute version de SSRS <2016 Renders quirks-html (et bien que 2016+ soit meilleur, il est loin d'être parfait à cet égard, btw)
Cependant, comme les anciennes versions de 2008 existent toujours en 2018, il faudra peut-être encore 5 à 10 ans pour que tout ce qui se trouve en dessous de 2016 s'éteigne. À ce moment-là, SSRS 2016 sera de toute façon désespérément obsolète. Si Microsoft est toujours là à ce moment-là, c'est.

Docker à la rescousse - heureusement. Mais c'est toujours de la merde.

et ajoutez une petite DLL d'authentification personnalisée + d'en-tête W3C et de localisation de langue aux services de rapport.

@ststeiger un échantillon en ligne pour mettre la visionneuse SSRS dans iframe avec la transmission d'autentification personnalisée à partir du site principal et des en-têtes W3C?

@adopilot : Voici un

Ajouter une authentification personnalisée à SSRS

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

(vous devrez le modifier un peu pour qu'il utilise UN utilisateur par base de données.
Vous ne voulez pas commencer à synchroniser les utilisateurs et les autorisations SSRS avec vos utilisateurs de formulaires!
Donnez à cet utilisateur des droits sur le dossier pour cette base de données uniquement.
)

Ajoutez un module http à SSRS , qui définit l'en-tête p3p, et remplacez context.Request.UserLanguages ​​[i] par la langue de votre choix (sinon, le sélecteur de date ne fonctionne pas)

Modifiez la page de connexion de ReportServer, pour réagir aux paramètres d'obtention et de publication, et définissez le login_cookie, puis redirigez vers le rapport qui a été publié.

Code dans Page Load dans la classe FormsAuthentication_RS2012.LogOn dans Assembly FormsAuthentication_RS2012

Publiez les données chiffrées PGP / RSA avec un horodatage unix (afin qu'elles ne puissent pas être rejouées) chiffrées avec la clé publique dans vos formulaires, décryptez les données postérieures dans FormsAuthentication_RS2012 sur page_load.

(impossible de vous donner le code FormsAuthentication_RS2012, car il contient la clé privée et le mot de passe administrateur codés en dur)


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

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

Ajoutez une fonctionnalité de traduction de paramètres à reportviewer.aspx:
(
Le paramètre a été écrit en allemand / français / italien / anglais
)
divisé sur / et par défaut en allemand (vous voudrez peut-être utiliser l'anglais)
ajoutez un paramètre in_language (in_sprache) au rapport-url, et vous avez un peu fini, si vous avez compris l'idée.


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>

Maintenant, pour l'utiliser sur une page Web, créez un iframe appelé ifrmSSRS_Login (ou ajustez-le à votre guise) et faites un post-formulaire en cliquant sur le lien:

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


var valueToPost = rsa(data, public_key)

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



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

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

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

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

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

de cette façon, vous pouvez relier l'authentification avec SSRS, plus les utilisateurs de chaque client (nom de base de données) ne voient que leurs rapports (autorisations sur ssrs par nom de base de données).

Notez que les uids doivent être passés en minuscules, car sinon SSRS refuse de fonctionner correctement / explose comme le logiciel merdique qu'il est.

Remarque:
Ce code s'est accumulé sur une plus longue période de temps, pour plusieurs versions de SSRS, et peut-être que le remplacement de la page-initialize-culture n'est plus nécessaire si le module http remplace la langue de l'agent utilisateur (que je n'ai compris qu'après avoir réalisé cette page de remplacement -initialize-culture n'est pas assez bon pour le sélecteur de date SSRS).
De plus, l'utilisation de la barre oblique comme séparateur pour la traduction était malheureuse. essayez d'utiliser un caractère dont vous n'avez jamais besoin, comme £ ou ¦.

L'en-tête P3P est nécessaire pour que IE 11 sur les ordinateurs non Windows 10 ne refuse pas le cookie d'authentification (puisque ssrs s'exécute dans un iframe inter-domaine, il est géré comme un cookie tiers par IE).

Utilisez également SSRS 2016+, car sinon, vous devez utiliser les fonctionnalités du mode original, telles que la largeur des bordures, les hauteurs, les marges, masquer la fonction d'impression et toutes sortes d'autres «trucs passionnants spécifiques à IE8», etc.

Comme le nom de l'assembly l'indique, cela a été fait pour notre serveur de production (SSRS 2012) et tout a évolué à partir de vilains hacks SSRS 2005.

Enregistrez les liens dans un champ de votre table de navigation, par exemple sous le champ NA_Link dans T_Navigation
'{@report} Budget_SNB & in_user = {@ user} & in_sprache = {@ language} & rc: Stylesheet = COR_RS2012_v7'
utilisez des espaces réservés pour le lien de base, l'utilisateur et la langue, et définissez la feuille de style (si vous avez un arrière-plan noir, vous devez dire à ssrs d'utiliser votre modification de leur feuille de style)

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

Et notez que le .NET-Framework a des problèmes s'il doit rediriger un lien avec un deux-points à l'intérieur.
Vous pouvez copier le code de travail pour la redirection d'url à partir du mono-projet.

Notez également que vous ne pouvez pas simplement passer l'ID utilisateur sous forme de chaîne / numéro - il doit être chiffré (privé / public) afin que personne ne puisse simplement deviner l'ID utilisateur. Mais pour commencer, le hachage md5 de l'ID utilisateur pourrait faire l'affaire.

@ststeiger @all
AspNetCore.ReportViewer a été remplacé par AspNetCore.Reporting
cela inclut LocalReport et ServerReport

@ amh1979 : Beau travail - je vais y jeter un œil.
Je suppose de sa dépendance AspNetCore.ReportingServices.dll nécessitant WindowsBase et pinvoke advapi32.dll / kernel32.dll / ReportingServicesService.exe que cela ne fonctionne que sur Windows avec .NET avec Framwork 4 installé?

PS: l'anglais correct est "AspNetCore.ReportViewer a été> remplacé par <AspNetCore.Reporting", pas "à la place", mais je comprends ce que vous voulez dire;)
Ou vous pouvez également dire "a été remplacé par", qui pourrait être le mot / la phrase que vous recherchez;)

@ amh1979 : Bien fait, j'ai dû faire du travail car je n'ai pas installé Framwork 4.7.1.
Je comprends, MainStream est result / html et SecondaryStream est CSS.
Mais il a été opérationnel.
Que le HTML soit paginé, c'est bien aussi.
Savez-vous: existe-t-il un moyen de parcourir tous les résultats ou d'obtenir un énorme fichier HTML sans appeler la fonction de rendu pour chaque page?

@ALL : Bien que cela fonctionne sous .net complet, je ne peux pas le faire fonctionner sous .NET Core sous Windows.
Problèmes avec System.Drawing.Color ToKnownColor, IsSystemColor et KnownColor non présent.
Correction de cela, mais maintenant il se plaint de ne pas pouvoir charger l'assembly System.Drawing.Graphics avec signature ...

Existe-t-il même un moyen d'exécuter des assemblys .net FULL complets dans un projet .NET Core sous Windows?

@ststeiger Je vais mettre à jour et

@ amh1979 :

Pendant que vous y êtes, si vous recherchez et remplacez System.Array.Empty<T> par ArrayExtension.Empty<T> , alors vous êtes à 90% du moyen de le faire fonctionner avec .NET 4.0.

    internal static class ArrayExtension
    {

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

    }

@ amh1979 :

Il utilise les éléments suivants

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

que System.Drawing.Common de .NET Core n'implémente pas.
Voici un remplacement de System.Drawing.KnownColor.cs
(ce n'est pas parfait en raison de l'ambiguïté, mais en l'absence d'accès aux valeurs internes de System.Drawing.Color. c'est le mieux que je puisse faire - peut-être utiliser #ifs pour que le framework .net complet appelle les propriétés réelles s'il est plein. cadre net ...)


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 


}

Je l'ai compilé sous NetStandard 2.0

COMMENT:
Prenez System.CoreFX.Forms et convertissez-le en NetStandard 2.0. Ajoutez ensuite System.Drawing.Common et System.Reflection.Emit.

Prenez AspNetCore.ReportingServices et ajoutez

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

Ajouter une référence à System.CoreFX.Forms (NetStandard)

Obtenez les fichiers suivants 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")

Et ajoutez une classe wrapper pour 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;
    }
}

Et autorisez le code non sécurisé dans le nouveau projet netstandard 2.0.

Maintenant, ajoutez AssemblyInfo.cs avec

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

Et maintenant, il compile sur NetStandard 2.0.

Salut @Toutes les nouvelles incroyables:

Je l'ai fonctionné avec .NET Core sur Windows!
100% NetStandard, 0% NetFramework

Html, Pdf, Excel, Excel2007 +, Word, Word2007 + et tiff ont tous bien fonctionné sur un rapport tabulaire de 57 pages avec varchars, ints, tinyint2, bits et colonnes calculées.
Tous les formats de sortie fonctionnent, sauf RDL, qui est assez drôle, mais qui s'en soucie.
Nous trouverons le problème éventuellement, n'est-ce pas?

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 

Et il y a d'autres bonnes nouvelles:
WindowsBase (aka WPF) a été utilisé uniquement pour System.IO.Packaging, qui est disponible dans .NET Core.
Maintenant, cela signifie que si nous pouvons nous débarrasser des pinvokes, il n'y a pas d'obstacles majeurs pour que cela fonctionne également sur Linux / Mac!

Maintenant, quelqu'un commence rapidement à écrire un éditeur RDL basé sur le Web!
Ensuite, nous pourrions également avoir des rapports «dynamiques» (générés par l'utilisateur).
PostgreSQL-ReportingServices pour Linux arrive;)
(ok, il y a une épée légale de Damoclès sur une telle chose, mais si nous pouvions simplement le publier depuis la Chine, qui a des droits de propriété intellectuelle "plus assouplis" ...) :)

OK, c'est peut-être trop mauvais.
Pensez plutôt à Microsoft ReportingServices pour Oracle / SAP!
Ou ReportingServices pour Cassandra / Spark: grin:

@ amh1979 :
N'y a-t-il pas de moteur de rendu PowerPoint?
L'avez-vous construit à partir de la dernière version de reportviewer? (SSRS 2017)
La dernière version que je connais sur nuget:
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
(140.1000.523, il y a 10 mois)
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WinForms
(140.1000.523)
https://www.nuget.org/packages/Microsoft.SqlServer.Types
(14.0.314.76)

Voici l'implémentation CoreFX WinForms pour NetStandard:
https://github.com/ststeiger/System.CoreFX.Forms

Attention à l'écart, depuis que j'ai ajouté un projet NetCore supplémentaire et que j'ai renommé System.CoreFX.Forms en System.NetStandard.Forms, il pourrait avoir des difficultés à charger les ressources intégrées, s'il le fait.

Les fichiers peuvent être trouvés ici:

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

@ amh1979 :
Ah, je vois, ce n'est pas dans Microsoft.ReportViewer.Common.dll.
Mais c'est dans le répertoire ReportServer:
Microsoft.ReportingServices.PowerPointRendering.dll
et pour CSV / XML / Atom:
Microsoft.ReportingServices.DataRendering.dll

C: \ Program Files \ Microsoft SQL Server Reporting Services \ SSRS \ ReportServer \ bin

@ALL : Mesdames, le moteur de rendu HTML fonctionne sous Linux sur .NET Core / NetStandard 2.0!
Et il en va de même pour WordOpenXML et le moteur de rendu ExcelOpenXML!
(non testé avec des images / graphiques - texte et code uniquement)

Le moteur de rendu PDF a des problèmes avec les pinvokes d'incorporation de polices.
(Le rendu Word / Excel-2003 utilise des pinvokes et ne fonctionne donc pas.)
Si vous utilisez la version eval Aspose Cells / Words, vous pouvez convertir le xlsx en xls et le docx en doc.
Vous pouvez également générer le PDF à partir du fichier Word:
soffice --headless --convert-to pdf filename.docx
(ou encore, avec aspose eval)
En y réfléchissant, le rendu PPTX devrait également être facile à faire, car il ne fait que prendre les photos du fichier TIFF et placer chaque image de page tiff au format jpg / png sur une diapositive pptx.
On dirait que le rendu d'image est la chose la plus difficile à faire.
Ou vous pouvez prendre wkhtmltoX et rendre chaque page HTML en image / pdf.
Ce serait probablement un peu lent, cependant.

Incroyable !

HTML for report

@ALL : Atom / CSV / XML fonctionnant. Il en va de même pour le rendu NULL.
Sur Linux aussi.

Le rendu PowerPoint fonctionne uniquement sous Windows - Pinvokes

Fait amusant: il semble y avoir un moteur de rendu JSON.
Mais pour une raison quelconque, cette merde ne fonctionne que dans un cas useSharedDataSetTableHandler, quoi que cela signifie

ParseDeviceInfo(deviceInfo);

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

Quelqu'un par hasard sait comment utiliser le rendu JSON?

@ amh1979 J'ai essayé d'utiliser le rapport du serveur mais il semble que les paramètres que j'ai ajoutés pour le rapport ne sont pas conservés sur le serveur dans LoadReport. Y a-t-il une chance que vous puissiez le définir pour que ceux-ci soient envoyés au serveur dans votre prochaine version?

Salut @ststeiger et @ amh1979 , Excellent travail à ce sujet, existe-t-il des tutoriels sur la façon d'utiliser cette bibliothèque? J'essaie de comprendre comment / s'il prend actuellement en charge les paramètres à valeurs multiples et si les explorations sont prises en charge.
Je continue d'essayer d'accéder au site lié dans la description du paquet nuget (http://www.amhx.org/) pour voir, mais cela n'arrête pas de me perdre.

@DavidHayesCoding :
Voici mon code de test pour AspNetCore.Reporting.LocalReport, qui est tout ce qui m'intéresse:
Remarque:
Les types de rendu Rpl, RGDI, Atom, Xml, Json, Csv, null, pptx
ne seront ne sont
(ils font partie de SSRS, mais ne sont pas présents dans le redistribuable ReportViewer)

Notez également que la source de données partagée (* .rds) doit être dans le même répertoire que le * .rdl, sinon vous obtiendrez une exception de référence nulle sur LocalReport.Execute.

Pour d'autres questions:
https://github.com/icsharpcode/ILSpy/releases/tag/v4.0-beta2
(Remarque: dans le code approprié, vous devez disposer de la table de données après avoir fini de l'utiliser)

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 : Quelqu'un veut aider?
Répond a cette question:
https://stackoverflow.com/questions/52093440/how-to-call-wine-dll-functions-from-c

Puis-je suggérer que publier des masses de code et de longueur de commentaires est un moyen vraiment difficile à digérer et à lire de suivre ce problème?

Je peux voir beaucoup d'activité, beaucoup de code, mais je ne suis vraiment pas plus avisé de ce que les développements récents (apparemment excellents) ont été.

Puis-je suggérer de garder les choses propres et bien rangées ici et d'utiliser un autre dépôt / outils appropriés pour partager du code? Y a-t-il une mise à jour de statut claire et simple qui pourrait être partagée ici?

comme @kierenj, je pense que les listes de codes en tant que post rendent difficile à suivre. mettre en place un github puis partager un lien. voir si les administrateurs de ce repo veulent faire des branches etc ...

@kierenj @figuerres : Cela me conviendrait, mais si vous publiez de plus grandes quantités de code Microsoft décompilé sans demander la permission au préalable, vous risquez probablement de franchir la ligne où ils pourraient vouloir faire quelque chose à ce sujet ...

iii. Restrictions de distribution. Vous ne pouvez pas
• distribuer du code distribuable pour qu'il s'exécute sur une plate-forme autre que la plate-forme Windows;
• le code soit divulgué ou distribué sous forme de code source; ou
• d'autres ont le droit de le modifier.

@ststeiger
et vous pouvez travailler avec le dépôt ici même pour créer une branche et mettre du code dans cette branche.
alors ils l'ont et le savent etc ...

@figuerres : J'ai fait le repo sur gitlab, où un dépôt privé est gratuit.

@MaximRouiller :
J'aurais une version de ReportViewer (rapports locaux) fonctionnant à peu près sous ASP.NET Core.
Environ 75% d'entre eux fonctionneraient même sous Linux, pour lequel Microsoft a publié SQL-Server.
Les parties qui fonctionnent sous Linux fonctionnent très probablement aussi sous MacOS.

Cependant, cette version de ReportViewer est basée sur le code de
https://www.nuget.org/packages/AspNetCore.Reporting
qui semble être basé sur le code de
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
qui relève de cette licence
http://go.microsoft.com/fwlink/?LinkId=826162

Cette licence ne permet pas de
• distribuer du code distribuable pour qu'il s'exécute sur une plate-forme autre que la plate-forme Windows;
• le code soit divulgué ou distribué sous forme de code source; ou
• d'autres ont le droit de le modifier.
• contourner les limitations techniques du logiciel;
•> aucune rétro-ingénierie autorisée <

Je voudrais partager (publiquement) ce code avec la communauté ici sur github, à un emplacement encore à déterminer, dans le but d'améliorer le code et de résoudre les éventuels bogues restants, pour amener ReportViewer à .NET Core.
Cependant, je ne voudrais pas prendre une telle mesure unilatéralement compte tenu de la licence actuelle de ReportViewerControl.WebForms.

Je pense que beaucoup de choses ont changé depuis la première écriture / la dernière mise à jour de cette licence.
Par exemple, il serait peu logique de publier un ReportViewer pour .NET Core lorsque le résultat ne fonctionnerait que sur la plate-forme Windows - compte tenu également du fait que Microsoft a publié SQL-Server pour Linux, ce qui signifie qu'à un moment donné, SSRS doit suivez quand même.

Et étant donné qu'ASP.NET-Core n'implémente pas les WebForms, le passage de ReportViewer-WebForms à ReportViewer-NetCore constituerait de toute façon un changement radical.

Pourriez-vous demander discrètement aux pouvoirs en place, si, compte tenu des circonstances, ils donnent le feu vert à une telle entreprise - ce qui leur ferait d'ailleurs gagner du temps et de la main-d'œuvre - et s'alignent bien avec la nature open-source de .NET-Core / NetStandard 2.0.

Cela fait plus de 2 ANS depuis la sortie de .NET-Core, et il n'y a toujours pas de solution pour les rapports à grande échelle. Il est temps que cela soit rectifié.
Si nous le faisons ensemble, nous serons tous plus rapides et mieux lotis.

http://go.microsoft.com/fwlink/?LinkId=826162
Ce qui m'inquiète.
Sinon, je désélectionnerai les packages de NuGet.

@ALL :
XLS / DOC-Renderer fonctionne donc désormais à la fois sous Linux et Windows.
Maintenant 85% travaillent sous Linux.

Il semble que nous en sommes à 3 appels WinAPI pour PDFWriter et 13 appels WinAPI pour ImageRenderer / Graphics.
Je pense que le PdfWriter lui-même pourrait être assez facile.

Salut @ststeiger Je ne peux pas exécuter AspNetCore.Reporting sur Azure Function avec le plan de consommation car il a bloqué la fonction GDI +. Avez-vous des solutions pour cela? Merci.

Pas encore tout à fait - il fait plusieurs appels à GDI + et usp10.dll, principalement pour obtenir des informations sur les polices.
De plus, il passe des pointeurs GDI +, et il n'y a pas de remplacement simple, car mono libgdi + a choisi de faire les choses différemment (pour une bonne raison).

J'ai pu réécrire la fonction GetFontData en C # en lisant la source C de Wine, mais j'ai besoin de freetype pour accéder aux informations de police TrueType (wine utilise également FreeType).
SixLabors.Fonts et LayoutFarm ne sont tout simplement pas encore là (par une large marge).
Ici:
https://gist.github.com/ststeiger/273341aebd29009f2b272b822b69563f

Aussi, j'ai remplacé les mesures de texte par freetype

Je dois maintenant remplacer chaque handle de périphérique GDI par une classe personnalisée.
Cette classe doit alors contenir des informations font / graphiques / freetype-face / handle, etc. donc je n'ai pas besoin de réécrire le moteur de rendu.

Quand cela est fait, je dois regarder à nouveau le vin, car le papier-au-monde et le monde-au-papier se transforment.
Et puis cela devrait être fait.
Je pense que les transformations papier-monde et monde-papier sont peut-être déjà dans System.Drawing.Graphics.
On dirait qu'une partie du code a déjà été écrite à l'aide de .NET Framwork 1.0.

En outre, j'ai encore besoin de mapper entre la police .NET et la police freetype.

salut les gens
ce qui concerne:

@ALL :
XLS / DOC-Renderer fonctionne donc désormais à la fois sous Linux et Windows.
Maintenant 85% travaillent sous Linux.

Office Open XML

honnêtement, je pense qu'il serait préférable d'utiliser les nouveaux trucs de doc XML, alors aucune forme d'OLE n'est nécessaire du tout.
Ok, donc si quelqu'un utilisait encore des applications Office vraiment très anciennes, ce n'était pas si bon pour la compatibilité arrière. mais Office Open XML existe depuis environ 2002-2006, donc toute personne utilisant Word ou Excel des 10 dernières années pourra utiliser le format de fichier docx et xlsx très bien.
juste ma pensée à ce sujet ...

Juste pour ne pas nous méprendre:
Bien sûr, le moteur de rendu OpenXml Excel fonctionne également.

Je dis simplement que XLS / DOC fonctionne également, si nécessaire.
La question de savoir si XLS / DOC doit être exposé ou non, ou si cela pourrait être supprimé en toute sécurité est une autre question. Il y a peut-être encore d'anciens programmes qui ne peuvent pas fonctionner avec XLSX.

UBS, par exemple, utilise toujours des programmes COBOL.
Et il y en a plusieurs autres.
Il est donc probablement préférable de laisser la fonctionnalité XLS entrer un peu plus longtemps, au cas où.

@RaymondHuy :
Si Azure a bloqué la fonction GDI +, System.Drawing.Common fonctionne-t-il du tout?
Ou cela ne s'applique-t-il qu'aux appels DllImport externes au framework?

Hmm, il suffit de googler.
On dirait que les bibliothèques System.Drawing sont disponibles dans Azure Cloud Service (essentiellement une machine virtuelle), mais pas dans Azure Web App (essentiellement un hébergement partagé?).
Cela pourrait être un problème.
Donc, une fois que cela sera exécuté sur Linux, nous aurions besoin de remplacer tout System.Drawing par SixLabors.ImageSharp plus tard, pour le faire fonctionner sur Azure Web App.

Cela va coûter du temps et des efforts.
@RaymondHuy :
Pouvez-vous vérifier si FreeType (wrapper SharpFont) fonctionne sur Azure?
https://github.com/Robmaister/SharpFont

Remarque:
Sur x64-Windows, vous devez remplacer la clause using pour FT_Long et FT_ULong par ceci

#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

car les dll freetype corrigées ne fonctionnent pas sous x64-Windows.

Voici comment j'ai fait ça:
https://gist.github.com/ststeiger/9e2eb98e29a3c987aca739045af1d2ce

(Remarque: définissez WINDOWS dans les options de construction)

avec du code de test:

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 produira une exception si cela si la correction WINDOWS n'est pas appliquée.

quand j'essaye avec le fichier .rdlc je reçois une exception
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable 'n'est pas accessible dans ce contexte car il s'agit de' Friend '.'. ' dans localreport.Execute ()
Aidez-moi, s'il vous plaît

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

Il semblerait que vous ayez un problème avec les expressions VB intégrées.
Il y a de toute façon plusieurs problèmes.

Dans Microsoft.VisualBasic1 \ VBCodeGenerator.cs
UseShellExecute doit être défini sur false.

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

Et FromFileBatch doit être remplacé par roslyn s'il est compilé pour netstandard (le fournisseur CodeDom ne peut pas compiler pour netstandard - exceptions amusantes si des expressions VB sont utilisées, par exemple dans les paramètres)


        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

Il y a des RoslynCodeDomProviders dans https://github.com/aspnet/RoslynCodeDomProvider , mais ils utilisent quand même Roslyn dans les coulisses. Et compiler relativement dur avec "C: \ WINDOWS \ Microsoft.NET \ Framework\\ vbc.exe "est de toute façon une mauvaise idée.

Maintenant, je fais fonctionner le rendu complet HTML4, HTML5 et MHTML.
Pas seulement celui paginé.

Salut, j'utilise [https://www.nuget.org/packages/AspNetCore.Reporting] et cela fonctionne parfaitement dans IIS local.
Mais une fois que je le déploie dans le serveur Windows 2012 R2, je rencontre un problème.

Journaux d'erreurs.

échec: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]
Une exception non gérée s'est produite lors de l'exécution de la demande.
AspNetCore.Reporting.LocalProcessingException: une erreur s'est produite lors du traitement du rapport local.; La définition du rapport «D: \ Apps \ BillingApproval \ ReportFiles \ ReleaseProcess.rdl» n'est pas valide.
Une erreur inattendue s'est produite lors de la compilation des expressions. Valeur de retour du compilateur natif: -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: une erreur inattendue s'est produite lors de la compilation des expressions. Valeur de retour du compilateur natif: paramètres -1073741819'. at AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat(Stream definitionStream, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat(Byte[] definition, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport(PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String& reportDescription, String& reportLanguage, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat(PublishingContext reportPublishingContext) at AspNetCore.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot) --- End of inner exception stack trace --- at AspNetCore.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot) at AspNetCore.Reporting.LocalService.GetCompiledReport(PreviewItemContext itemContext, Boolean rebuild, ControlSnapshot& snapshot) at AspNetCore.Reporting.LocalService.CompileReport() at AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport() at AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession() --- End of inner exception stack trace --- at AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession() at AspNetCore.Reporting.InternalLocalReport.SetParameters(IEnumerable 1)
à AspNetCore.Reporting.Report.SetParameters (paramètre ReportParameter)
à AspNetCore.Reporting.LocalReport.Execute (RenderType renderType, Int32 pageIndex, Dictionary 2 parameters, String findString) at BA.UI.WebV2.Extension.AspNetCoreReportingExtension.ExecuteToMemoryStreamResult(LocalReport localreport, RenderType rendertype, Int32 index, Dictionary 2 paramètres, String searchString) dans D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Extension \ AspNetCoreReportingExtension.cs: ligne 27
à BA.UI.WebV2.Controllers.ReportsController.ReleaseProcessToPDF (DateHeure de, DateHeure à) dans D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Controllers \ ReportsController.cs: ligne 65
à lambda_method (Closure, Object, Object [])
à Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute (mappeur IActionResultTypeMapper, exécuteur ObjectMethodExecutor, contrôleur d'objet, arguments Object [])
à Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync ()
à Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync ()
à Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (contexte ActionExecutedContext)
à Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
à Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()
à Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()
à Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (contexte ResourceExecutedContext)
à Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
à Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync ()
à Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
sur Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext)
à Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (contexte HttpContext)
à Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (contexte HttpContext)
à Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke (contexte HttpContext)

@jfmjason : Cela se produit lorsque CodeDom Code Compiler (.NET 4.0) tente de compiler quelques fichiers dans un chemin temporaire dans ExprHostCompiler. Il souhaite compiler des assemblys NetStandard / NetCore avec le fournisseur .NET 4.0. Cela ne marche pas. Lorsqu'il tente de compiler ces fichiers, csc.exe échoue silencieusement avec la valeur de retour -1073741819.
Étant donné que vous ne pouvez pas compiler de code .NET Core avec le compilateur .NET 4.0, vous devez utiliser les RoslynCompilers, qui ne sont pas dans System.CodeDom. Mon NetStandardFromFileBatch ci-dessus résout exactement ce problème (et utilise CodeDom s'il compile pour NetFramework 4).

Cependant, notez que le runtime VB dans .NET Core est sérieusement limité.
Fondamentalement, .NET Core ne prend pas vraiment en charge VB.NET.

Si vous regardez les éléments de base de VB, tels que les quelque 50 fonctions de chaîne VB, comme Replace, Trim, AscW, ChrW, LCase, Len, Mid, dans Microsoft.VisualBasic.Strings - .NET Core 2.0 prend en charge exactement 2 d'entre elles, AscW et ChrW ...

Si vous regardez la source actuelle sur github, vous verrez que maintenant, ils sont là - mais ce sont tous des stubs qui lancent null.
https://github.com/dotnet/corefx/blob/master/src/Microsoft.VisualBasic/ref/Microsoft.VisualBasic.cs

En plus de cela, vous devrez peut-être modifier un peu votre code VB dans vos rapports - pour prendre en charge à la fois .NET Core et NetFramework.

Alors @ALL : voici une idée:
Si vous souhaitez que votre rapport avec du code s'exécutant sur .NET Core sans modifications, commencez à implémenter les fonctions de chaîne dans Microsoft.VisualBasic.cs.
Ou supprimez des éléments spécifiques à l'exécution VB et essayez d'utiliser les classes et les fonctions membres fournies avec C #, telles que string.Length au lieu de Len, IndexOf au lieu de InStr, Subtring au lieu de Mid, "BLA" .ToLower () au lieu de LCase ("BLA") etc.

En outre, le VB-Code en général, pas seulement dans .NET Core, a des problèmes avec la syntaxe Nullable?.
Utilisez donc System.Nullable (Of Double) au lieu de Double?, Si vous devez déclarer par exemple une valeur de retour de fonction.

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

En outre, vous devez modifier les références d'assembly dans 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 : Je ne l'ai pas encore regardé, mais dans la version paginée de la visionneuse, les images d'un rapport apparaissent-elles dans le rendu HTML paginé?
Parce que lorsque j'ai pris le moteur de rendu complet html4 & 5 de ReportServer, les images semblent être déléguées à un gestionnaire axd ou ashx de ReportingServices. Ils sont cependant apparus dans la version MHT.

Ils devraient probablement être remplacés par url ("data: image / png; base64, SOME_BASE64_IMAGE"); à la place, afin qu'ils soient intégrés dans le HTML.
C'est-à-dire s'ils vont vers un lien non externe.
Je n'ai pas testé si cela affecte également le spectateur.

@ststeiger

Merci pour votre réponse. Je me demande pourquoi cela fonctionne parfaitement lorsque je publie une version commerciale de mon application Web (.net core 2.1) dans IIS local.

Il se peut que cela fonctionne localement car le .NET Framework est installé localement.
Ou parce que votre serveur Web local n'est pas en mode intégré, s'exécute sous un autre utilisateur, ou qu'il rencontre un autre chemin logique, des paramètres de pool d'applications, des paramètres de sécurité, des redirections d'assembly, etc.
Aussi, ServicePacks, CumulativeUpdates et autres "fonctionnalités" intéressantes.

Fait une petite application de test.
Après avoir ajouté System.Drawing.Common sous Win10, cela fonctionne très bien.
L'exécution sur Ubuntu 16.04 entraîne une erreur.
AspNetCore.Reporting.LocalProcessingException: Une erreur s'est produite lors du traitement du rapport local.; La définition du rapport '/opt/testReportViewer/bin/Debug/netcoreapp2.1/Reports/Report1.rdlc' n'est pas valide.
Une erreur inattendue s'est produite lors du traitement des rapports.
Impossible de charger la bibliothèque partagée «kernel32.dll» ou l'une de ses dépendances. Afin d'aider à diagnostiquer les problèmes de chargement, envisagez de définir la variable d'environnement LD_DEBUG: libkernel32.dll: impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type ---> AspNetCore.Reporting.DefinitionInvalidException: La définition du rapport '/ opt / testReportViewer /bin/Debug/netcoreapp2.1/Reports/Report1.rdlc 'n'est pas valide.
Une erreur inattendue s'est produite lors du traitement des rapports.
Impossible de charger la bibliothèque partagée «kernel32.dll» ou l'une de ses dépendances. Afin d'aider à diagnostiquer les problèmes de chargement, envisagez de définir la variable d'environnement LD_DEBUG: libkernel32.dll: impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type ---> AspNetCore.ReportingServices.ReportProcessing.ReportProcessingException: une erreur inattendue s'est produite dans le traitement du rapport.
Impossible de charger la bibliothèque partagée «kernel32.dll» ou l'une de ses dépendances. Afin d'aider à diagnostiquer les problèmes de chargement, envisagez de définir la variable d'environnement LD_DEBUG: libkernel32.dll: impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type ---> System.DllNotFoundException: impossible de charger la bibliothèque partagée 'kernel32.dll' ou une de ses dépendances. Afin d'aider à diagnostiquer les problèmes de chargement, envisagez de définir la variable d'environnement LD_DEBUG: libkernel32.dll: impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type
à AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat (flux definitionStream, String et description, String & langue, ParameterInfoCollection et paramètres, DataSourceInfoCollection & sources de données, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, Boolean & hasExternalImages, Boolean & hasHyperlinks, Byte [] & dataSetsHash)
à AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat (Byte [] définition, String et description, String & langue, ParameterInfoCollection et paramètres, DataSourceInfoCollection & sources de données, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, booléennes & hasExternalImages, booléennes & hasHyperlinks, Byte [] & dataSetsHash)
à AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport (PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String & ReportDescription, String & ReportLanguage, ParameterInfoCollection & paramètres, DataSourceInfoCollection & sources de données, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, booléens & hasExternalImages, booléens & hasHyperlinks, byte [] & dataSetsHash)
à AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
--- Fin de la trace de la pile d'exceptions interne ---
à AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
à AspNetCore.Reporting.ReportCompiler.CompileReport (contexte ICatalogItemContext, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
--- Fin de la trace de la pile d'exceptions interne ---
à AspNetCore.Reporting.ReportCompiler.CompileReport (contexte ICatalogItemContext, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
à AspNetCore.Reporting.LocalService.GetCompiledReport (PreviewItemContext itemContext, Boolean rebuild, ControlSnapshot & snapshot)
à AspNetCore.Reporting.LocalService.CompileReport ()
à AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport ()
à AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession ()
--- Fin de la trace de la pile d'exceptions interne ---

@ststeiger des nouvelles sur la bibliothèque AspNetCore.Reporting? Je cherchais une solution pour créer des fichiers PDF à partir d'un fichier RDL sur .NET Core depuis des jours et la seule solution que j'ai trouvée était AspNetCore.Reporting, que j'ai découvert plus tard ne fonctionne que sur Windows et les modifications que vous avez apportées et signalées ici sont très attrayantes , aussi parce que j'ai pas mal de problèmes à utiliser les sous-rapports et que je ne peux pas déboguer le AspNetCore.Reporting sans la source, que vous avez :) ... Je serais très intéressé à vous aider avec cette bibliothèque pour améliorer les bits manquants ( et pour enfin pouvoir le déboguer ...)

@OkunevPY : Il est possible que cela soit dû à l'une des fonctions de gestion de la mémoire utilisées pour stocker les données de source de données en toute sécurité. Sous Linux, je viens de désactiver cette fonction - stocker les données non chiffrées. Ensuite, cela fonctionne, même si ce n'est pas sûr. Vous devez le faire dans le code ReportViewer, cependant. Le code de production devrait implémenter une méthode de chiffrement / déchiffrement, ce qui n'est pas difficile - mais je préfère simplement que toutes les fonctionnalités fonctionnent en premier,

@zillemarco;
La création de PDF ne fonctionne pas encore (fonctionne uniquement sous Windows).
De plus, si vous créez une application que vous déployez avec cette dll de rétro-ingénierie, techniquement, vous faites quelque chose d'illégal.

Si vous avez besoin d'un PDF généré sous Linux, je vous recommande de le générer à partir de HTML avec wkHtmlToPdf.
Voici une variante .NET-Core:
https://github.com/ststeiger/libWkHtml2X
Utilisez uniquement la variante exécutable (wkhtmltopdf.exe, wkhtmltoimage.exe via input / output-stream)
libWkHtmlToX.ProcessManager(opts)
parce que wkhtmltox.dll ne fonctionne pas dans les scénarios multi-threading, et mon interface C # n'est pas encore entièrement sans bogues.

Quelques exemples d'utilisation (Converter.telerik.com pour convertir en C #):

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

Vous pouvez également utiliser PdfSharp pour .NET-Core
https://github.com/ststeiger/PdfSharpCore

J'ai également porté la bibliothèque PDF complète sur NetStandard, qui peut être trouvée ici:
https://github.com/ststeiger/PdfSharpNetStandard
(si vous n'avez pas besoin d'hébergement Azure, je vous recommande de choisir PdfSharpNetStandard)

En ce qui concerne ReportViewer-PDF sous Linux:
Vous devrez d'abord implémenter beaucoup de pinvokes (Linux

Je n'ai encore fait que GetFontData, car c'est le plus important (incorporation de polices).
Si vous pouvez me donner votre nom de compte gitlab (et non hub), je peux vous donner un accès en lecture au référentiel.

@ststeiger Je sais que déployer une application avec cette bibliothèque serait illégal et je n'ai pas l'intention de le faire, mais avec le code source, je pourrais au moins être en mesure de le déboguer, comprendre pourquoi je ne peux pas charger un sous-rapport et transmettre des données (j'ai essayé avec resharper mais c'est un cauchemar). Si vous souhaitez me donner un accès en lecture au repo, je l'adorerais :) Mon nom d'utilisateur gitlab est zillemarco (comme ici sur github)

@zillemarco : Vous a ajouté.
Vous devriez avoir reçu un e-mail de gitlab, vraisemblablement avec le lien vers le dépôt.

Essayez ILSpy 4.0 Beta 2 au lieu de Resharper:
https://github.com/icsharpcode/ILSpy/releases

Si vous avez besoin de déboguer dans le .NET Framework, essayez live-decompile & debug avec Rider, l'EAP est gratuit:
https://www.jetbrains.com/rider/eap/

@ststeiger a reçu l'e-mail merci :) Merci pour le conseil aussi!

@ststeiger Vous pouvez donner accès au référentiel AspNetCore.Reporting pour okunevpy?

@OkunevPY : Vous avez été ajouté. Voir mail.

@ststeiger Merci.

        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: "Une erreur s'est produite lors du traitement du rapport local.; Aucune donnée n'est disponible pour le codage 1252. Pour plus d'informations sur la définition d'un codage personnalisé, consultez la documentation de la méthode Encoding.RegisterProvider."

@Jhonnybmx : Il y a un site Web, appelé google.com, où vous insérez le message d'erreur, et la solution est le premier lien ...

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

Salut, je suis intéressant à propos de LocalReport sur .NET Core pour exporter le rapport rdlc au format PDF.
Pour moi, seule la version Windows me convient pour le moment.

Je suis tombé sur le package NuGet AspNetCore.ReportingServices de @ amh1979, qui est exactement ce dont j'ai besoin.
Le problème est que la classe InternalLocalReport de ce package est interne et que je dois accéder à l'ensemble de l'API (comme dans l'implémentation MS LocalReport d'origine) pour l'eq. pour utiliser l'événement SubreportProcessing, appelez les méthodes LoadSubreportDefinition () ou GetParameters ().

Ces méthodes ne sont pas implémentées dans la classe AspNetCore.Reporting.LocalReport (dans AspNetCore.Reporting NuGet), je dois donc les appeler directement.

L'assembly AspNetCore.ReportingServices.dll a défini InternalsVisibleTo pour l'assembly AspNetCore.Reporting.dll.
Puis-je en quelque sorte utiliser cela comme dans https://github.com/amh1979/Reporting/tree/master/AspNetCore.Reporting avec le certificat Reporting.pfx (auquel je n'ai pas de mot de passe).

Pourriez-vous m'aider s'il vous plait? Quelle est la solution pour cela?

@ststeiger Vous pouvez également me donner accès au référentiel GitLab AspNetCore.Reporting. Mon nom d'utilisateur GitLab est holajan.
Merci

Les AspNetCore.ReportingServices sous cette licence
http://go.microsoft.com/fwlink/?LinkId=826162
Je l'ai fermé

Quelqu'un peut-il s'il vous plaît fournir de la documentation / des indices ou des conseils sur la façon d'utiliser / mettre en œuvre ce paquet? Merci beaucoup.

@ststeiger Pourriez-vous s'il vous plaît me donner accès au référentiel AspNetCore.Reporting? J'essaye de le faire fonctionner sous Linux avec PDF.

@holajan , @skivsoft :
Désolé, était en vacances - c'était un beau voyage à Singapour et en Thaïlande.
Accès accordé, vous devriez avoir reçu un e-mail à l'adresse fournie à gitlab.

@azharuddinsayed :

quand j'essaye avec le fichier .rdlc je reçois une exception
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable 'n'est pas accessible dans ce contexte car il s'agit de' Friend '.'. ' dans localreport.Execute ()
Aidez-moi, s'il vous plaît

J'ai réussi à reproduire cette erreur.
Les modifications suivantes sont requises:


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)

et

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

En plus de cela, la correction suivante dans
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 + "\"")

Ensuite, le code personnalisé fonctionne, du moins dans mon cas.
Mis à jour dans master.

@ststeiger Merci pour l'accès. Avez-vous une idée de la façon de rendre un PDF sous Linux? Il y a trop de pinvokes à remplacer.

@skivsoft : Il n'y en a pas encore.
Vous devrez remplacer tous les pinvokes par un équivalent freetype, ce qui demande beaucoup de travail.

Si vous avez juste besoin de créer un PDF sous Linux, vous pouvez essayer PdfSharpCore ou PdfSharpNetStandard:
https://github.com/ststeiger/PdfSharpCore
https://github.com/ststeiger/PdfSharpNetStandard
Je les utilise tous les deux sous Linux.
PdfSharpNetStandard est plus complet, mais utilise également GDI + / libGDIplus, tandis que PdfSharpCore évite System.Drawing.

@ststeiger Merci pour l'accès au repo.

J'ai pu faire fonctionner mon rapport (exportation au format PDF) dans mon application Windows .NET core 2.2.
Je l'ai fait sur une copie de votre projet ReportViewer_NetStandard, car j'ai supprimé LocalReports et changé InternalLocalReport en LocalReport et rendu la classe publique (j'avais besoin d'accéder à l'API LocalReport d'origine).

Pour mon rapport, j'ai corrigé deux problèmes:
Quelques expressions Visual Basic:
IIf - J'ajouté à l' importation Microsoft.VisualBasic.Interaction dans _ExprHostBuilder_, changé pour netcoreapp2.2 où la classe Microsoft.VisualBasic.Interaction dans _Microsoft.VisualBasic.dll_ est interne et ajouté ma classe Microsoft.VisualBasic.Interaction à Microsoft.VisualBasic1.

Format - importation ajoutée à Microsoft.VisualBasic.StringsEx dans _ExprHostBuilder_, classe ajoutée Microsoft.VisualBasic.StringsEx à Microsoft.VisualBasic1 (car la classe d'origine Microsoft.VisualBasic.Strings est publique mais sans fonction Format)

System.Environment.NewLine - Ajout d'une référence à System.Runtime.Extensions.dll dans _ExprHostCompiler_.

Voici ces changements de code:

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

Correction des sous-rapports avec des expressions:
J'ai remarqué que les éléments Subreport utilisaient ReportExprHost du rapport principal et non ReportExprHost pour un sous-rapport spécifique, donc les expressions sur les sous-rapports ne fonctionnaient pas. J'ai pu trouver une erreur dans ReportRuntime.LoadExprHostAssembly , où les assemblys ExpressionHost.dll ont été mis en cache par nom, mais le nom de tous les rapports et sous-rapports est toujours le même "_ExpressionHost_". J'ai supprimé cette mise en cache.
Changements de code:

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

Veuillez examiner ces modifications et si cela vous convient, effectuez également ces modifications dans votre dépôt.

Je vous remercie.

@holajan : Si j'ajoute System.String aux espaces de noms, j'obtiens:
Ambigous call to Replace - cannot resolve call
et si j'ajoute la classe Microsoft.VisualBasic.Interaction, j'obtiens:
ambigous call to Microsoft.VisualBasic.Interaction
lorsque je l'exécute dans NetCore ou .NET Framework 4.
Peut-être que cela ne fonctionne que dans .NET Core 2.2.

Si la mise en cache est incorrecte, il vaut mieux ne pas la mettre en cache.
Acceptez ce changement.
J'ai mis l'ancien code dans #ifdef false (au lieu de le supprimer).

@ststeiger J'ai édité mon commentaire, en utilisant pour System.String était faux, j'ai maintenant implémenté Microsoft.VisualBasic.StringsEx à la place pour Format et d'autres fonctions. Désolé.

Oui Microsoft.VisualBasic.Interaction fonctionne uniquement dans .NET Core 2.2., Car la classe Microsoft.VisualBasic.Interaction est dans Microsoft.VisualBasic.dll pour .NETCoreApp v2.2 interne , dans Microsoft.VisualBasic.dll pour .NETCoreApp v2.09 est public mais avec méthode interne IIf .
Je ne sais pas comment résoudre ce problème mieux, mais avec .NET core 3.0, il sera probablement changé de toute façon.

@holajan : Si longtemps, attendons jusqu'à 3.0
J'ai rendu public InternalLocalReport.
Nom étrange maintenant concernant son caractère public;)

@holajan : Ajout de Microsoft.VisualBasic.StringsEx, maintenant cela fonctionne
J'ai dû ajouter IReadOnlyDictionary pour .NET 4, mais c'est juste une remarque mineure.
Pourriez-vous tester si cela fonctionne avec vous.

@ststeiger je l'ai testé.
Je dois changer #if false en #if true dans Microsoft.VisualBasic1._Interaction.cs pour que l' expression
Sinon, cela fonctionne bien.
Merci

@holajan : OK, c'est comme il se doit. peut-être qu'une définition dans la solution serait préférable.

Tout le monde dans ce fil devrait voter pour que cela soit ajouté, ici: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- coeur

À partir de 2019/03, sa 7e de la fonctionnalité la plus recherchée: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Edit: à partir de 2019/05, son 5ème du haut

Edit: à partir de 2019/07, son 4ème du haut

        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: "Une erreur s'est produite lors du traitement du rapport local.; Aucune donnée n'est disponible pour le codage 1252. Pour plus d'informations sur la définition d'un codage personnalisé, consultez la documentation de la méthode Encoding.RegisterProvider."

Ajoutez le code ci-dessous:
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
Cela résout mon problème

Salut,

J'ai essayé d'exporter le rapport en Html en utilisant le code ci-dessous mais il ne s'affiche pas correctement.

Le fichier .rdl contient un graphique

J'ai joint une capture d'écran de Html

Merci beaucoup si vous pouvez nous aider à résoudre ce problème.

Merci

PlatForm: ASP.NET Core

chaîne publique _reportPath = @ ".. \ RenderReportAPI \ employeeChart.rdl";

string mimtype = "";
extension int = 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 : Que montre l'URL de l'élément "report chart"?
Le moteur de rendu html a un flux de sortie secondaire pour CSS.
Contient-il une image encodée en base64? Ou s'agit-il simplement d'un lien vers un gestionnaire d'images?

@ststeiger
Salut, veuillez trouver HTML et CSS ci-dessous
HTML:

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







CSS:

"#rsoReportDiv .A97993c8d452f40d4910a317776d607f616xBc {
bordure: 1 pt aucun Noir;
couleur de fond
}

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;

}

Élément de graphique de rapport
Report chart
je pense que cette erreur cause le problème

Merci..

@ststeiger

Salut une mise à jour?

@chinturathod :
Je travaille actuellement sur CEF-pdf en remplacement de wkhtml2X et sur SwissRe Reports.

J'aurai le temps d'examiner ce projet dans plus de deux semaines, au plus tôt.

Existe-t-il un référentiel (privé ou autre) pour le package AspNetCore.ReportingServices auquel je pourrais avoir accès?

@clintb : J'ai besoin de votre nom de compte git LAB , donc je peux vous accorder l'accès.
Vous recevrez ensuite un e-mail à l'adresse e-mail du compte git lab contenant l'accès au repo.

Hey Stefan, mon gitLab est c_l_i_n_t. Merci!

Le ven 26 avril 2019 à 12:18 PM Stefan Steiger [email protected]
a écrit:

@clintb https://github.com/clintb : J'ai besoin de votre nom de compte git LAB , donc
Je peux vous accorder l'accès.
Vous recevrez ensuite un e-mail à l'adresse e-mail du git lab
compte contenant l'accès au repo.

-
Vous recevez cela parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub
https://github.com/aspnet/AspNetCore/issues/1528#issuecomment-487133308 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ABURO5ILQUEGMZARNW2HNALPSM2M5ANCNFSM4CFRN7MQ
.

@clintb : Vous avez été ajouté.

Bonjour @ststeiger , si vous le souhaitez, veuillez accorder l'accès au repo à lotsatrees. Merci pour votre travail et votre aide.

@lotsatrees : Vous avez été ajouté.

Merci Stefan, heureux de vous acheter une bonne bière à tout moment.

Salut @ststeiger , mon gitlab est edgardoreyes. Merci beaucoup.

@ststeiger
Mon gitlab est ikourfaln
Je vous remercie

@ikourfaln , @edgardoreyes : Vous avez ajouté vous deux; vous devriez avoir reçu un e-mail sur le compte de messagerie que vous avez enregistré avec gitlab.

@ststeiger , serait-il possible de m'ajouter moi-même (Mhirji sur gitlab)?

Merci!!

@Mhirji : Terminé.

Merci!!!

Pourquoi ne pas simplement créer un projet Report Server et l'utiliser comme service pour n'importe quel type de projet?
Votre projet ASP.NET Core aura uniquement besoin de l'URL du service de rapports pour afficher les rapports.
Un problème avec cette approche?

@ststeiger puis-je également y accéder? (ConstantDisaster sur gitlab) merci d'avance

@ConstantDisaster : Ajouté.
@mshwf : Non, en fait c'est exactement ce que je veux faire - afin que nous puissions exécuter des rapports dans notre propre application, et aucun serveur de rapports n'est nécessaire (toujours un problème avec l'authentification Windows - pour certaines raisons, les services informatiques sont incapables d'ajouter de nouveaux utilisateurs à un groupe - plus toujours un problème avec les Service Packs désinstallés, ne voulant pas mettre à jour vers la dernière version du serveur SQL car les clients veulent sauter une version, rendant les incohérences entre ReportViewer et ReportServer, notre propre administrateur système trop paresseux pour installer quoi que ce soit, etc.). Manque juste de temps, comme toujours. De plus, ce sont les premiers jours ensoleillés de l'été, ici en Europe du Nord-Ouest, et je ne veux pas les manquer.

@ststeiger Existe-t-il de meilleures alternatives? (J'ai essayé de lire ce fil, mais c'est très long!)
pouvez-vous également m'accorder l'accès au dépôt GitLab (mshwf)?
Merci

Veuillez soutenir cette demande , espérons que Microsoft nous écoute!

@ststeiger ,
Mon nom d'utilisateur gitlab est k3flo
Merci beaucoup
Vielen Dank 😊

@ststeiger merci d'avoir ajouté, alors comment puis-je recommencer à l'utiliser? dans un projet asp net core? pensait qu'il y avait un readme ou quelque chose du genre, merci encore.

@ConstantDisaster : Il y a un "exemple", dans AnyWebReporting\Any_TestCode\TestReport.cs .
Il montre comment rendre un rapport avec des paramètres et des ensembles de données dans un PDF.

En un mot:
1) Créez un dictionnaire pour les paramètres de rapport:

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

2) Ajoutez tous les paramètres que vous avez dans votre rapport au dictionnaire, par exemple

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

3) Créer un nouveau rapport basé sur LocalReport et charger

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

Ensuite, pour tous les ensembles de données qui ne sont utilisés que dans les paramètres, vous pouvez ajouter une table de données vide (non NULL)
lr.AddDataSource("SEL_Standort", new System.Data.DataTable());

Et pour chaque ensemble de données utilisé, vous devez remplir une table de données avec le résultat de la requête pour cet ensemble de données et ajouter l'ensemble de données aux sources de données:

lr.AddDataSource("DATA_Schluesselbestandeskontrolle", dt);

Ensuite, vous pouvez exécuter le rapport, récupérer le résultat et l'écrire quelque part, par exemple le lecteur d:

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

J'ai ajouté un exemple de page HTML qui imite la conception de l'interface de rapport ReportViewer 2014 & 2017, que j'avais dans une version préliminaire. Si vous récupérez à nouveau de git, vous le trouverez dans:

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

Et c'est tout.
Si vous avez besoin d'afficher le rapport sur le Web, vous pouvez effectuer le rendu au format HTML en transmettant le Enum respectif à dans lr.Execute (RenderType.HTML5_0 ou HTML4_0 ou Mhtml), et en transmettant le numéro de page correct. Le résultat (HTML) est dans MainStream et le CSS est dans SecondaryStream.

Cependant, en connectant l'index.htm de ReportViewer avec lr.Execute par JavaScript, vous devez le faire vous-même, pour le moment. Je n'ai pas encore réussi à faire ça. Pour l'instant, j'en ai besoin pour générer des PDF à ajouter aux e-mails.

@ k3flo @mshwf : Ajouté.

@mshwf :

@ststeiger Existe-t-il de meilleures alternatives? (J'ai essayé de lire ce fil, mais c'est très long!)

Pas à ma connaissance, sinon je l'utiliserais.
Peut-être verrons-nous quelque chose à cet égard après la version .NET Core 3.1 (LTS) , car alors la route serait libre de créer un ReportViewer Windows uniquement basé sur .NET Core.

Cependant, une telle chose serait tout autant un bricolage que ce projet, alors peut-être qu'ils prendront le temps de supprimer tout le code System.Drawing (et les appels WinAPI à GDI +), et le faire correctement, c'est-à-dire, multiplateforme. Bien qu'à mon avis, cela soit peu probable. Pas malheureux d'être positivement surpris (toux).

Le fait est que les rapports peuvent contenir du code VB et que la prise en charge de VB dans .NET Core (<3) est, à l'heure actuelle, discutable - au mieux. Cela sera (= devrait théoriquement être) rectifié par .NET Core 3, et s'ils créent un ReportViewer, ils attendront probablement au moins la sortie de LTS.

@mshwf :
Vous n'avez pas besoin de lire tout ce fil.
Tout ce que vous avez à faire est de git-cloner le projet et de voir l'exemple de rapport (vous n'aurez cependant pas la base de données pour l'exécuter).

Pourriez-vous m'ajouter sur gitlab s'il vous plaît?
DCGA

@dcga : Ajouté.

Salut, pouvez-vous m'ajouter sur votre gitlab? Je suis en train de convertir le rapport en projet ASP.net Core.

@ ericyu67 : Je suppose que le nom de votre compte gitlab est ericyu? Dans ce cas, vous avez été ajouté.

C'est exact, merci.

@ststeiger pourriez-vous m'ajouter s'il vous plaît?
Rodrigorrl

@rodrigorrl : ajouté.

@ststeiger pourriez-vous m'ajouter s'il vous plaît?

@myersBR : Terminé.

@ststeiger pouvez-vous m'ajouter s'il vous plaît?

@acofalc : Ajouté @ aco.mit

Salut, @ststeiger s'il vous plaît ajoutez-moi: oblin228, merci.

des nouvelles à ce sujet? J'utilise ASP.NET Core et je refuse de revenir aux formulaires Web. J'ai un projet de rapports et je transmets l'URL du serveur de rapports à mon application pour télécharger le fichier. Le problème est qu'il demande constamment une authentification Windows et je voudrais éviter cela ...

@oblin : Ajouté.

@jfcaldeira : Tant que vous exécutez l'application sur Windows, le visualiseur de rapports sur gitlab devrait fonctionner, plus ou moins (problème ouvert avec les images en sortie HTML, jusqu'à présent). Exécutez-le sous Linux, et cela devrait fonctionner tant que vous n'utilisez pas PDF, TIFF ou PowerPoint comme format de sortie (je ne sais pas à propos de word), mais Excel, html, xml et json ont également fonctionné sous Linux (dans mon test à 1 rapport - je ne peux pas dire si rien n'explose si vous utilisez l'ensemble de fonctionnalités complet).

Mais si votre problème est l'authentification Windows sur SSRS, pourquoi n'utilisez-vous pas la sécurité personnalisée (alias l'authentification par formulaires SSRS).

Pour cela, voir ici:
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

Vous devrez peut-être connecter l'utilisateur avec un Form-Post en JavaScript et définir une politique P3P (dans SSRS via le module http) pour que le cookie d'authentification SSRS persiste dans IE dans les domaines ... (remarque: si vous utilisez des répertoires virtuels et avez 2 applications sur un SSRS, le cookie d'authentification de application1 [qui se trouve sur le domaine SSRS] écrasera le cookie d'authentification de application2, qui est également sur le domaine SSRS)

@oblin : Ajouté.

@jfcaldeira : Tant que vous exécutez l'application sur Windows, le visualiseur de rapports sur gitlab devrait fonctionner, plus ou moins (problème ouvert avec les images en sortie HTML, jusqu'à présent). Exécutez-le sous Linux, et cela devrait fonctionner tant que vous n'utilisez pas PDF, TIFF ou PowerPoint comme format de sortie (je ne sais pas à propos de word), mais Excel, html, xml et json ont également fonctionné sous Linux (dans mon test à 1 rapport - je ne peux pas dire si rien n'explose si vous utilisez l'ensemble de fonctionnalités complet).

Mais si votre problème est l'authentification Windows sur SSRS, pourquoi n'utilisez-vous pas la sécurité personnalisée (alias l'authentification par formulaires SSRS).

Pour cela, voir ici:
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

Vous devrez peut-être connecter l'utilisateur avec un Form-Post en JavaScript et définir une politique P3P (dans SSRS via le module http) pour que le cookie d'authentification SSRS persiste dans IE dans les domaines ... (remarque: si vous utilisez des répertoires virtuels et avez 2 applications sur un SSRS, le cookie d'authentification de application1 [qui se trouve sur le domaine SSRS] écrasera le cookie d'authentification de application2, qui est également sur le domaine SSRS)

Bonjour, merci d'avoir répondu à mon problème. Je n'ai pas entendu parler de ce visualiseur de rapport sur gitlab, pouvez-vous me montrer une ancre?

Et à propos de l'authentification Windows, le problème est que l'utilisateur est authentifié à l'aide de l'authentification par cookie sur mes applications dans ASP.NET Core et la solution de contournement pour amener les utilisateurs à accéder au rapport consiste essentiellement à transmettre l'URL directe avec des paramètres au href d'une ancre et choisissez également PDF comme format. J'essayais de trouver un moyen de ne pas demander d'authentification à l'utilisateur car cela ennuyait l'utilisateur final de devoir s'authentifier deux fois. J'utilise déjà un compte spécifique juste pour l'accès aux sources de données, c'est un en bas.

Salut, @ststeiger - mon gitlab est arunputhran. Pouvez-vous m'accorder l'accès s'il vous plaît? Merci beaucoup!

Republier ceci parce qu'il est enterré dans toutes les requêtes "give me access to gitlab".

Tous ceux qui rencontrent ce fil devraient voter pour .NET Core SSRS à ajouter, ici: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for -asp-net-core

Commencé 7e à partir du haut, et il est passé à 4e à partir du sommet, la fonctionnalité SQL Server la plus demandée (https://feedback.azure.com/forums/908035-sql-server?category_id=325159)

Edit: à cause de ce post, il occupe la troisième place maintenant

Je ne sais pas si cela aide même si ...

@arunputhrankyc : Ajouté.

@ k290 : Non, comme vous pouvez le voir, un thème sombre pour SQL Server Management Studio 2017 est clairement plus important: scream:: man_facepalming:: woman_facepalming:
Apparemment, ils n'ont pas encore entendu parler de SQL-ops-studio / AzureDataStudio .

Je pense que, dans cet esprit, quelqu'un devrait ajouter un design plat à cette liste de souhaits, juste comme une blague.
Malheureusement, ce n'est pas encore le 1er avril: clin d'oeil:

en passant, je reçois des rapports au format pdf à partir d'une API Web et je n'utilise aucun bit wcf.
juste des appels soap / asmx et des appels http.
en les faisant, je passe des crédits sans aucun problème.
mon code est asp.net 4.6 / web api 2
si vous voulez voir ce que je fais, je peux mettre du code sur un github la semaine prochaine pour que vous puissiez le vérifier.
J'appelle le serveur de rapports 2016 mais la plupart de ce que je fais fonctionnera avec les anciennes versions ssrs.

Bonjour, j'ai lu ce commentaire sur la façon dont vous gérez SSRS. Je fais aussi quelque chose de similaire, j'ai une ancre dans une application ASP.NET Core qui a l'URL directement vers le rapport avec les paramètres inclus et l'extension de format. Cependant, le problème est qu'il demande une authentification Windows. Existe-t-il un moyen d'arrêter de demander cela puisque les utilisateurs ont déjà connecté mon application à l'aide de l'authentification par cookie? Je ne me soucie même pas d'afficher le rapport tant qu'il est téléchargé mais ce serait bien de sauter l'authentification

@arunputhrankyc : Ajouté.

@ k290 : Non, comme vous pouvez le voir, un thème sombre pour SQL Server Management Studio 2017 est clairement plus important 😱 🤦‍♂ 🤦‍♀
Apparemment, ils n'ont pas encore entendu parler de SQL-ops-studio / AzureDataStudio .

Je pense que, dans cet esprit, quelqu'un devrait ajouter un design plat à cette liste de souhaits, juste comme une blague.
Malheureusement, ce n'est pas encore le 1er avril 😉

Eh bien, je tuerais pour un thème sombre pour SSMS, mais je mangerais mes mains nues pour ce SSRS. La quantité de travail économisée en restituant des données groupées directement à partir de SQL est incroyable.

Excellente solution, ajoutez-moi s'il vous plaît dans gitlab: @kholossok , merci

S'il vous plaît ajoutez-moi aussi dans gitlab: @EMaderbacher

@kholossok , @EMaderbacher : Ajouté.

Ajoutez-moi aussi s'il vous plaît @jfcaldeira

@jfcaldeira : Vous devez me donner un compte git lab .
Ceci est un compte git hub .
C'est gratuit. https://gitlab.com
Les dépôts privés n'étaient pas gratuits sur github à l'époque.

@ststeiger
Les référentiels privés sont désormais gratuits sur GitHub, la limitation concerne le nombre de collaborateurs.

@jfcaldeira : Vous devez me donner un compte git lab .
Ceci est un compte git hub .
C'est gratuit. https://gitlab.com
Les dépôts privés n'étaient pas gratuits sur github à l'époque.

J'ai créé un compte avec le même nom d'utilisateur

@jfcaldeira : Ajouté. Vous devriez avoir reçu un e-mail avec les informations d'accès.
@ikourfaln : Je sais. Je ne savais pas qu'il y avait une limitation à 3 collaborateurs dans les dépôts privés github, cependant. C'est bon à savoir, merci .

Limitations de Gitlab:

Pour célébrer la bonne nouvelle d'aujourd'hui, nous avons augmenté de manière permanente notre limite de stockage par référentiel sur GitLab.com de 5 Go à 10 Go. Comme auparavant, les référentiels publics et privés sur GitLab.com sont illimités, n'ont pas de limite de transfert et ils incluent un nombre illimité de collaborateurs.

Puis-je être ajouté aussi? Mon compte GitLab est barryjsilver. Merci!

Puis-je être ajouté s'il vous plaît? @jyanosu Merci!

@BarryJSilver : Ajouté.

@jyanosu : j'ai besoin du compte git lab .com, pas de github.

@ststeiger Oups , il suffit de le configurer .. même nom d'utilisateur @jyanosu

@jyanosu : Ajouté.

@ststeiger pouvez-vous ajouter mon compte gitlab @ kanichi123
Je vous remercie!

@ kanichi123 : Ajouté.

@ststeiger s'il vous plaît mon compte trop sheryever

@sheryever : Ajouté.

@ststeiger , pouvez-vous ajouter mon compte gitlab @PentaTech
Je vous remercie!

@ststeiger pourrais-tu aussi m'ajouter? @glebteterin
Je vous remercie!

@PentaTech , @ g-rad: ajouté.

@ststeiger bon effort à ce sujet, pourriez-vous s'il vous plaît ajouter le compte gitlab brad0000?

@ brad0000 : Terminé.

Salut @ststeiger , pouvez-vous également m'ajouter? compte gitlab: wyepez. Merci

@wyepez : Ajouté.

@ststeiger Pouvez-vous également m'ajouter?

Nom d'utilisateur Gitlab: choudeshell

@choudeshell : Ajouté.

Pouvez-vous s'il vous plaît m'ajouter? Merci!

Votre solution fonctionne-t-elle avec .rdlc (ainsi qu'avec .rld côté serveur)? Merci

Votre solution fonctionne-t-elle avec .rdlc (ainsi qu'avec .rld côté serveur)? Merci

@mpirritano : Oui, en fait, il n'y a pas beaucoup de différence entre RDL et RDLC.
Mais ce n'est que du Web. Pas de Windows-Forms.
J'ai besoin d'un compte git lab pour vous ajouter, pas de github.

@ststeiger Merci - J'ai créé un compte GitLab maintenant : @mdpirrit

C'est génial - je n'en ai besoin que pour ASP .NET Core ciblant .NET Core. Merci!

@mpirritano : Ajouté, vous devriez avoir reçu un e-mail sur le compte de messagerie que vous avez utilisé pour enregistrer gitlab.

Je l'ai; Merci!

@ststeiger cela fonctionne très bien sauf qu'il ne peut pas rendre les graphiques. - il rend la zone de graphique avec l'erreur: " Impossible de charger le fichier ou l'assemblage" System.Windows.Forms, Version = 4.0.0.0 "

Est-ce une limitation connue ou est-ce que je manque quelque chose?

Merci

@ststeiger De plus, il ne semble pas que les sous-rapports soient pris en charge. c'est-à-dire qu'il ne semble pas y avoir de gestionnaire d'événements de traitement de sous-rapport pour ajouter des sources de données à l'instance de sous-rapport

Merci

Pouvez-vous s'il vous plaît m'ajouter? Merci! @ashabyralieva

Votre solution fonctionne-t-elle avec .rdlc (ainsi qu'avec .rld côté serveur)? Je vous remercie

@mpirritano : Oui, il n'y a vraiment pas beaucoup de différence entre RDL et RDLC.
Mais ce n'est qu'un réseau. Pas de formulaires Windows.
J'ai besoin d'un compte Git Lab pour vous ajouter, pas de GitHub.

Peux tu m'ajouter? Je vous remercie! @ashabyralieva

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

@mpirritano :

Est-ce une limitation connue ou est-ce que je manque quelque chose?

Oui, une limitation dont j'étais consciente qu'elle pouvait exister.
Et aussi, il a un problème avec la sortie d'image en HTML.
Points ouverts.
Je n'ai même pas encore pensé aux sous-rapports.
Malheureusement, nous en avons aussi quelques-uns, ce sera donc aussi mon problème.
En parlant de cela, je ne sais même pas comment les sous-rapports sont gérés dans le ReportViewer normal sur le framework complet, d'autant plus qu'ils peuvent être récursifs.

Il y a probablement un problème quelque part, car "System.Windows.Forms, Version = 4.0.0.0" n'existe pas dans cette version de .NET Core, et également, l'assembly est appelé System.NetStandard.Forms à la place dans ReportViewer pour .NET Core. Peut fonctionner sur un framework complet, car il existe System.Windows.Forms, Version = 4.0.0.0.

Le problème avec System.Windows.Forms peut probablement être rectifié aussi facilement que de mettre le nom de l'assembly et la version (partout où il se cache dans le code source) dans un ifdef, les sous-rapports plutôt pas je suppose.

Je dois encore terminer un service d'envoi de rapports cette semaine, donc je pourrai peut-être examiner le problème System.Windows.Forms la semaine prochaine.

En ce qui concerne les sous-rapports: ils sont de toute façon une mauvaise idée, ont tendance à créer des problèmes avec PDF et Excel, et dans le cas où vous n'avez qu'un seul rapport, je vous recommanderais de voir s'il n'est pas possible d'éliminer complètement le sous-rapport d'une manière ou d'une autre. , et faites tout ce qui est contenu dans un seul rapport.

Добавлено
Comment obtenir la base de données COR_Basic_SwissLife_UAT?

: rofl: Haha, bon, vous n'avez pas, cette DB est confidentielle.
Mais vous pouvez créer votre propre exemple de rapport, en utilisant votre propre base de données.
Vous devriez voir à partir de l'exemple comment l'utiliser.

@ststeiger Merci. En fait, je vois qu'il y a un événement SubreportProcessing défini dans AsNetCore.Reporting.InternalLocalReport. Je peux essayer de créer une interface publique pour cela et voir si je peux passer des sources de données à des sous-rapports. Je ne parviendrai peut-être pas à cela avant la semaine prochaine également ...

J'essaie également d'éviter les sous-rapports, mais je les ai trouvés nécessaires dans les cas où vous auriez besoin d'une section répétitive dans une section répétée. En ce qui concerne Excel, il est possible de rendre chaque instance de sous-rapport sous forme de feuille de calcul dans Excel avec rdlc / rdl

Republier ceci pour les nouveaux arrivants.

Tout le monde dans ce fil devrait voter pour que cela soit ajouté, ici: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- coeur

En mars de cette année, il était 7e du sommet.

Maintenant, nous l'avons jusqu'à la 2e à partir du haut des suggestions SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Pouvons-nous battre le mode sombre?

@ststeiger J'ai eu un peu de temps aujourd'hui et j'ai réussi à rendre des rapports avec des sous-rapports en .docx, .xlsx et .pdf.

En guise de test rapide sur ma copie locale - j'ai changé le modificateur d'accès de la propriété "localReport" de la classe "LocalReport" de "internal" à "public". Ensuite, je pourrais écrire un gestionnaire pour l'événement "SubreportProcessing" comme je le ferais toujours (où je lirais la valeur du paramètre dans l'instance de sous-rapport et l'utiliserais pour filtrer un ensemble de données que je passerais dans la source de données de l'instance de sous-rapport)

Je ne sais pas comment résoudre le problème de rendu des graphiques avec .NET Core; donc si jamais vous parvenez à trouver une solution, ce serait incroyable. Mais à part ça, je pense que votre solution fait tout ce dont j'ai besoin (personnellement, je ne rendrai jamais de rapports au format HTML)

Merci

export-mot, exceller ne pas se réveiller?
FormatException: l'en-tête contient des valeurs non valides à l'index 0: ''

le service est très lent. ce qui peut être fait? Veuillez aider ...

Salut tout le monde, je viens de terminer l'écriture d'un port personnalisé du contrôle de la visionneuse de rapports à l'aide de ReportExecutionService.asmx qui est intégré à SSRS et je ciblais ASP.NET MVC. Quelqu'un m'a suggéré de le porter sur .NetCore & MVC, donc j'ai terminé cela. Essayez-le et dites-moi ce que vous en pensez: https://github.com/alanjuden/MvcReportViewer

Alan

export-mot, exceller ne pas se réveiller?
FormatException: l'en-tête contient des valeurs non valides à l'index 0: ''

le service est très lent. ce qui peut être fait? Veuillez aider ...

@azikaa :

Nous clôturons ce problème car il n'est pas directement pertinent pour ce dépôt et sur la base des commentaires ici, l'équipe SSRS est déjà au courant de ces commentaires. Compte tenu de la quantité de commentaires que cela a reçus, il est désormais impossible à gérer.

La réponse de @ k290 est la plus exploitable ici, alors suivez sa suggestion ici :

Republier ceci pour les nouveaux arrivants.

Tout le monde dans ce fil devrait voter pour que cela soit ajouté, ici: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- coeur

En mars de cette année, il était 7e du sommet.

Maintenant, nous l'avons jusqu'à la 2e à partir du haut des suggestions SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Pouvons-nous battre le mode sombre?

Cette page vous a été utile?
0 / 5 - 0 notes