Aspnetcore: Asp.Net Core Reporting (SSRS)

Erstellt am 2. Juni 2016  ·  269Kommentare  ·  Quelle: dotnet/aspnetcore

Ich arbeite an der ASP.NET Core-App und kann keine Lösung für die Anzeige von SSRS-Berichten finden. Mit den Abwesenheiten von "Microsoft.Reporting.WebForm" funktioniert nicht mehr. Was ist die beste Vorgehensweise zum Anzeigen von SSRS-Berichten im Web in ASP.NET Core?

External

Hilfreichster Kommentar

Fast 2 Jahren. Core 2.0 wird veröffentlicht. SSRS-Team, wach auf.

Alle 269 Kommentare

Da Core immer noch in RC (RTM bis Ende des Monats) ist, denke ich nicht, dass ein SSRS-Szenario innerhalb der nächsten 6 Monate geplant ist, aber ich bin nicht Teil des Teams.

Ich würde diese Berichte entweder auf der Clientseite mithilfe einiger Javascript-Bibliotheken generieren oder diese Berichte vorab generieren.

Wenn Sie etwas "Integrierteres" benötigen, können Sie sich dieses Community-Paket ansehen:

https://github.com/ilich/MvcReportViewer

Nach dem Aussehen des Problems https://github.com/ilich/MvcReportViewer/issues/121 sind sie an einer Integration interessiert, aber bisher ohne Erfolg.

Ich verstehe nicht, warum die Kerninitiativen von dotnet und ASP.net zu allen früheren Ankündigungen zu diesem Thema schweigen. Es ist wie
[Die Berichterstellung ist für Entwickler kein großes Problem und sie können sie mithilfe von HTML- und Print-CSS-Klassen verarbeiten.]
Derzeit migrieren wir einen kleinen ERP mit vielen ssrs rdlc-Dateien, und der CSS-Ansatz ist bei der browserübergreifenden Berichterstellung nicht hilfreich.
Auf der anderen Seite hat Microsoft in der vergangenen Woche ssrs 2016 mit einem reinen HTML5-Viewer veröffentlicht, der die Notwendigkeit einer ActiveX-Installation beseitigt hat [was der einzige Nachteil bei der Verwendung von ssrs in Nicht-IE-Browsern war].
Der ssrs 2016-Viewer passt perfekt in das asp.net-Kern-Ökosystem
Es wurde jedoch keine offizielle Erklärung zur Unterstützung des asp.net-Kerns abgegeben.

Ist alles durch System.Drawing blockiert? weil selbst itextsharp bis jetzt keine Bibliothek veröffentlicht hatte.
Wenn es sich um System.Drawing handelt, kann mindestens die Windows-Implementierung vor [Linux und OSX] abgeschlossen werden, um die Akzeptanz für aktuelle Windows-Entwickler zu erhöhen, anstatt auf die vollständige plattformübergreifende Implementierung von System.Drawing zu warten

Ich hoffe, dass dieser Beitrag das Team dazu bringt, einige Prioritäten zu überdenken, um ssrs innerhalb des asp.net-Kerns zu aktivieren

Mit Respekt für MvcReportViewer, der im vorherigen Beitrag erwähnt wurde (es ist ein Wrapper um Webforms Viewer) und es hat vielen MVC-Entwicklern in der Vergangenheit geholfen, den Mangel an MVC Report Viewer in MVC1 bis MVC5 zu überwinden [Vielen Dank ilich], hoffe ich zu sehen Eine vollständige Lösung, da ssrs keine erstklassige Priorität hatte und die Leute in Pre-Core-MVC ziemlich darüber nachdachten.

Bitte Entwickler,
Leiten Sie dieses Problem an Ihre Kollegen weiter, um es zu kommentieren.
Dies könnte eine Priorität geben und das Team motivieren, etwas zu tun.

@ ddddddddeee22211 Es ist eine V1.

Sie werden zunächst nicht mit SSRS-Unterstützung ausgeliefert. Die Unterstützung mit SSRS würde wahrscheinlich vom SSRS-Team und nicht vom .NET-Team kommen. Da wir noch nicht einmal aus RC sind, sehe ich dies in V1 nicht als kritisches Feature.

Wenn Sie Berichte erstellen müssen, kann ich empfehlen, nur die Webforms-Version auszuführen? Ja. Es ist alt. Aber zumindest funktioniert es und es wird unterstützt.

Wenn Sie X-Plat-Berichte benötigen, empfehle ich etwas wie Chartist . Sie können damit Diagramme direkt auf dem Client erstellen. Fügen Sie eine CSS-Datei zum Drucken hinzu und boomen Sie. Sie haben Berichte, die gedruckt werden können.

Aus Ihrer Sicht ist dies möglicherweise nicht kritisch
Einige andere Entwickler halten dies jedoch für sehr wichtig für ihre Projekte, da Entwicklungsaufgaben, sobald sie eine App entwickelt und live geschaltet haben, angehalten werden und Berichtsaufgaben zu täglichen Routineaufgaben werden. Einige Projekte übernehmen auch die Erstellung von Berichten an das BI-Team (Business Intelligence), das weiß, wie man ssrs verwendet, aber keine Ahnung von asp.net core hat.

Das Ziel meines Beitrags war es, die Position von ssrs innerhalb des asp.net-Kernökosystems zu verstehen. oder ob es wie in mvc1 bis mvc5 ignoriert wird. Das ssrs-Team befindet sich in Microsoft und das asp.net-Kernteam kann das Problem mit ihnen besprechen.
Was mich verrückt gemacht hat, war, als ich letzte Woche den Release Note von ssrs 2016 gesehen habe, ohne etwas über asp.net core zu erwähnen. Auf der anderen Seite sehen Sie eine kontinuierliche Unterstützung für Azure innerhalb des asp.net-Kerns. Glauben Sie mir, wenn wir keine Nachfrage nach ssrs haben, wird dies wie im vorherigen mvc 5 ignoriert.

Ihr Rat zur Verwendung von Webformularen ist ein Beispiel für die Verlangsamung der Annahme von Kerninitiativen. Wenn ich zumindest eine Aussage darüber hätte, ob diese unterstützt wird oder nicht, kann ich strategische Entscheidungen darüber treffen.

Danke für den Chatist-Tipp. Ich werde es überprüfen und ich hoffe, Sie haben meinen Standpunkt verstanden.

@ ddddddddeee22211 Ahhh ... dann kann ich nicht antworten.

Derzeit ist die einzige Möglichkeit, SSRS-Komponenten unter ASP.NET zum Laufen zu bringen, WebForms.

Wenn Sie ihre strategische Position wünschen oder sie unterstützen werden, müssen wir warten, bis ein MS-Mitarbeiter antwortet.

Vielleicht können wir / cc @coolcsh ? Er könnte hier nicht antworten, aber ein Blog-Beitrag, der die Position klarstellt, wäre nett.

Im SSRS-Team sind wir uns der Einschränkungen der ASP.NET-WebForms bewusst und untersuchen und arbeiten aktiv an neuen Optionen für das Report Viewer-Steuerelement
Vielen Dank

@jtarquino

Danke für die Antwort Mann!

Wir wollten seit MVC eine Alternative. : stick_out_tongue_winking_eye:

Das hat mir gerade den Tag gemacht. [~ Happy End ~]
Vielen Dank an @jtarquino , @MaximRouiller für alle Bemühungen.

@jtarquino
Das klingt gut :-)

Können Sie etwas darüber sagen, wann Sie die erste Version der "neuen Option" für Report Viewer Control veröffentlichen möchten?
(Gibt es dafür eine Roadmap / einen Plan?)

Br.
Boe

Leider habe ich momentan keine Zeitleiste zum Teilen

Haben Sie versucht, eine Bibliothek zu verwenden, indem Sie ein Paket in der Package Manager-Konsole installiert haben, und geben Sie den folgenden Befehl in das Befehlsfenster ein.

PM> Install-Package ReportViewerForMvc
obwohl ich Webformulare ausprobiert habe und sie ziemlich gut aussehen.

untitled

@ Bethwellagat
erneut Feuerfehler "
Anmerkungen:
Arbeiten am ASP.NET Core-Projekt

@jtarquino ping darauf. Offenbar gibt es mehr Interesse: https://github.com/aspnet/Mvc/issues/5332

@jtarquino Übrigens, wenn Sie einige Diskussionen mit meinem Team beginnen möchten,

Ohhh ich mag! Der Ball rollt! 😀

Hallo allerseits, ich habe gerade einen benutzerdefinierten Port des Report Viewer-Steuerelements mit der in SSRS integrierten ReportExecutionService.asmx geschrieben und auf ASP.NET MVC abgezielt. Ich hatte jemanden vorgeschlagen, es auf .NetCore & MVC zu portieren, also habe ich das abgeschlossen. Probieren Sie es aus und lassen Sie mich wissen, was Sie denken: https://github.com/alanjuden/MvcReportViewer

Alan

Es sieht so aus, als ob es ungefähr drei Monate her ist, seit ReportViewer in ASP Netcore MVC hier besprochen wurde. Ich arbeite mit der Version, die Alan Juden in einem Projekt bereitgestellt hat, das ich von WinForms zu Netcore wechsle. Gibt es Anzeichen dafür, dass Microsoft erstklassigen SSRS ReportViewer-Support bietet, oder haben sie SSRS in denselben Schrank gestellt, in den sie Visual FoxPro vor einigen Jahren gestellt haben?

Irgendwelche Fortschritte MS? Die beste Option für den Moment ist die Verwendung eines Drittanbieter-Tools wie Telerik Reports für das Rendern von Browsern und des SSRS-Backends für Berichtsabonnements. Vielleicht hat SSRS 2016, wie ddddddddeee22211 schrieb, bereits Funktionen über die HTML5-Rendering-Engine, aber es gibt keine Dokumentation?

Hey @Eilon.

Neuigkeiten seit September? Vor allem, seit ihr jetzt 1.0 gestartet habt (Glückwunsch!), Muss der Druck etwas nachlassen.

Kannst du etwas teilen?

/ cc @jtarquino

Noch nichts, was ich teilen kann. Sobald ich Neuigkeiten für .NET Core habe, werden Sie der Erste sein, der davon erfährt.
Wie Sie bereits erwähnt haben, haben wir gerade das neueste Nuget für das ASP.NET Webforms- und Winforms-Steuerelement veröffentlicht

Ich möchte meine Eingabeaufforderung auch dem Team hinzufügen ... Dies ist ein großes Problem. Ich schätze die Lösung von AlanJuden, aber wir brauchen eine "offizielle" Lösung ... Angesichts der Tatsache, dass Core 1 seit Monaten nicht mehr verfügbar ist, wäre es hilfreich, etwas über den Status dieser Lösung zu sagen. Wenn Sie uns auf der Zeitachse eine Lösung nennen könnten, wäre das etwas. Dieses Problem ist groß genug, um die Verwendung von MVC Core zu verhindern. Eine Note. Wir brauchen wirklich eine Lösung, die die Notwendigkeit umgeht, dass sich die Benutzer beim ssrs-Server anmelden müssen. Aus diesem Grund muss mein Projekt den aktuellen Reportviewer verwenden (mit dem Reportviewer muss das mvc-Projekt allen Benutzern eine Standardanmeldung beim ssrs-Server bereitstellen).

SQL Server 2017 ist jetzt Community Preview2
Und
Die Version 2.0 von .net ist mit der neuesten Ankündigung abgeschlossen
Und immer noch kein Wort über den nativen asp.net Core Reporting Service Viewer
Bitte laden Sie andere Entwickler zu dieser Ausgabe ein, um Feedback zu geben und das Team auf die Notwendigkeit einer solchen Anstrengung für ein Meisterwerk-Framework aufmerksam zu machen, von dem jeder Entwickler träumt.

@jtarquino :
Wie können Benutzer das SSRS-Team kontaktieren?

Vielen Dank, ich würde gerne Hilfe bekommen, damit meine neue App mit SSRS funktioniert.
Gibt es eine Möglichkeit, den vom Webformular-Steuerelement verwendeten Code für eine Aspx-Seite abzurufen?
Ich würde gerne sehen, ob ich eine eckige 2-Ansicht erstellen kann, die wie das Webformular-Steuerelement funktioniert und aussieht.

Hallo,

Wir möchten einige unserer Websites usw. auf asp.net core migrieren, einige enthalten jedoch ein SSRS Report Viewer Control. Gibt es Fortschritte bei der Steuerung der Berichtsanzeige für den .net-Kern?

Vielen Dank
Tim

Wenn Sie auf Full .NET 4.x und nicht auf .NET Core abzielen, berücksichtigen Sie bitte diese Nummer 2022, bevor Sie zu ASP.NET Core wechseln.
ASP.NET Core 2 unterstützt Full .NET 4.x nicht

@ikourfaln. Eher ein strittiger Punkt in dieser Phase, da im asp.net-Kern kein Reportviewer zu brechen ist. Angesichts der bevorstehenden Änderungen in Q3 in asp.net Core 2 sowie in .net Standard 2 mit den Kompatibilitäts-Shims, die das Targeting des .net-Frameworks ermöglichen, halte ich es für sehr unwahrscheinlich, dass Microsoft einen Reportviewer für den aktuellen asp.net-Core schreibt 1.1.

Derzeit habe ich versucht, in die Auth-Erweiterungen für SSRS zu gelangen, und festgestellt, dass es ein echtes Durcheinander ist, zu versuchen und zu ändern. Sie können eine neue Authentifizierung / Anmeldung vornehmen, aber wenn Sie versuchen, CORS zu aktivieren, damit eine Web-App SSRS aufrufen kann Um einen Bericht auszuführen, kann der Browser keine OPTIONS-Preflight-Anforderung zum Laufen bringen, und damit ist die ganze Idee beendet.

Jetzt erstelle ich eine Webformular-Web-App, zu der ich OpenId Connect-Unterstützung hinzufüge, damit SSO zwischen meiner glänzenden neuen eckigen App und meinen Berichten funktioniert

dann werde ich sehen, ob ich sie irgendwie mit iframes hackery oder anderen Mitteln zusammenbringen kann.

Ich wünschte, Microsoft würde ssrs aktualisieren, um besser mit neuer Web-Technologie zu spielen.

Ein anderer Gedankengang: SSRS-KPI- und Mobile-Berichte: Gibt es eine Möglichkeit, sie in einer Web-App zu verwenden?

@alanjuden Gibt es eine Möglichkeit, Ihr Paket so zu konfigurieren, dass das Rendern von rdlc-Berichten aktiviert wird? Die Installation und Verwaltung von Reporting Server für jeden Client ist ein echtes Problem.

@IonRobu , ich mag verrückt sein ... aber ich bin nicht so verrückt! : P.

Der wahre Grund, warum ich das nicht tun werde, ist, dass ich nur den Front-End-Viewer zum Report-Viewer gemacht habe. Ich verlasse mich vollständig auf SSRS, um den Bericht zu rendern und mir die Berichtsdaten über die SSRS-API zurückzugeben. Daher muss das Berichtsserver-Backend vorhanden sein. Entschuldigung, aber das wäre viel mehr Arbeit als ich für dieses Projekt vorhabe. Ich habe meinen MvcReportViewer als einfache Lösung erstellt, um die Probleme beim Einspielen der ASP.NET WebForms-Version des Steuerelements zu umgehen.

Berichtsserver oder RDLC, der als "Clientberichte" bezeichnet wird
Berichtsserver ist mehr Arbeit zum Einrichten und Verwalten von Ja, das ist wahr.
aber es hat eine Reihe von Vorteilen:

Berichte werden auf einem Back-End-Server gerendert, wodurch die Arbeit der Front-End-Webserver entlastet wird.
Die Ergebnisse eines Berichts können eingelöst werden, was die Arbeitslast Ihres SQL-Servers für Produktionen verringern kann.
Komplexe Berichte können nach einem Zeitplan ausgeführt werden und zu einem Zeitpunkt ausgeführt werden, an dem sich nur wenige Benutzer im System befinden
Anforderungen können dann aus diesem vorkompilierten Snapshot bedient werden.
Bei Verwendung von SSRS bleiben die SQL Server-Verbindungszeichenfolgen auf dem Berichtsserver und müssen nicht in der Webserver-Konfigurationsdatei verwaltet werden
Außerdem wird der SSRS-Server zu einem zentralen Punkt, auf dem Berichtsautoren veröffentlichen können, und alle Benutzer können die Berichte vom Server abrufen.
SSRS kann das automatische Versenden von Berichten per E-Mail an Benutzer einrichten. Sie können für einige Benutzer einen Link zum Berichtsserver und für andere eine PDF-, Word- oder Excel-Datei per E-Mail senden.

Wenn Sie mehr Benutzer bedienen müssen, müssen Sie möglicherweise mehr Webserver hinzufügen, bevor Sie mehr Berichtsserver benötigen. Sie müssen dann keine große Anzahl von rdlc-Dateien auf alle Webserver kopieren.

Also ja, wenn Sie nur ein paar Berichte haben und keinen der Vorteile benötigen, die Sie mit rdlc nutzen können.
Für ein größeres System, das viele Berichte für viele Benutzer bereitstellen muss, bietet der SSRS-Server einige wirklich gute Vorteile.
Da die SSRS-API sehr leistungsfähig ist, können Sie die API auch aufrufen, um ein Berichts-PDF zurückzugeben, ohne dass clientseitige Webformulare oder MVC-Viewer-Steuerelemente erforderlich sind.
Die API kann die Berichte auch verwalten, auf den Server hochladen, Berechtigungen festlegen und die Berichte auflisten.
Bei der Arbeit verwende ich die API, damit unsere Client-App die Berichte auflisten kann, die der Benutzer ausführen kann, um die Parameter zu überprüfen, die der Bericht benötigt, und dann den Bericht für den Benutzer auszuführen.

Schauen Sie sich also die Vorteile an, nicht nur den Verwaltungsaufwand.

@figuerres
Kundenberichte zeichnen sich durch einen anderen Kontext aus als den von Ihnen beschriebenen
Viele Clients verwenden keinen Berichtsserver und verfügen nicht über qualifiziertes Personal, um die Probleme zu verwalten und zu warten
Wenn Sie ein Produkt mit benutzerdefinierten Berichten (60+) für jeden Client ausliefern, entsteht ein Aufwand für die Bereitstellung von Anwendungen und die Bereitstellung von Berichten
Viele Benutzer sind keine Technikfreaks, die vom Server generierte und gemäß Antwort gerenderte Berichte verstehen können, ohne sie zuvor in der Vorschau anzuzeigen (die Rechnung kann beispielsweise einfach über den Viewer überprüft werden, als wenn mehrere korrigierte Rechnungen auf verschiedene Registerkarten heruntergeladen werden).

Wie Sie sehen, ist es für Benutzer einfacher, sich an einfache Berichtsanzeige anzupassen als an komplexe Szenarien
Auch entwickelt hat unzählige Anstrengungen unternommen, um Kundenberichte zu entwickeln, und jetzt werden sie in ihrer tatsächlichen Verwendung unbrauchbar

Ich hoffe, das Microsoft-Team versteht unseren Schmerz

Ich bin mir nicht ganz sicher, ob ich alles verstehe, was Sie gesagt haben, aber ja, Kundenberichte sind nützlich. Ich habe nur Gründe für den Server dargelegt, warum es sich lohnen könnte, einen Blick darauf zu werfen. Ihr Kilometerstand kann variieren und das alles.

Heute wird Net Standards 2 mit mehr API-Oberfläche für system.drawing veröffentlicht
Könnte dies eine Chance für ein Wort des srss-Teams über ssrs viewer für asp.net core sein?

Mein Unternehmen ist stark auf RDLC-Berichte angewiesen, die Dokumente im PDF-Format exportieren. Wenn wir dies im .net-Kern nicht tun können, ist dies für uns im Grunde ein Blocker, wenn wir den .net-Kern verwenden und auf anderen Plattformen wie Docker laufen.

Ich hoffe, dass jeder Programmierer seine Kollegen ermutigt, dieses Problem hier zu kommentieren

Für diejenigen, die noch nach einer Lösung suchen:
Wenn Java installiert ist, können Sie alternativ Eclipse BIRT oder JasperReports einbetten.
Von beiden ist JasperReports definitiv die beste SSRS-Alternative (etwas komplizierter, aber auch viel leistungsfähiger / pixelgenauer).
Es verfügt über einen eigenständigen und einbettbaren Berichtsserver, der auf jede JDBC-Datenquelle zugreifen kann, sowie über BigData wie Cassandra oder Apache Spark (SparkSQL).

Es bietet Berichte und Analysen, die in ein Web oder eine mobile Anwendung eingebettet werden können und als zentraler Informationsknotenpunkt für das Unternehmen fungieren, indem geschäftskritische Informationen in Echtzeit oder nach Zeitplan an den Browser, das mobile Gerät oder den E-Mail-Posteingang übermittelt werden in einer Vielzahl von Dateiformaten.

Sie können eine eigenständige Bereitstellung der Java-Laufzeit durchführen, indem Sie BIRT / Jasper über Launch4j bereitstellen.

@jtarquino gute Nachrichten für .Net Core?

Ich kann nicht glauben, dass dies etwa 15 Monate nach seiner Erörterung immer noch ein Problem ist. Sehr enttäuscht.

Wir brauchen das wirklich, um zu funktionieren, sogar einen einfachen Punkt bei SSRS, ReportName und Params, der in DIV oder so geöffnet ist. Wir haben viel Zeit in die direkte Erstellung von SSRS-Berichten in SQL investiert, und ich brauche eine Möglichkeit, sie in einer einfachen Core2.0 MVC-Anwendung anzuzeigen.

Irgendwelche Tipps?

@cgountanis , das funktioniert bei mir:
https://github.com/aspnet/Home/issues/1528#issuecomment -259169426

@cgountanis
Benötigen Sie ein PDF des Berichts oder vollständige interaktive Berichte, wie das Webportal zeigt?

Ich kann Ihnen einige Starter geben, wie ich sie aus einer eckigen App mache

Das mache ich. Verwendet die Anmeldeinformationen des Clients, die für die meisten möglicherweise nicht funktionieren.
Das Ändern der Größe der Seite funktioniert, wodurch sie nicht kleiner wird.


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

Eine Sache ist, die Berichtsserver-Webdienste zu verwenden. Von diesen können Sie Listen der Berichte und Ordner und Datenquellen usw. abrufen und diese Daten verwenden, um Ihre eigenen Portal- / Berichtsmenüs zu erstellen und zu verwalten, in welchen Berichten die Benutzer sehen können Ihre App.
Wir haben eine Reihe von Windows-Benutzern auf dem Berichtsserver erstellt und sie verwendet, um zu begrenzen, welche Berichte sie erhalten.
Die Rolle der Anwendungsbenutzer wurde einem Berichtsserverbenutzer zugeordnet.

Wenn wir einen Bericht ausführen, übergeben wir den Berichtsserverbenutzer als den Benutzer, der den Bericht ausführt. Das ist zum Kotzen, da wir den "echten Benutzer" verlieren, es sei denn, wir protokollieren dies in unserem Code.
Dies betrifft jedoch die Abhängigkeit des Berichtsservers von Windows-Benutzerkonten. Wenn sie es aktualisieren würden, um ein JWT-Token zu verwenden und Rollen vom Token zu erhalten, wären die Dinge für uns besser.

Wir verwenden einen Iframe, um das Webformular-Steuerelement in eine eckige App-Ansicht zu integrieren. Auch nicht das Beste, aber es funktioniert.
Der Benutzer kann die von uns durchgeführten Hacks hinter den Kulissen nicht wirklich sehen.

@ ctrl-brk Ich habe dieses Problem mit Core 2.0, vielleicht habe ich etwas verpasst. https://github.com/alanjuden/MvcReportViewer/issues/43

@steelwil Danke, aber ich brauche benutzerdefinierte NetworkCredential.

@figuerres Wir zeigen Berichte von einem SSRS mit Firewall an. Die WebForm-Anwendung hat die ganze harte Arbeit mit dem SSRS.ReportViewer geleistet und konnte nicht nur Windows-Benutzer. Einverstanden JWT wäre aber nett. Beispiele wären cool und würden versuchen, die ReportViewer-Funktionalität, die wir mit WebForms / NUGET hatten, abzugleichen.

Vielen Dank an alle!

Irgendwann werden sie ein offizielles NUGET für dieses Recht veröffentlichen?

@cgountanis Das "sie" ist das SQL Server-Team, nicht das ASP.NET Core-Team. Darin liegt das Problem. Es ist ein anderes Team.

@giddev Die eigentliche Frage hier ist, ob dieses andere Team, auf das Sie sich beziehen, tatsächlich noch bei Microsoft existiert und aktive Entwickler hat, die noch im Team arbeiten, und ob sie genug Stolz auf ihre Arbeit haben, um eine erstklassige Lösung für die Einbettung von SSRS zu erstellen und zu veröffentlichen Berichte in eine ASP.Net Core 1- oder 2-Webanwendung. Haben sie eine veröffentlichte Roadmap? Ist ASP.Net Core Teil des Plans oder wurde SSRS aufgegeben und durch POWER BI ersetzt? Ich sehe allmählich Anzeichen dafür, dass SSRS auf dasselbe Rattenloch zusteuert, in das Microsoft Visual FoxPro geraten ist.

@wqwalter so etwas .....
Ich habe den Eindruck, dass Microsoft viele Teams hat, die jeweils ihrer eigenen Karte folgen, und nicht viele Leute, die sicherstellen, dass sie ein gemeinsames Ergebnis und eine gemeinsame Kommunikation zwischen ihnen haben.
Es ist wie Katzen hüten, sie heben alle in verschiedene Richtungen ab ...

wenn das falsch ist - nun, es scheint so.

Es fällt mir schwer zu glauben, dass sie SSRS aufgeben würden, da es von Entwicklern stark genutzt wird, da Crystal Reports unbeliebt ist.

@cgountanis
So sehr ich einige Dinge von Microsoft mag, habe ich eine 20-jährige Geschichte gesehen, in der sie wiederholt Produkte anhielten und Dinge taten, die meinem Verständnis widersprachen. Ein Beispiel war Virtual PC, von Microsoft erworben, eine Zeit lang von Microsoft verkauft, dann kostenlos gemacht und dann getötet.
das ist nur einer von vielen solchen Fällen ....

Ich hörte Gespräche über Power BI und einige Gerüchte, dass es das neue SSRS in der Zeit sein könnte.
Ich bin mir nicht sicher, ob das sicher ist oder nur Klatsch. Es würde dem Modell folgen, Azure-basierte Dienste zu pushen.

Ich freue mich, dass SSRS die webbasierte Authentifizierung - vorzugsweise OpenID Connect - sofort unterstützt. Ein Schritt weiter - es wäre fantastisch, wenn SSRS ein Nuget für ASP.NET Core wäre. Berichtsplanung und Benutzerverwaltung - stellen Sie möglicherweise ein Beispielprojekt bereit, aber ich würde diesen Teil in Ordnung bringen, wenn die Dokumentation zur SSRS-API vorhanden ist.

@ Morgma
einverstanden!
OIDC würde perfekt zu dem passen, was ich tue.
Die Rollen müssen ausgeführt werden, damit wir unseren Anwendungsrollen eine Zuordnung für Berichtsserverrollen bereitstellen können.

Im Moment habe ich eine App, die OIDC mit einem Angular 4/5-Frontend verwendet, das eine Webformular-Berichtsseite in einen iFrame laden muss und Windows-Benutzerkonten verwenden muss, um die Berechtigungen zu steuern. Wenn ich also die Berichtsserver-Datenbank abfrage, kann ich Ich sehe nicht, welche Benutzer die Berichte ausführen. Es ist eine Kluge, die wir benutzen können, aber alles andere als ideal.

Dies ist auch für uns ein großes Problem, und ich kann wirklich nicht glauben, dass wir noch nichts von Microsoft dazu gehört haben. Dies führt dazu, dass wir an dieser Stelle ernsthaft über Nicht-Microsoft-Optionen nachdenken. Wenn wir zumindest einen Zeitplan hätten, könnten wir eine fundierte Entscheidung treffen.

Ich bin damit einverstanden, dass ich den ReportServer / ReportExecution2005.asmx direkt verwendet habe, um den Export direkt zum Laufen zu bringen. Funktioniert dann hervorragend, wenn es unter IIS gehostet wird und seltsame Fehler auftreten.

Es war frustrierend.

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

Dieser Fehler besagt, dass der Header für die Autorisierung fehlt. Die http-Anforderung muss den Header enthalten. Ist nur der eine Anruf ein Problem?

Funktioniert einwandfrei, bis es unter IIS gehostet wird. Sogar meine Entwicklungsmaschine spricht mit demselben Berichtsserver und funktioniert, aber sobald sie mit IIs veröffentlicht und gehostet wird, wird dieser Fehler angezeigt. Denken Sie, es heißt, der Server antwortet mit einem leeren Fehler, aber ich sende ihm alles.

Denken Sie daran, dass IIS Express unter Ihren Benutzeranmeldeinformationen ausgeführt wird, sodass der Double Hop wahrscheinlich in Ordnung ist. Was wahrscheinlich passiert, ist, dass auf Ihrem IIS-Server kein Kerberos eingerichtet ist. Selbst wenn die Delegierung aktiviert ist, funktioniert Ihr Bericht nicht, da der Bericht anonym ausgeführt wird.

Kurze Antwort: Sie können die Delegierung nicht verwenden, ohne Kerberos eingerichtet zu haben. Dies erfordert Einstellungen auf Ihrem Domänencontroller für das Konto, unter dem der IIS-App-Pool ausgeführt wird.

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

Ich weiß, dass dies nicht der richtige Ort ist, aber ich wollte nachgehen. Beim Hosten von Core auf IIS ist es egal, auf was Sie die IIS-Einstellungen einstellen. Nur für S & G habe ich den AppPool-Benutzer Administrator gemacht und es hat funktioniert. Go figure ... Hier sind keine anderen Einstellungen für die IIS-Authentifizierung als Anonym aktiviert. Erklärt das jemand? Muss es auf eine Bibliothek für WCF on Core zugreifen, für die es einen speziellen Zugriff benötigt? Was gibt? Ich bin verwirrt ... und mache mir Sorgen um die Sicherheit.

@cgountanis können Sie mit Ihrer Frage eine neue Ausgabe eröffnen?

@jtarquino Haben Sie Updates für die Zeitleiste bei der Veröffentlichung eines .net-Core-basierten Berichts-Viewers? Ich bin verzweifelt, wenigstens eine Zeitleiste zu bekommen. Sprechen wir 6 Monate? 12 Monate? Grundsätzlich stehen wir vor der Entscheidung, alle unsere aktuellen SSRS-Berichte aufzugeben und eine andere Lösung zu wählen, da wir keine Alternative und keinen Zeitplan für die Verfügbarkeit haben.

@ExcaliburVT Es ist in unserem Backlog, aber ich habe keine Zeitleiste, die ich im Moment bereitstellen kann.

@jtarquino Open Source ist nett und alles andere als gleichzeitig muss Microsoft gegenüber den Kunden verantwortlich sein, Kunden zahlen für Produkte, Kunden müssen Produkte

Dies ist der Bereich, in dem die Migration von Microsoft nicht so groß ist. Wenn wir als Kunden nicht die richtigen Antworten bekommen können, wie lange werden wir dann noch zurückkommen?

Das Gleiche passiert in mehreren Produkten, nicht nur in diesem. Warum sollte ich meinen Managern raten, die nächste Version von SQL Server und SSRS zu lizenzieren, wenn wir nicht die Updates erhalten, die wir zum Ausführen des Geschäfts benötigen?

@jtarquino Ich habe mit @figuerres zustimmen , da ich buchstäblich nur einen 3 - monatige Kampf getan hätte kämpfen Genehmigung zu verwenden SQL über Oracle zu bekommen und kommt eine meiner wichtigsten Verkaufsargumente , um herauszufinden , ist nicht nativ unterstützt. Ich habe Oracle verprügelt, weil kein .Net Core-Treiber verfügbar war und sie zumindest ein angekündigtes Veröffentlichungsdatum hatten. SSRS ist Ihr eigenes Produkt und Sie sind zwei Generationen hinterher, ohne auch nur einen vorgeschlagenen Termin für die Lösung.

Mit dem neuen VS2017 WCF-Connector-Dienst (Core 2) können Sie die Berichte mit Parametern in PDF, Word, Excel, CSV ... exportieren, wenn Sie Hilfe benötigen, bevor dieses Viewer-NUGET-Paket veröffentlicht wird. Ja, Sie müssen den ReportExecution2005.asmx verwenden, der mit SSRS geliefert wird, aber auch alles, was sie erstellen. Wir haben uns gerade entschlossen, den Viewer-Aspekt vorerst zu löschen und direkte Dateidownloads durchzuführen.

Bearbeiten: Das einzige Problem besteht darin, die zuvor erwähnten AppPool-Berechtigungen in den Griff zu bekommen.

Übrigens bekomme ich Berichte als PDF von einer Web-API und verwende keine Wcf-Bits.
nur Seife / Asmx-Anrufe und http-Anrufe.
Dabei übergebe ich Credentails ohne Probleme.
Mein Code ist asp.net 4.6 / web api 2
Wenn du sehen willst, was ich mache, kann ich nächste Woche Code auf einen Github setzen, damit du ihn auschecken kannst.
Ich rufe Report Server 2016 an, aber das meiste, was ich tue, funktioniert mit den älteren ssrs-Versionen.

Gibt es etwas Neues für Core 2 mit SSRS (RDLC Designer)?

@figuerres Wenn Sie einen Code in der Github-Anfrage eingegeben haben, teilen Sie den Link bitte mit.

@apondu
wird nächste Woche posten, bis dahin nicht im Amt. Bisher hat niemand nach Code gefragt.

Ich arbeite an einer Intranetanwendung Angular5 / .NetCore2 MVC5 (aktueller RC-Stack von MS), wir verwenden SSRS 2012 und müssen zeitbasierte Berichtsabonnements für Benutzer erstellen, die nicht das angemeldete Windows-Konto sind.

@figuerres Vielleicht hast du ein paar Ideen?

Sie können SSRS und den integrierten Berichterstellungsdienst verwenden, um den ganzen Tag über PDFs auszuspucken.

@cgountanis Vielen Dank für die schnelle Antwort. Sie haben mir dabei geholfen zu erkennen, dass ich nicht beschreibend / genau genug war, um zu beschreiben, was ich tun muss. Ich habe meinen ursprünglichen Kommentar mit "Zeitbasierte Berichtsabonnements erstellen" aktualisiert.

Hmm, ich habe so etwas getan, indem ich Abonnementzeitplanzeilen direkt in die Berichtsdatenbank eingefügt habe (erraten, wie der Abonnementdienst basierend auf der Tabelle und den vorhandenen Zeilen funktioniert hat).

@ExcaliburVT Ich habe bisher die SOAP-API und einen großen SP verwendet, um mit der ändern . Ich bin froh zu wissen, dass es eine Fallback-Option gibt.

Was meinst du mit zeitbasiert?

Müssen Sie zu einem bestimmten Zeitpunkt einen Bericht erstellen?
Müssen Sie einen Bericht ausführen, wenn ein Benutzer etwas tut?

@figuerres zeitbasiert, dh nach einem wiederkehrenden Zeitplan wie jeden Mittwoch um 8 Uhr.

Ja, ich konnte keinen Weg finden, dies zu tun, ohne einen Datensatz manuell zumindest in SQL 2012 einzufügen. Wenn ich mich recht erinnere, müssen Sie weder das Schema noch irgendetwas ändern, sondern nur eine Zeile in die Abonnementtabelle einfügen, und ich konnte um auf diese Weise einen Bericht an eine Verteilergruppe zu senden.

OK, dann kann das Berichtsserverportal einen Bericht über einen geplanten Zeitplan ausführen, ihn in einer Datei speichern oder in diesem Fall eine E-Mail senden.
Sie müssen niemanden angemeldet haben, wenn es ausgeführt wird.

Sie erstellen einfach das Abonnement über das Portal.

Sie können dies auch über die Seifen-API tun, aber ich bin mir nicht sicher, welche API-Anrufe genau getätigt werden sollen.

Gestatten Sie mir, mehr Kontext zu geben, bevor ich über das spreche, was ich von der soapAPI gesehen habe.

Ich schreibe eine Webanwendung, die die SSRS-Seifen-API und Anmeldeinformationen wie "ssrsReportWebAdmin" verwendet. In der aktuellen Entwicklung hat "ssrsReportWebAdmin" alle Sicherheitsrollen, aber basierend auf der Dokumentation scheint die Content Manager-Rolle diejenige zu sein, die benötigt wird. Ein Benutzer verwendet die Webanwendung, um Abonnements für andere Personen zu erstellen und diese Anforderungen über die soapAPI zu senden.

Der Aufruf von CreateSubscriptionAsync gibt einen Fehler zurück, der besagt, dass der Benutzer keine Berechtigungen hat.

Wenn Sie also die API aufrufen, übergeben Sie ein Cred-Objekt für den Benutzer "ssrsReportWebAdmin", das alle Rollen hat, aber eine Fehlermeldung erhält, dass es keine Berechtigung hat? interessant....

Nach dem, was ich gelesen habe, ist SSRS so eingerichtet, dass die einzige Person, die Standardabonnements (wiederkehrende, zeitbasierte Abonnements) erstellen kann, der Benutzer selbst ist. Datengesteuerte Abonnements können über die Content Manager-Rolle eingerichtet werden.

Siehe ContentManagerTasks - Alle Abonnements verwalten
https://technet.microsoft.com/en-us/library/ms159693 (v = sql.105) .aspx

Der erste Satz unter der Überschrift beginnt mit "Reporting Services unterstützt zwei Arten von ..."
https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/subscriptions-and-delivery-reporting-services#bkmk_standard_and_datadriven

@figuerres @ExcaliburVT
Ich konnte Standardabonnements für E-Mail und Dateifreigaben mithilfe eines AD-Kontos mit der SSRS-Rolle des Content Managers erstellen. Soweit ich sehen kann, war das Berechtigungsproblem, auf das ich am Freitag gestoßen bin, ein Nebeneffekt eines leeren / fehlerhaften MatchData-Parameters.

Fast 2 Jahren. Core 2.0 wird veröffentlicht. SSRS-Team, wach auf.

@ codehippie1 sei nicht so unhöflich. Wir sind alle Menschen hier. erwachsen werden!

Es war nur ein Witz in der Entwicklerhöhle. Keine Straftaten bedeuteten überhaupt. Abgesehen von Witzen hat ReportViewerForMVC 72.799 Downloads ab Anfang 2014 (https://www.nuget.org/packages/ReportViewerForMvc). Das SSRS-Team ignoriert ASP.NET MVC seit vielen Jahren und ignoriert nun ASP.NET Core seit 2 Jahren. 72.799 Mal davon zu sprechen, unhöflich zu sein, ist eine Menge.

Ich würde mich mit einem netten Export in eine offiziell unterstützte PDF-Bibliothek zufrieden geben, da der Betrachter heutzutage keine reaktionsschnellen Anforderungen mehr hat.

@cgountanis : Generieren Sie eine HTML-Vorlage (korrektes Papierformat - nur HTML, Bilder als base64, Inline-Stile). Füllen Sie die Platzhalter aus und vergessen Sie nicht, die HTML-Codierung auf utf8 zu setzen. Text an StandardInput von wkhtmltopdf senden - Ausgabe von StandardOutput von wkhtmltopdf abrufen. Und dann haben Sie etwas viel Besseres als SSRS.

@cgountanis Ich habe über einen solchen Ansatz nachgedacht, aber es ist nicht einfach, einen pixelgenauen Bericht mit Seitenkopf- / -fußzeilen und Zeilenumbrüchen an logischen Stellen zu erstellen.

Für alle, die meinen Schmerz teilen, keinen lokalen MS RDLC-Berichts-Viewer auf dem Aspnet-Kern zu haben; Ich habe einen alternativen Ansatz mit Hilfe von pdfJs und ViewerJs aus Mozilla - pdfJs Demo mit MS RDLC Report Viewer versucht, um den Bericht als Bytes auszuspucken. Für mich ist dies das Beste aus beiden Welten, da ich weiterhin RDLC-Dateien verwenden, damit Berichte auf der Serverseite erstellen und die leistungsstarke Firefox in den Dokument-Viewer integrieren kann, um die Ausgabe anzuzeigen. PdfJs ist immer noch kein Berichts-Viewer, aber für meinen Fall mit Seitennavigation, Druckvorschau, Suche und einer Reihe anderer nützlicher Funktionen ist es auch nicht weniger.

Falls Sie interessiert sind, finden Sie hier eine Übersicht, die Ihnen bei der Verwendung in der Aspnet-Kernanwendung hilft (mit Client-Seite in Winkel 2 oder höher, rxJs und Typescript). Für mich ist dies einfach das Beste aus beiden Welten.

Hinzufügen von pdf.js und viewer.html zur Angular 2-Anwendung (mit optionaler Generierung von Aspnet Core / Webapi / MVC-Backend-Berichten mit MS Local RDLC Report Viewer)

Ich glaube, Sie können Winkel 2 sehr gut mit React oder einer anderen clientseitigen Bibliothek ändern, aber die Prinzipien bleiben dieselben.

Funktioniert es direkt mit SSRS?

@cgountanis der vorherige Beitrag ist RDLC, was bedeutet, dass es keinen Berichtsserver gibt, der Webserver rendert den Bericht.

Ein interessantes Update von Microsoft ...

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

Wir freuen uns, Ihnen mitteilen zu können, dass wir Technologie von Forerunner Software https://forerunnersw.com/ erworben haben , um unsere Investitionen in Reporting Services zu beschleunigen. Diese Technologie umfasst unter anderem das clientseitige Rendern von Reporting Services-Berichten (* .rdl), reaktionsschnelle UI-Widgets zum Anzeigen von Berichten und ein JavaScript-SDK zum Integrieren von Berichten in andere Apps - ein Beweis dafür, worauf unsere Partner aufbauen können unsere offene Plattform.

Dies sind großartige Neuigkeiten für Sie, da wir Möglichkeiten sehen, diese Technologie auf mehrere Feedback-Punkte anzuwenden, die wir von Ihnen gehört haben:

  • Sie suchen nach Cloud-Software-as-a-Service (SaaS) oder Platform-as-a-Service (PaaS), mit denen SSRS-Berichte ausgeführt werden können. Wie Sie vielleicht in unseren Versionshinweisen zum Frühjahr 18 ( https://aka.ms/businessappsreleasenotes) gesehen haben , arbeiten wir aktiv daran, SSRS-Berichte in den Power BI-Clouddienst zu bringen, und bauen auf clientseitigem Rendern auf mach das möglich.
  • Sie möchten SSRS-Berichte auf Ihrem Telefon anzeigen, möglicherweise mithilfe der Power BI-App. Wir glauben, dass diese Technologie uns dabei helfen wird, eine bessere und reaktionsschnellere Benutzeroberfläche für die Bereitstellung von Berichtsparameterwerten, die Navigation in Berichten und möglicherweise sogar die Anzeige von Berichtsinhalten bereitzustellen.
  • Sie lieben das Report Viewer-Steuerelement… aber es ist ein ASP.NET Web Forms-Steuerelement. Sie benötigen etwas, das Sie in Ihre ASP.NET Core / MVC-App oder Nicht-ASP.NET-App integrieren können. Wir hoffen, mit dieser Technologie einen clientseitigen / JavaScript-basierten Report Viewer bereitzustellen, den Sie in jede moderne App integrieren können.

Dies sind große Unternehmen, und wir haben noch keinen Zeitrahmen, den wir teilen können. Bleiben Sie jedoch in den kommenden Monaten auf dem Laufenden, da wir stets bemüht sind, unsere Fortschritte mit Ihnen zu teilen und Ihr Feedback so früh und so oft wie möglich zu hören.

Grüße

Paul


Von: Denny Figuerres [[email protected]]
Gesendet: Freitag, 23. März 2018, 02:19 Uhr
An: aspnet / Home
Cc: Paul Sheldon; Kommentar
Betreff: Betreff: [aspnet / Home] Asp.Net Core Reporting (SSRS) (# 1528)

@cgountanis https://github.com/cgountanis Der vorherige Beitrag ist RDLC. Dies bedeutet, dass kein Berichtsserver vorhanden ist. Der Webserver rendert den Bericht.

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/aspnet/Home/issues/1528#issuecomment-375408680 an oder schalten Sie den Thread https://github.com/notifications/unsubscribe-auth/AEHciZa6- stumm

Oh Gott, nicht schon wieder dieser jQuery-Mist.
Bloatware.
Und nicht nur Bloatware, sondern auch slowwwwwww ...

Wenn Sie eine Definition von Bloatware benötigen, ist dies eine gute.
Für die Perfektion fehlt im Grunde nur die jQuery-Benutzeroberfläche, aber ich bin mir ziemlich sicher, dass Leute, die solche Dinge tun, immer noch die Zeit finden werden, sie für den Datepicker hinzuzufügen.

Oh warte, ich habe es gerade gesehen

jquery-ui-1.10.3.forerunner.js

Mein schlechtes, egal.
Es ist definitiv ein perfektes Beispiel.
Wir fügen natürlich nicht nur jQuery-UI hinzu, sondern rollen auch unsere eigene modifizierte Version.

Gott, das sieht nach Mist aus. Berichte am Telefon - genau das, was wir brauchen - direkt nach CrApple iPads und Touchscreens auf dem Desktop ...
Und ich würde mich immer noch damit zufrieden geben, dass SSRS mit einem Proxy-Server zusammenarbeitet oder Auth-Cookie-Sharing durchführen kann (Hosting auf Basis von virtuellen Namen mit mehreren Mandanten - Single-Domain-Multi-Virtual-Directories-Iframe-Aufnahme, ohne das Auth-Cookie zu überschreiben eines anderen virtuellen Verzeichnisses). Oder wenn es (in SSRS 2016+) Tabellenränder in IE und Chrome und möglicherweise in Firefox gleichermaßen rendern würde.
Oder nur um die Kultur manuell über eine Abfragezeichenfolge einstellen zu können, lassen Sie die Parametertitel übersetzen und machen Sie diesen Datepicker einfach selbst, weil MS es sowieso nicht richtig macht ...

Dies ist die Definition von 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>

Wie wäre es mit:

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

oder noch besser

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

Bonuspunkte, wenn an jedes Skript und Stylesheet ein Unix-Zeitstempel angehängt wird, sodass Änderungen / Korrekturen tatsächlich wirksam werden. Erweiterte Bonuspunkte, wenn ein Datum / Uhrzeit-Wert als Unix-Zeitstempel anstelle einer kulturspezifischen Zeichenfolge übergeben wird und bei einem Datum> 2030 oder 9999 nicht fehlschlägt. Oder bei UTF8-Zeichen. Was nun die Sprachunterstützung von rechts nach links betrifft, möchten wir die Grenze für Microsoft nicht zu weit verschieben. Sie scheitern lange vorher. Sie würden meine Erwartungen bereits übertreffen, wenn es für mehr als eine europäische Sprache gleichzeitig funktionieren würde (z. B. Englisch, Deutsch, Französisch und Italienisch).

Sehr geehrter Microsoft, vielleicht möchte ich auch testen, ob in einem Bericht alle Felder übersetzt sind, und dafür möchte ich mich nur als anderer Benutzer mit unterschiedlicher Sprache anmelden - ohne jedes Mal die Spracheinstellungen meines Browsers ändern zu müssen (oder Einem Kunden zu sagen, wie das geht - das ist Ihre bisher ultimative Errungenschaft - eine unvergessliche [sehr negative] Erfahrung, die ich hinzufügen könnte - insbesondere nach dem Wechsel zu Windows 8).
Wenn Sie etwas brauchen, mit dem Sie sich identifizieren können - vielleicht gibt es manchmal auch einen englischen Benutzer, der an einem Computer arbeitet, der für nicht englische Benutzer eingerichtet wurde. Es wäre daher schön, wenn ich als Entwickler die Anzeigesprache in meiner Anwendung festlegen könnte, ohne sie nur durch die Spracheinstellungen des Benutzeragenten bestimmen zu lassen. Vielleicht könnten Sie zumindest dies DIESE Zeit berücksichtigen.

Aber wenn ich mir den obigen Mist ansehe, kann ich schon sagen, dass du es nicht wirst.

Übrigens, um die Kultur in der aktuellen Inkarnation von SSRS festzulegen, müssen Sie Folgendes tun:

Rufen Sie einen Bericht mit & in_language = IETF-language-tag auf

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

Dann muss die Sprache in der http-Anfrage überschrieben werden (benutzerdefiniertes HTTP-Modul in SSRS).
(und die P3P-Richtlinie sieht vor, dass ein Formular-Login-Post funktioniert, wenn er sich in einem Iframe in einer anderen Domäne befindet).

Könnten Sie dafür sorgen, dass Sie dies bitte nicht unterbrechen, ohne einen (DISPLAY) Sprachparameter anzubieten?
Ihr Parameter rs:ParameterLanguage wirkt sich nur auf die Parameter in der URL aus, nicht auf die Anzeige des Berichts. Und es sollte überhaupt nicht existieren müssen, z. B. wenn Sie gerade datetime als Unix-Zeitstempel (UTC) übergeben haben. Und natürlich sollten Sie immer den gleichen ursprünglichen Header oder den zulässigen Header verwenden (iframe befindet sich in einer anderen Domäne als der ReportServer). Das Festlegen der Anforderungssprache im HTTP-Modul dient übrigens dazu, den Datepicker mit SSRS 2016 auf die erforderliche Sprache einzustellen. Andernfalls schlägt das JavaScript fehl, wenn es einen Datumsauswahl in den USA hat. Großartig, nicht wahr?

Wie wäre es mit: & rs: language = IETF / IANA-Sprach-Tag?


namespace libRequestLanguageChanger
{


    public class RequestLanguageChanger : System.Web.IHttpModule
    {


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


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


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

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


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

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

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

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

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

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

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


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

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

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

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

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


        } // End Sub context_BeginRequest 



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

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


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


    }


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

    } // End Using context_EndRequest


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


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


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

        return false;
    } // End Function Contains 


} // End Class RequestLanguageChanger 


} // End Namespcae libRequestLanguageChanger 

Microsoft BITTE verwenden Sie diesen Frontrunner-Code nicht so wie er ist!
Moderne clientseitige Web-Apps gehen von j-Abfragen zu es-Modulen und dergleichen über.
Wir brauchen oder wollen keinen Haufen j-Abfragecode einlesen.
Ich würde dem Client lieber ein PDF oder das aktuelle asp.net-Steuerelement geben als diesen Stapel von j-Abfragen.

Erstellen Sie ein npm-Paket, das mit Angular 2-6 und Node- und anderen Webclient-Frameworks gut funktioniert.
Arbeiten Sie auch weiterhin mit SSRS-Rendering, es hat viele Vorteile. Holen Sie sich einfach eine Reihe aktualisierter Web-Service-APIs

Gibt es hierzu Neuigkeiten?

Nun, wir hätten im Grunde schon alles, was wir brauchen.
Was wir brauchen würden, ist eine Implementierung einer REST / JSON-Version von
http: //localhost/ReportServer/ReportExecution2005.asmx
(Würde nicht schaden, wenn wir / jemand die URL anpassen könnte)
als Nuget-Paket - eines, das auch unter Linux / Mac funktioniert.
Das einzige, was getan werden muss, ist, den .NET-Code nach .NET Core / NetStandard zu portieren und alle Pinvokes in Windows-DLLs zu entfernen. Fügen Sie dann natürlich die Möglichkeit hinzu, PAGED-HTML über den Webdienst auszugeben (der derzeit fehlt - da er sich im asp.net-Render-Steuerelement befindet), und erlauben Sie das Festlegen des Download-Dateinamens.

Die Parameterauswahl könnten wir sogar selbst vornehmen - das Auslesen der RDL mit XmlDocument.
(Einige Probleme mit Option explizit deaktiviert, Option streng deaktiviert, Option mit VB-Code abgeleitet werden wahrscheinlich sein)
Ein bisschen wie das aktuelle ASP.NET-Steuerelement, nur ohne all das ASP.NET-WebForms-Zeug.

Ich glaube also nicht, dass eine einzige Zeile JavaScript erforderlich ist - das wird sich sowieso von Projekt zu Projekt, von Unternehmen zu Unternehmen, von Person zu Person unterscheiden.
Manche mögen jQuery. Manche mögen Angular. Manche mögen Vue. Manche reagieren gerne. Manche mögen NodeJS mit NPM, manche mögen bower, manche mögen TypeScript, manche mögen Babel, manche fließen, manche verwenden sogar jQuery-UI für den Datepicker.

Ich hasse zum Beispiel all diese Frameworks (insbesondere jquery-ui) mit der Lebensdauer einer Fruchtfliege, Inkompatibilitäten zwischen Versionen, Aufblähen, Nichtmodularität und einer Lernkurve von was auch immer, einer Gemeinschaft von Menschen, die nicht wissen, was sie sind tun (Anmerkung: Ich möchte hiermit nicht implizieren, dass ich immer weiß, was ich tue), und einen kaputten Paketmanager wie npm / bower, der die unangenehmen Eigenschaften hat, jedes Mal einen Weg zu finden, neue Freuden zu schaffen hätte sie benutzen wollen.

Also benutze ich einfach VanillaJS (mit ECMA-Modulen und Async - transpiliert mit Babel oder Typoskript - und wen interessiert der Transpiler?

Jetzt werden natürlich viele Menschen anderer Meinung sein - und Sie haben das Recht, anderer Meinung zu sein, da es Gründe gibt, anderer Meinung zu sein. Am Ende ist es mir egal, was Sie verwenden - verwenden Sie Coffeescript und Emacs mit JQuery-UI und Vue, wenn Sie es unbedingt wollen - zwingen Sie mich einfach nicht auf diesen Weg. Ich brauche / will nicht jquery / angle / vue / react / bower / npm oder irgendetwas von diesem Aufblähen und dieser Unzuverlässigkeit.

Nun, das heißt, wenn Sie eine JavaScript-Bibliothek bereitstellen möchten, die jeder auf seine Site stellen kann, um die Parameter automatisch auszuwählen, wie in ReportServer (im Gegensatz zu RDLC), und im Gegensatz zum aktuellen Reportviewer-Steuerelement bin ich alles dafür . Wenn Sie dies tun, machen Sie es unabhängig vom Bericht "control". Verwenden Sie eine knotenähnliche Struktur, um ECMA-Module zu erstellen, sodass Benutzer, die Knoten verwenden möchten, diese mit Knoten / npm verwenden können und diejenigen, die dies nicht müssen.

Wenn die REST / JSON-Version die Filterdaten wie die gerenderten Dateien als json aus dem Dienst abrufen könnte, müssten wir als Nebenknoten nicht einmal die RDL-Datei lesen, und wir hätten eine sehr UN- komplizierte JS Bibliothek. Der derzeit in Parametern zulässige VB-Code würde dies auf der Clientseite ohnehin nicht zulassen.

Bei einem weiteren Gedanken wäre es sogar noch besser, wenn der Dienst jedes Dataset im Bericht als JSON abrufen würde. Ich denke, wir müssten auch die Standardwerte für jeden Parameter lesen können. Dann könnten wir sogar Unit-Tests der Richtigkeit der im Bericht verwendeten SQL-Daten durchführen!
(Unit-Test-Berichte sind derzeit eher unmöglich)

Ein zusätzliches Stylesheet für die Formatierung würde dann den Trick beenden (SASS bitte). Und ein Plugin-System für zusätzliche / alternative Renderer würde das abrunden. ¨

Aber im Kern brauchen wir wirklich nur eine plattformübergreifende Berichts-Rendering-Bibliothek.
Alles andere könnte schon heute von der Community erledigt werden.
Ich denke, wenn die Quellen für die vorhandenen Steuerelemente verfügbar wären, könnte die gesamte oder der größte Teil der erforderlichen Arbeit sogar vollständig von der Community erledigt werden - würde Microsoft nicht einmal einen Cent kosten.

Ist alanjuden MvcReportViewer arbeitet mit SSRS 2017 und Core 2. Kann ich diesen Ansatz für SSRS 2017 und Core 2 verwenden?

Nein, nicht ohne viel Kopfschmerzen. Die einfachste Lösung besteht darin, PDFs direkt mit der reportexecution2005 zu exportieren, imho. Der Versuch, einen der alten Zuschauer in ein ansprechendes Format zu bringen, insbesondere für Telefone und Tablets, ist ein Schmerz.

@ Mahenbisht , ich muss es aus dem Quellcode mit Paketen

Ich verwende SQL Server 2017 mit SSRS 2017 und Core 2.
Wenn ich alanjuden.MvcReportViewer.NetCore nicht verwenden kann, gibt es einen anderen Ansatz

@ Mahenbisht , ich weiß, dass ich seit einiger Zeit nicht mehr sehr aktiv bei mir war ... Sie könnten jedoch immer noch einen ähnlichen Ansatz verwenden. Sie können sich jederzeit an die Reporting Service-API anschließen, die ich verwende (die in SSRS integriert ist), um Ihre eigenen Berichte auszuführen und sie in das gewünschte Format zu bringen.

@ Mahenbisht : Hier gibt es ein .NET Core Nuget-Paket:
https://www.nuget.org/packages/AspNetCore.ReportViewer/
Leider gibt es überhaupt keine Quellen, sodass Sie nicht sehen können, was es tut und wie es verwendet wird.
Also habe ich es hier dekompiliert (es kompiliert).

Es scheinen die Klassen zu sein, die aus ReportExecution2005 und ReportService2010-WSDL für .NET Core generiert wurden.
Nichts hindert Sie daran, Ihren eigenen Viewer zu schreiben, wenn Sie Netzwerkzugriff auf eine laufende Instanz von SQL-Server mit SSRS haben.
Wenn ich mich recht erinnere, müssen Sie deviceinfo übergeben, um zu rendern, damit Sie eine ausgelagerte HTML-Ausgabe erhalten.
So können Sie die Parameter manuell ausführen - woran ich (theoretisch) gerade arbeite.

@alanjuden : Das Problem bei Ihrem Ansatz ist, dass eine Instanz von SQL-Server mit installierten ReportingServices erforderlich ist. Wenn Sie das haben, können Sie / ReportServer genauso gut einen Iframe hinzufügen und Reportingservices eine kleine benutzerdefinierte Authentifizierung + W3C-Header- und Sprachlokalisierungs-DLL hinzufügen. Dann brauchen Sie Ihre Arbeit überhaupt nicht.

Das Problem dabei ist das
A) N Kunden haben nicht immer die gleiche Version von SSRS installiert (mit allen kumulativen Updates / Servicepacks - in meinem Fall derzeit von SSRS-2008R1 bis 2016).
und B) dass SSRS-Express-Installationen nur Zugriff auf Datenbanken auf dem lokalen Computer haben. Und was wirklich schade ist, dass es kein ReportViewer-Steuerelement gibt, das auf Nicht-Windows-PCs (Linux, Mac) funktioniert. Sie müssen also .NET mit Java für Birt oder Jasper kombinieren - was die xcopy-Bereitstellung unterbricht - ganz zu schweigen von einem riesigen Overhead in beiden 2-3 Berichtsformaten und der gesamten Java-JVM und der Birt / Jasper-Bloatware, einschließlich Tomcat und / oder anderem solchen Mist.
und C) dass ReportingService eine integrierte Windows-Authentifizierung verwendet. Selbst wenn Sie Windows verwenden, müssen Sie eine benutzerdefinierte Authentifizierung für außerhalb des Intranets hinzufügen. Dies bedeutet, dass Sie über Änderungszugriff auf ReportingServices verfügen müssen und Ihre Änderungen möglicherweise andere Software beschädigen. Daher muss jeder vernünftige Kunde eine neue Instanz von installieren SSRS / SQL-Server (was Geld kostet).
auch D) dass ReportingService-Parameter nicht lokalisierbar sind, ohne ReportViewer.aspx zu ändern, siehe C)
und auch E) dass jede Version von SSRS <2016 quirks-html rendert (und obwohl 2016+ besser ist, ist es in dieser Hinsicht übrigens alles andere als perfekt)
Da es jedoch noch alte Versionen aus dem Jahr 2008 im Jahr 2018 gibt, kann es weitere 5 bis 10 Jahre dauern, bis alles unter 2016 aussterben kann. Zu diesem Zeitpunkt wird SSRS 2016 ohnehin hoffnungslos veraltet sein. Wenn Microsoft bis dahin noch da ist, ist das so.

Docker zur Rettung - zum Glück. Aber es ist immer noch Mist.

und fügen Sie Reportingservices eine kleine benutzerdefinierte Authentifizierung + W3C-Header- und Sprachlokalisierungs-DLL hinzu.

@ststeiger Gibt es ein Online-Beispiel für das Einfügen des SSRS-Viewers in den Iframe, wenn die benutzerdefinierte Authentifizierung von der Hauptwebsite und den W3C-Headern übergeben wird?

@adopilot : Hier ist eine ungefähre Anleitung:

Fügen Sie SSRS eine benutzerdefinierte Authentifizierung hinzu

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

(Sie müssen es ein wenig ändern, damit EIN Benutzer pro Datenbank verwendet wird.
Sie möchten nicht damit beginnen, SSRS-Benutzer und Berechtigungen mit Ihren Formularbenutzern zu synchronisieren!
Geben Sie diesem Benutzer nur Rechte für den Ordner für diese Datenbank.
)

Fügen Sie SSRS ein

Ändern Sie die Anmeldeseite von ReportServer, um auf das Abrufen und Veröffentlichen von Parametern zu reagieren, legen Sie login_cookie fest und leiten Sie dann zu dem Bericht weiter, auf den gepostet wurde.

Code in Page Load in der Klasse FormsAuthentication_RS2012.LogOn in Assembly FormsAuthentication_RS2012

Veröffentlichen Sie die mit PGP / RSA verschlüsselten Daten mit einem Unix-Zeitstempel (damit sie nicht wiedergegeben werden können), der mit dem öffentlichen Schlüssel in Ihren Formularen verschlüsselt ist. Entschlüsseln Sie die Post-Daten in FormsAuthentication_RS2012 auf page_load.

(Der Code FormAuthentication_RS2012 kann nicht angegeben werden, da er den privaten Schlüssel und das fest codierte Administratorkennwort enthält.)


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

Zu ReportViewer.aspx hinzufügen


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

Fügen Sie reportviewer.aspx Parameterübersetzungsfunktionen hinzu:
(
Der Parameter wurde als Deutsch / Französisch / Italienisch / Englisch geschrieben
)
Auf / aufteilen und standardmäßig auf Deutsch (möglicherweise möchten Sie Englisch verwenden)
Fügen Sie der Berichts-URL einen Parameter in_language (in_sprache) hinzu, und Sie sind fertig, wenn Sie die Idee verstanden haben.


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>

Um dies auf einer Webseite zu verwenden, erstellen Sie einen Iframe mit dem Namen ifrmSSRS_Login (oder passen Sie ihn Ihren Wünschen an) und erstellen Sie einen Formularbeitrag beim Klicken auf einen Link:

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

Auf diese Weise können Sie die Authentifizierung mit SSRS überbrücken, und Benutzer von jedem Kunden (Datenbankname) sehen nur ihre Berichte (Berechtigungen für ssrs nach Datenbankname).

Beachten Sie, dass Uids in Kleinbuchstaben übergeben werden müssen, da SSRS sich sonst weigert, richtig zu arbeiten / explodiert wie die beschissene Software, die es ist.

Hinweis:
Dieser Code, der sich über einen längeren Zeitraum für mehrere Versionen von SSRS angesammelt hat und möglicherweise die Seiteninitialisierungskultur überschreibt, ist nicht mehr erforderlich, wenn das http-Modul die Sprache des Benutzeragenten überschreibt (was ich erst herausgefunden habe, nachdem ich diese überschreibende Seite erkannt habe -Initialize-Kultur ist nicht gut genug für den SSRS-Datepicker).
Auch die Verwendung des Schrägstrichs als Trennzeichen für die Übersetzung war unglücklich. Versuchen Sie, ein Zeichen zu verwenden, das Sie nie brauchen, z. B. £ oder ¦.

Der P3P-Header ist erforderlich, damit IE 11 auf Nicht-Windows-10-Computern das Auth-Cookie nicht ablehnt (da ssrs in einem domänenübergreifenden Iframe ausgeführt wird, wird es vom IE als Cookie eines Drittanbieters behandelt).

Verwenden Sie auch SSRS 2016+, da Sie ansonsten Funktionen im Mackenmodus wie Rahmenbreiten, Höhen, Ränder, Ausblenden der Druckfunktion und alle anderen "aufregenden IE8-spezifischen Dinge" usw. benötigen.

Wie der Name der Assembly sagt, wurde dies für unseren Produktionsserver (SSRS 2012) durchgeführt und alles entwickelte sich aus hässlichen SSRS 2005-Hacks.

Speichern Sie Links in einem Feld in Ihrer Navigationstabelle, z. B. als Feld NA_Link in T_Navigation
'{@report} Budget_SNB & in_user = {@ user} & in_sprache = {@ language} & rc: Stylesheet = COR_RS2012_v7'
Verwenden Sie Platzhalter für baseLink, Benutzer und Sprache und legen Sie das Stylesheet fest (wenn Sie einen schwarzen Hintergrund haben, müssen Sie ssrs anweisen, Ihre Änderung des Stylesheets zu verwenden.)

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

Beachten Sie auch, dass .NET-Framework Probleme hat, wenn ein Link mit einem Doppelpunkt darin umgeleitet werden muss.
Sie können den Arbeitscode für die URL-Umleitung aus dem Monoprojekt kopieren.

Beachten Sie außerdem, dass Sie die Benutzer-ID nicht einfach als Zeichenfolge / Nummer übergeben können - sie muss verschlüsselt sein (privat / öffentlich), damit niemand nur die Benutzer-ID erraten kann. Aber für den Anfang könnte der md5-Hash der Benutzer-ID den Trick tun.

@ststeiger @all
AspNetCore.ReportViewer wurde durch AspNetCore.Reporting ersetzt
Dazu gehören LocalReport und ServerReport

@ amh1979 :
Ich nehme es aus seiner Abhängigkeit AspNetCore.ReportingServices.dll, die WindowsBase benötigt, und pinvoke advapi32.dll / kernel32.dll / ReportingServicesService.exe, dass dies nur unter Windows mit .NET mit installiertem Framwork 4 funktioniert?

PS: Richtiges Englisch ist "AspNetCore.ReportViewer wurde> durch <AspNetCore.Reporting ersetzt", nicht "statt", aber ich verstehe, was du meinst;)
Oder Sie können auch sagen, dass "durch" ersetzt wurde, was das Wort / die Phrase sein könnte, nach der Sie suchen;)

@ amh1979 : Schön gemacht, musste etwas arbeiten, weil ich kein Framwork 4.7.1 installiert habe.
Ich verstehe, MainStream ist result / html und SecondaryStream ist CSS.
Aber ich habe es zum Laufen gebracht.
Dass der HTML-Code ausgelagert ist, ist auch schön.
Wissen Sie: Gibt es eine Möglichkeit, alle Ergebnisse zu durchlaufen oder eine große HTML-Datei abzurufen, ohne die Renderfunktion für jede Seite aufzurufen?

@ALL : Während dies unter vollem .net ausgeführt wird, kann ich dies nicht unter .NET Core unter Windows ausführen.
Probleme mit System.Drawing.Color ToKnownColor, IsSystemColor und nicht vorhanden KnownColor.
Das wurde behoben, aber jetzt wird darüber geklagt, dass die Assembly System.Drawing.Graphics mit Signatur nicht geladen werden konnte ...

Gibt es überhaupt eine Möglichkeit, vollständige .NET-Assemblys in einem .NET Core-Projekt unter Windows auszuführen?

@ststeiger Ich werde diese Fragen in der nächsten Version aktualisieren und

@ amh1979 :

Wenn Sie gerade dabei sind und System.Array.Empty<T> durch ArrayExtension.Empty<T> suchen und ersetzen, sind Sie zu 90% damit beschäftigt, es mit .NET 4.0 zum Laufen zu bringen.

    internal static class ArrayExtension
    {

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

    }

@ amh1979 :

Es wird Folgendes verwendet

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

welche .NET Core System.Drawing.Common nicht implementiert.
Hier ist ein Ersatz für System.Drawing.KnownColor.cs
(Es ist aufgrund von Mehrdeutigkeiten nicht perfekt, aber ohne Zugriff auf interne Werte von System.Drawing.Color. Dies ist das Beste, was ich tun kann. Verwenden Sie möglicherweise #ifs, um das vollständige .net-Framework dazu zu bringen, die tatsächlichen Eigenschaften aufzurufen, wenn es voll ist. Netzrahmen ...)


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 


}

Ich habe es unter NetStandard 2.0 kompiliert

WIE MAN:
Nehmen Sie System.CoreFX.Forms und konvertieren Sie es in NetStandard 2.0. Fügen Sie dann System.Drawing.Common und System.Reflection.Emit hinzu.

Nehmen Sie AspNetCore.ReportingServices und fügen Sie hinzu

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

Fügen Sie einen Verweis auf System.CoreFX.Forms (NetStandard) hinzu.

Holen Sie sich die folgenden Dateien von 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")

Fügen Sie eine Wrapper-Klasse für System.Web hinzu


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

Und erlauben Sie unsicheren Code im neuen netstandard 2.0-Projekt.

Fügen Sie nun AssemblyInfo.cs mit hinzu

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

Und jetzt wird es auf NetStandard 2.0 kompiliert.

Hey @Alle erstaunlichen Neuigkeiten:

Ich habe es mit .NET Core unter Windows arbeiten!
100% NetStandard, 0% NetFramework

HTML, PDF, Excel, Excel2007 +, Word, Word2007 + und tiff funktionierten in einem 57-seitigen tabellarischen Bericht mit Varchars, Ints, tinyint2, Bits und berechneten Spalten einwandfrei.
Alle Ausgabeformate funktionieren, außer RDL, was irgendwie lustig ist, aber wen interessiert das?
Wir werden das Problem irgendwann finden, nicht wahr?

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 

Und es gibt noch mehr gute Neuigkeiten:
WindowsBase (auch bekannt als WPF) wurde nur für System.IO.Packaging verwendet, das in .NET Core verfügbar ist.
Das heißt, wenn wir die Pinvokes loswerden können, gibt es keine größeren Hindernisse, damit dies auch unter Linux / Mac funktioniert!

Jetzt fängt jemand schnell an, einen webbasierten RDL-Editor zu schreiben!
Dann könnten wir auch "dynamische" (benutzergenerierte) Berichte haben.
PostgreSQL-ReportingServices für Linux kommt;)
(ok, es gibt ein legales Damoklesschwert für so etwas, aber wenn wir es nur aus China veröffentlichen könnten, das "entspanntere" Rechte an geistigem Eigentum hat ...) :)

OK, vielleicht ist das zu böse.
Denken Sie stattdessen an Microsoft ReportingServices für Oracle / SAP!
Oder ReportingServices für Cassandra / Spark: grinsen:

@ amh1979 :
Gibt es dort keinen PowerPoint-Renderer?
Haben Sie es aus der neuesten Version von Reportviewer erstellt? (SSRS 2017)
Die neueste Version, die ich auf Nuget kenne:
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
(140.1000.523, vor 10 Monaten)
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WinForms
(140.1000.523)
https://www.nuget.org/packages/Microsoft.SqlServer.Types
(14.0.314.76)

Hier ist die CoreFX WinForms-Implementierung für NetStandard:
https://github.com/ststeiger/System.CoreFX.Forms

Beachten Sie die Lücke, da ich ein zusätzliches NetCore-Projekt hinzugefügt und System.CoreFX.Forms in System.NetStandard.Forms umbenannt habe. In diesem Fall kann es zu Problemen beim Laden der eingebetteten Ressourcen kommen.

Die Dateien finden Sie hier:

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

@ amh1979 :
Ah, ich verstehe, das ist nicht in Microsoft.ReportViewer.Common.dll.
Aber es ist im ReportServer-Verzeichnis:
Microsoft.ReportingServices.PowerPointRendering.dll
und für CSV / XML / Atom:
Microsoft.ReportingServices.DataRendering.dll

C: \ Programme \ Microsoft SQL Server Reporting Services \ SSRS \ ReportServer \ bin

@ALL : Meine Damen, der HTML-Renderer arbeitet unter Linux unter .NET Core / NetStandard 2.0!
Und so ist der WordOpenXML- und der ExcelOpenXML-Renderer!
(nicht mit Bildern / Grafiken getestet - nur Text und Code)

Der PDF-Renderer hat Probleme beim Einbetten von Pinvokes in Schriftarten.
(Der Word / Excel-2003-Renderer verwendet Pinvokes und funktioniert daher nicht.)
Wenn Sie die Evaluierungsversion von Aspose Cells / Words verwenden, können Sie xlsx in xls und docx in doc konvertieren.
Sie können das PDF auch aus der Word-Datei generieren:
soffice --headless --convert-to pdf filename.docx
(oder wieder mit aspose eval)
Wenn Sie darüber nachdenken, sollte der PPTX-Renderer auch einfach zu handhaben sein, da er lediglich die Bilder aus der TIFF-Datei aufnimmt und jedes TIFF-Seitenbild als JPG / PNG auf eine Pptx-Folie legt.
Es sieht so aus, als wäre der Bildrenderer das Schwierigste.
Oder Sie nehmen wkhtmltoX und rendern jede HTML-Seite in ein Bild / PDF.
Das wäre allerdings wahrscheinlich etwas langsam.

Tolle !

HTML for report

@ALL : Atom / CSV / XML funktioniert. So ist der NULL-Renderer.
Auch unter Linux.

Das PowerPoint-Rendering funktioniert nur unter Windows - Pinvokes

Lustige Tatsache: Es scheint einen JSON-Renderer zu geben.
Aber aus irgendeinem Grund funktioniert dieser Mist nur in einem useSharedDataSetTableHandler-Fall, was auch immer das bedeutet

ParseDeviceInfo(deviceInfo);

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

Weiß jemand aus Gefahr, wie man den JSON-Renderer benutzt?

@ amh1979 Ich habe versucht, den Serverbericht zu verwenden, aber es sieht so aus, als würden die Parameter, die ich für den Bericht hinzugefügt habe, nicht auf dem Server in LoadReport gespeichert. Gibt es eine Möglichkeit, dass Sie es so einstellen, dass diese bei Ihrem nächsten Build an den Server gesendet werden?

Hallo @ststeiger und @ amh1979 , Großartige Arbeit, gibt es Tutorials zur Verwendung dieser Bibliothek? Ich versuche herauszufinden, wie / ob derzeit mehrwertige Parameter unterstützt werden und ob Drilldowns unterstützt werden.
Ich versuche immer wieder, zu der Site zu gelangen, die in der Beschreibung des Nuget-Pakets (http://www.amhx.org/) verlinkt ist, um sie zu sehen, aber es läuft immer wieder auf mich ab.

@ DavidHayesCoding :
Hier mein Testcode für AspNetCore.Reporting.LocalReport, an dem ich nur interessiert bin:
Hinweis:
Die Rendertypen Rpl, RGDI, Atom, XML, Json, Csv, null, pptx
wird Ihnen nicht zur Verfügung stehen, da sie nicht in der Versammlung von amh1979 enthalten sind.
(Sie sind Teil von SSRS, aber im weiterverteilbaren ReportViewer nicht vorhanden.)

Beachten Sie außerdem, dass sich die freigegebene Datenquelle (* .rds) im selben Verzeichnis wie die * .rdl befinden muss, da sonst bei LocalReport.Execute eine Nullreferenzausnahme angezeigt wird.

Für weitere Fragen:
https://github.com/icsharpcode/ILSpy/releases/tag/v4.0-beta2
(Hinweis: Im richtigen Code müssen Sie die Datentabelle nach Beendigung der Verwendung entsorgen.)

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


    }


}

Könnte ich vorschlagen, dass das Posten von Massen von Code- und Längenkommentaren eine wirklich schwer verdauliche und lesbare Methode ist, um dieses Problem zu verfolgen?

Ich kann viel Aktivität sehen, viel Code, aber ich bin wirklich nicht klüger, was die jüngsten (scheinbar hervorragenden) Entwicklungen angeht.

Könnte ich vorschlagen, die Dinge hier ordentlich zu halten und ein anderes Repo / geeignete Tools zum Teilen von Code zu verwenden? Gibt es eine einfache Statusaktualisierung, die hier geteilt werden könnte?

wie @kierenj denke ich, dass die

@kierenj @figuerres : Damit wäre ich

iii. Vertriebsbeschränkungen. Sie können nicht
• Verteilen Sie verteilbaren Code, um ihn auf einer anderen Plattform als der Windows-Plattform auszuführen.
• Der Code muss in Form eines Quellcodes offengelegt oder verbreitet werden. oder
• Andere haben das Recht, dies zu ändern.

@ststeiger
und Sie können hier mit dem Repo arbeiten, um einen Zweig zu erstellen und Code in diesen Zweig einzufügen.
dann haben sie es und wissen davon etc ...

@figuerres : Ich habe das Repo auf Gitlab gemacht, wo ein privates Repository kostenlos ist.

@ MaximRouiller :
Ich hätte eine Version von ReportViewer (lokale Berichte), die ungefähr unter ASP.NET Core funktioniert.
Etwa 75% davon würden sogar unter Linux funktionieren, für das Microsoft SQL-Server veröffentlicht hat.
Die Teile, die unter Linux funktionieren, funktionieren höchstwahrscheinlich auch unter MacOS.

Diese Version von ReportViewer basiert jedoch auf dem Code von
https://www.nuget.org/packages/AspNetCore.Reporting
das scheint auf Code von zu basieren
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
welches unter diese Lizenz fällt
http://go.microsoft.com/fwlink/?LinkId=826162

Diese Lizenz erlaubt nicht
• Verteilen Sie verteilbaren Code, um ihn auf einer anderen Plattform als der Windows-Plattform auszuführen.
• Der Code muss in Form eines Quellcodes offengelegt oder verbreitet werden. oder
• Andere haben das Recht, dies zu ändern.
• technische Einschränkungen in der Software umgehen;
•> kein Reverse Engineering erlaubt <

Ich möchte diesen Code (öffentlich) mit der Community hier auf Github an einem noch zu bestimmenden Ort teilen, um den Code zu verbessern und mögliche verbleibende Fehler zu beseitigen und ReportViewer auf .NET Core zu bringen.
Ich möchte einen solchen Schritt jedoch nicht einseitig in Anbetracht der aktuellen Lizenz von ReportViewerControl.WebForms unternehmen.

Ich denke, viel hat sich geändert, seit diese Lizenz zum ersten Mal geschrieben / zuletzt aktualisiert wurde.
Zum Beispiel wäre es wenig sinnvoll, einen ReportViewer für .NET Core zu veröffentlichen, wenn das Ergebnis nur auf der Windows-Plattform funktioniert - auch wenn Microsoft SQL-Server für Linux veröffentlicht hat, was bedeutet, dass SSRS dies zu einem bestimmten Zeitpunkt tun muss folge trotzdem.

Und da ASP.NET-Core keine WebForms implementiert, wäre die Änderung von ReportViewer-WebForms zu ReportViewer-NetCore ohnehin eine bahnbrechende Änderung.

Könnten Sie die Befugnisse diskret fragen, ob sie unter den gegebenen Umständen grünes Licht für ein solches Unterfangen geben - was ihnen übrigens auch Zeit und Arbeitskräfte sparen würde - und sich gut an der Open-Source-Natur von .NET-Core / ausrichten? NetStandard 2.0.

Seit der Veröffentlichung von .NET-Core sind mehr als zwei Jahre vergangen, und es gibt immer noch keine Lösung für Berichte, die weit und breit reichen. Es ist Zeit, dies zu korrigieren.
Wenn wir es zusammen machen, werden wir alle schneller und besser dran sein.

http://go.microsoft.com/fwlink/?LinkId=826162
Worüber ich mir Sorgen mache.
Wenn nicht, werde ich die Pakete von NuGet auflisten.

@ALL : Nachrichten erstellen: Die COM-InterOP-Aufrufe für XLS / DOC wurden entfernt und durch OpenMcdf ersetzt.
XLS / DOC-Renderer funktioniert daher jetzt sowohl unter Linux als auch unter Windows.
Jetzt arbeiten 85% unter Linux.

Es sieht so aus, als hätten wir nur noch 3 WinAPI-Aufrufe für PDFWriter und 13 WinAPI-Aufrufe für ImageRenderer / Graphics.
Ich denke, der PdfWriter selbst könnte ziemlich einfach sein.

Hallo @ststeiger, ich kann

Noch nicht ganz - es werden mehrere Aufrufe von GDI + und usp10.dll durchgeführt, hauptsächlich um Informationen zu Schriftarten zu erhalten.
Außerdem werden GDI + -Zeiger weitergegeben, und es gibt keinen einfachen Ersatz, da mono libgdi + die Dinge (aus gutem Grund) anders gemacht hat.

Ich konnte die Funktion GetFontData in C # neu schreiben, indem ich die C-Quelle von Wine gelesen habe, aber ich benötige Freetype, um zu den TrueType-Schriftartinformationen zu gelangen (Wine verwendet auch FreeType).
SixLabors.Fonts und LayoutFarm sind noch nicht da (mit großem Abstand).
Hier:
https://gist.github.com/ststeiger/273341aebd29009f2b272b822b69563f

Außerdem habe ich die Textmessungen durch Freetype ersetzt

Jetzt muss ich jedes GDI-Gerätehandle durch eine benutzerdefinierte Klasse ersetzen.
Diese Klasse muss dann Informationen zu Schriftart / Grafik / Freetype-Gesicht / Handle usw. enthalten, damit ich den Renderer nicht neu schreiben muss.

Wenn das erledigt ist, muss ich mir noch einmal den Wein ansehen, um die Veränderungen von Papier zu Welt und von Welt zu Papier zu erreichen.
Und dann sollte es getan werden.
Ich denke, die Transformationen von Papier zu Welt und von Welt zu Papier befinden sich möglicherweise bereits in System.Drawing.Graphics.
Es sieht so aus, als ob ein Teil des Codes einmal mit .NET Framwork 1.0 geschrieben wurde.

Außerdem muss ich noch irgendwie zwischen .NET-Schriftart und Freetype-Schriftart zuordnen.

Hey Leute @ALL und @ststeiger
in Bezug auf:

@ALL : Nachrichten erstellen: Die COM-InterOP-Aufrufe für XLS / DOC wurden entfernt und durch OpenMcdf ersetzt.
XLS / DOC-Renderer funktioniert daher jetzt sowohl unter Linux als auch unter Windows.
Jetzt arbeiten 85% unter Linux.

Office Open XML

Ehrlich gesagt denke ich, es wäre besser, das neuere XML-Dokument zu verwenden, als überhaupt keine Form von OLE zu benötigen.
Ok, wenn jemand noch wirklich sehr, sehr alte Office-Apps verwendet, die nicht so gut für die Rückkompatibilität sind. Office Open XML gibt es jedoch seit etwa 2002-2006, sodass jeder, der Word oder Excel aus den letzten 10 Jahren verwendet, das Dateiformat docx und xlsx problemlos verwenden kann.
nur mein Gedanke daran ...

Nur damit wir uns nicht missverstehen:
Natürlich funktioniert auch der OpenXml Excel-Renderer.

Ich sage nur, dass XLS / DOC auch funktioniert, wenn es muss.
Eine weitere Frage ist nun, ob XLS / DOC verfügbar gemacht werden soll oder nicht oder ob dies sicher gelöscht werden kann. Möglicherweise gibt es noch einige alte Programme, die mit XLSX nicht funktionieren.

UBS verwendet beispielsweise weiterhin COBOL-Programme.
Und es gibt verschiedene andere.
Daher ist es wahrscheinlich besser, die XLS-Funktionalität für alle Fälle etwas länger zu nutzen.

@RaymondHuy :
Wenn Azure die GDI + -Funktion blockiert hat, funktioniert System.Drawing.Common überhaupt?
Oder gilt dies nur für Framework-externe DllImport-Aufrufe?

Hmm, habe es einfach gegoogelt.
Es sieht so aus, als ob die System.Drawing-Bibliotheken in Azure Cloud Service (im Grunde nur eine VM) verfügbar sind, jedoch nicht in Azure Web App (im Grunde Shared Hosting?).
Dies könnte ein Problem sein.
Sobald dies unter Linux ausgeführt wird, müssen wir alles System.Drawing später durch SixLabors.ImageSharp ersetzen, damit es unter Azure Web App ausgeführt werden kann.

Dies wird Zeit und Mühe kosten.
@RaymondHuy :
Können Sie überprüfen, ob FreeType (SharpFont-Wrapper) unter Azure funktioniert?
https://github.com/Robmaister/SharpFont

Hinweis:
Unter x64-Windows müssen Sie die using-Klausel für FT_Long und FT_ULong durch diese ersetzen

#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

weil die gepatchten Freetype-DLLs unter x64-Windows nicht funktionieren.

So habe ich das gemacht:
https://gist.github.com/ststeiger/9e2eb98e29a3c987aca739045af1d2ce

(Hinweis: Definieren Sie WINDOWS in den Build-Optionen.)

mit etwas Testcode:

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 erzeugt eine Ausnahme, wenn die WINDOWS-Korrektur nicht angewendet wird.

Wenn ich es mit einer .rdlc-Datei versuche, erhalte ich eine Ausnahme
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (von TMemberType, TCellType) .m_memberTreeHostsRemotable 'ist in diesem Kontext nicht verfügbar, da es sich um' Friend 'handelt.' in localreport.Execute ()
Bitte hilf mir

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

Es scheint, dass Sie ein Problem mit eingebetteten VB-Ausdrücken haben.
Es gibt sowieso mehrere Probleme.

In Microsoft.VisualBasic1 \ VBCodeGenerator.cs
UseShellExecute muss auf false gesetzt werden.

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

Und FromFileBatch muss durch Roslyn ersetzt werden, wenn es für Netstandard kompiliert wurde (CodeDom-Anbieter kann nicht für Netstandard kompilieren - lustige Ausnahmen, wenn VB-Ausdrücke verwendet werden, z. B. in Parametern)


        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

Es gibt RoslynCodeDomProvider unter https://github.com/aspnet/RoslynCodeDomProvider , aber sie verwenden Roslyn trotzdem hinter den Kulissen. Und relativ hartcodiert mit "C: \ WINDOWS \ Microsoft.NET \ Framework\.\ vbc.exe "ist sowieso eine schlechte Idee.

Jetzt habe ich den vollständigen HTML4-, HTML5- und MHTML-Renderer zum Laufen gebracht.
Nicht nur der Paginierte.

Hallo, ich verwende [https://www.nuget.org/packages/AspNetCore.Reporting] und es funktioniert perfekt in lokalem IIS.
Aber sobald ich es auf dem Windows Server 2012 R2 bereitstelle, stoße ich auf ein Problem.

Fehlerprotokolle.

Fehler: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]
Während der Ausführung der Anforderung ist eine nicht behandelte Ausnahme aufgetreten.
AspNetCore.Reporting.LocalProcessingException: Bei der lokalen Berichtsverarbeitung ist ein Fehler aufgetreten. Die Definition des Berichts 'D: \ Apps \ BillingApproval \ ReportFiles \ ReleaseProcess.rdl' ist ungültig.
Beim Kompilieren von Ausdrücken ist ein unerwarteter Fehler aufgetreten. Native Compiler-Rückgabewert: -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: Beim Kompilieren von Ausdrücken ist ein unerwarteter Fehler aufgetreten. Native Compiler-Rückgabewert: -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 Parameter)
bei AspNetCore.Reporting.Report.SetParameters (ReportParameter-Parameter)
at 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 Parameter, String searchString) in D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Extension \ AspNetCoreReportingExtension.cs: Zeile 27
unter BA.UI.WebV2.Controllers.ReportsController.ReleaseProcessToPDF (DateTime from, DateTime to) in D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Controllers \ ReportsController.cs: Zeile 65
at lambda_method (Closure, Object, Object [])
bei Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute (IActionResultTypeMapper-Mapper, ObjectMethodExecutor-Executor, Object-Controller, Object [] -Argumente)
bei Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync ()
bei Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync ()
bei Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (ActionExecutedContext-Kontext)
bei Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
bei Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()
bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()
bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (ResourceExecutedContext-Kontext)
bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (Status & Weiter, Bereich & Bereich, Objekt & Status, Boolean & isCompleted)
bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync ()
bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
bei Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext)
bei Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (HttpContext-Kontext)
bei Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (HttpContext-Kontext)
bei Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke (HttpContext-Kontext)

@jfmjason :
Da Sie mit dem .NET 4.0-Compiler keinen .NET Core-Code kompilieren können, müssen Sie die RoslynCompiler verwenden, die nicht in System.CodeDom enthalten sind. Mein oben genannter NetStandardFromFileBatch behebt genau dieses Problem (und verwendet CodeDom, wenn es für NetFramework 4 kompiliert wird).

Beachten Sie jedoch, dass die VB-Laufzeit in .NET Core stark eingeschränkt ist.
Grundsätzlich unterstützt .NET Core VB.NET nicht wirklich.

Wenn Sie sich grundlegende VB-Funktionen wie die etwa 50 VB-Zeichenfolgenfunktionen wie Ersetzen, Trimmen, AscW, ChrW, LCase, Len, Mid in Microsoft.VisualBasic.Strings ansehen - .NET Core 2.0 unterstützt genau zwei davon. AscW und ChrW ...

Wenn Sie sich die aktuelle Quelle auf Github ansehen, werden Sie sehen, dass sie jetzt da sind - aber alle Stubs, die null werfen.
https://github.com/dotnet/corefx/blob/master/src/Microsoft.VisualBasic/ref/Microsoft.VisualBasic.cs

Darüber hinaus müssen Sie möglicherweise Ihren VB-Code in Ihren Berichten ein wenig bearbeiten, um sowohl .NET Core als auch NetFramework zu unterstützen.

Also @ALL : hier ist eine Idee:
Wenn Sie möchten, dass Ihr Bericht ohne Änderungen auf .NET Core ausgeführt wird, beginnen Sie mit der Implementierung der Zeichenfolgenfunktionen in Microsoft.VisualBasic.cs.
Oder entfernen Sie VB-Laufzeit-spezifisches Material und versuchen Sie, die mit C # bereitgestellten Klassen und Elementfunktionen zu verwenden, z. B. string.Length anstelle von Len, IndexOf anstelle von InStr, Subtring anstelle von Mid, "BLA" .ToLower () anstelle von LCase ("BLA") etc ..

Außerdem hat der VB-Code im Allgemeinen, nicht nur in .NET Core, Probleme mit der nullbaren Syntax.
Verwenden Sie also System.Nullable (Of Double) anstelle von Double?, Wenn Sie beispielsweise einen Funktionsrückgabewert deklarieren müssen.

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

Außerdem müssen Sie die Assemblyreferenzen in ExprHostCompiler.cs ändern:
(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 : Ich habe es noch nicht angesehen, aber werden in der ausgelagerten Version des
Denn als ich den vollständigen HTML4 & 5-Renderer von ReportServer übernommen habe, scheinen Bilder an einen Axd- oder Ashx-Handler von ReportingServices delegiert zu sein. Sie erschienen jedoch in der MHT-Version.

Sie sollten wahrscheinlich in URL geändert werden ("data: image / png; base64, SOME_BASE64_IMAGE"); stattdessen, damit sie im HTML-Code inline sind.
Das heißt, wenn sie zu einem nicht externen Link gehen.
Ich habe nicht getestet, ob dies auch den Betrachter betrifft.

@ststeiger

Danke für die Antwort. Ich frage mich, warum es perfekt funktioniert, wenn ich eine Release-Version meiner Webanwendung (.net Core 2.1) in lokalem IIS veröffentliche.

Möglicherweise funktioniert es lokal, weil Sie .NET Framework lokal installiert haben.
Oder weil sich Ihr lokaler Webserver nicht im integrierten Modus befindet, unter einem anderen Benutzer ausgeführt wird oder auf einen anderen Logikpfad, Anwendungspooleinstellungen, Sicherheitseinstellungen, Assemblyumleitungen usw. trifft.
Auch ServicePacks, CumulativeUpdates und andere aufregende "Funktionen".

Eine kleine Testanwendung gemacht.
Nach dem Hinzufügen von System.Drawing.Common unter Win10 funktioniert es einwandfrei.
Das Ausführen unter Ubuntu 16.04 führt zu einem Fehler.
AspNetCore.Reporting.LocalProcessingException: Bei der Verarbeitung lokaler Berichte ist ein Fehler aufgetreten. Die Definition des Berichts '/opt/testReportViewer/bin/Debug/netcoreapp2.1/Reports/Report1.rdlc' ist ungültig.
Bei der Berichtsverarbeitung ist ein unerwarteter Fehler aufgetreten.
Die gemeinsam genutzte Bibliothek 'kernel32.dll' oder eine ihrer Abhängigkeiten kann nicht geladen werden. Um die Diagnose von Ladeproblemen zu erleichtern, sollten Sie die Umgebungsvariable LD_DEBUG festlegen: libkernel32.dll: Freigegebene Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis ---> AspNetCore.Reporting.DefinitionInvalidException: Die Definition des Berichts '/ opt / testReportViewer /bin/Debug/netcoreapp2.1/Reports/Report1.rdlc 'ist ungültig.
Bei der Berichtsverarbeitung ist ein unerwarteter Fehler aufgetreten.
Die gemeinsam genutzte Bibliothek 'kernel32.dll' oder eine ihrer Abhängigkeiten kann nicht geladen werden. Um die Diagnose von Ladeproblemen zu erleichtern, sollten Sie die Umgebungsvariable LD_DEBUG festlegen: libkernel32.dll: Freigegebene Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis ---> AspNetCore.ReportingServices.ReportProcessing.ReportProcessingException: Bei der Berichtsverarbeitung ist ein unerwarteter Fehler aufgetreten.
Die gemeinsam genutzte Bibliothek 'kernel32.dll' oder eine ihrer Abhängigkeiten kann nicht geladen werden. Um die Diagnose von Ladeproblemen zu erleichtern, sollten Sie die Umgebungsvariable LD_DEBUG festlegen: libkernel32.dll: Freigegebene Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis ---> System.DllNotFoundException: Die gemeinsam genutzte Bibliothek 'kernel32.dll' oder eine kann nicht geladen werden seiner Abhängigkeiten. Um die Diagnose von Ladeproblemen zu erleichtern, sollten Sie die Umgebungsvariable LD_DEBUG festlegen: libkernel32.dll: Freigegebene Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis
bei AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat (Stream definitionStream, String & Beschreibung, String & Sprache, ParameterInfoCollection & Parameter, DataSourceInfoCollection & Datasources DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, Arraylist & dataSetsName, Boolean & hasExternalImages, Boolean & hasHyperlinks, Byte [] & dataSetsHash)
bei AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat (Byte [] Definition, String & Beschreibung, String & Sprache, ParameterInfoCollection & Parameter, DataSourceInfoCollection & Datasources DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, Arraylist & dataSetsName, Boolean & hasExternalImages, Boolean & hasHyperlinks, Byte [] & dataSetsHash)
bei AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport (PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String & Report, String & reportLanguage, ParameterInfoCollection & Parameter, DataSourceInfoCollection & Datasources DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, Arraylist & dataSetsName, Boolean & hasExternalImages, Boolean & hasHyperlinks, Byte [] & dataSetsHash)
bei AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
--- Ende der inneren Ausnahmestapelverfolgung ---
bei AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
at AspNetCore.Reporting.ReportCompiler.CompileReport (ICatalogItemContext-Kontext, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
--- Ende der inneren Ausnahmestapelverfolgung ---
at AspNetCore.Reporting.ReportCompiler.CompileReport (ICatalogItemContext-Kontext, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
at AspNetCore.Reporting.LocalService.GetCompiledReport (PreviewItemContext itemContext, Boolesche Neuerstellung, ControlSnapshot & Snapshot)
bei AspNetCore.Reporting.LocalService.CompileReport ()
bei AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport ()
bei AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession ()
--- Ende der inneren Ausnahmestapelverfolgung ---

@ststeiger irgendwelche Neuigkeiten in der AspNetCore.Reporting Bibliothek? Ich habe seit Tagen nach einer Lösung zum Erstellen von PDFs aus RDL-Dateien in .NET Core gesucht. Die einzige Lösung, die ich gefunden habe, war AspNetCore.Reporting, die ich später entdeckte, dass sie nur unter Windows funktioniert. Die Änderungen, die Sie hier vorgenommen und gemeldet haben, sind sehr ansprechend , auch weil ich einige Probleme mit der Verwendung von Unterberichten habe und den AspNetCore nicht debuggen kann. Berichterstellung ohne die Quelle, die Sie haben :) ... Ich wäre sehr daran interessiert, Ihnen mit dieser Bibliothek zu helfen, die fehlenden Bits zu verbessern ( und um es endlich debuggen zu können ...)

@OkunevPY : Möglicherweise wird dies durch eine der Speicherverwaltungsfunktionen verursacht, mit denen die Datenquellendaten sicher gespeichert werden. Unter Linux habe ich das einfach ausgeschaltet - Daten unverschlüsselt speichern. Dann funktioniert es, obwohl es unsicher ist. Sie müssen dies jedoch im ReportViewer-Code tun. Code in Produktionsqualität müsste eine Verschlüsselungs- / Entschlüsselungsmethode implementieren, was nicht schwierig ist - aber ich möchte lieber zuerst alle Funktionen zum Laufen bringen.

@ zillemarco;
Die PDF-Erstellung funktioniert noch nicht (funktioniert nur unter Windows).
Wenn Sie eine Anwendung erstellen, die Sie mit dieser rückentwickelten DLL bereitstellen, tun Sie technisch gesehen etwas Illegales.

Wenn Sie ein unter Linux generiertes PDF benötigen, empfehle ich, es mit wkHtmlToPdf aus HTML zu generieren.
Hier ist eine .NET-Core-Variante:
https://github.com/ststeiger/libWkHtml2X
Verwenden Sie nur die ausführbare Variante (wkhtmltopdf.exe, wkhtmltoimage.exe über Eingabe- / Ausgabestream).
libWkHtmlToX.ProcessManager(opts)
weil wkhtmltox.dll in Multithreading-Szenarien nicht funktioniert und meine C # -Schnittstelle noch nicht vollständig fehlerfrei ist.

Einige Verwendungsbeispiele (converter.telerik.com zum Konvertieren in C #):

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

Alternativ können Sie PdfSharp für .NET-Core verwenden
https://github.com/ststeiger/PdfSharpCore

Ich habe auch die vollständige PDF-Bibliothek auf NetStandard portiert, die hier zu finden ist:
https://github.com/ststeiger/PdfSharpNetStandard
(Wenn Sie kein Azure-Hosting benötigen, empfehlen wir Ihnen, PdfSharpNetStandard auszuwählen.)

In Bezug auf ReportViewer-PDF unter Linux:
Sie müssen zuerst viele Pinvokes implementieren (Linux implementiert die Windows-API nicht und Sie können nicht einfach alle DLL-Aufrufe an Wine weiterleiten).

Ich habe bisher nur GetFontData erstellt, da dies das wichtigste ist (Einbetten von Schriftarten).
Wenn Sie mir Ihren gitlab-Kontonamen (nicht Hub-Kontonamen) geben können, kann ich Ihnen Lesezugriff auf das Repository gewähren.

@ststeiger Ich weiß, dass das Bereitstellen einer App mit dieser Bibliothek illegal wäre und ich beabsichtige nicht, dies zu tun, aber mit dem Quellcode könnte ich es zumindest debuggen und verstehen, warum ich keinen Unterbericht laden kann und Daten an ihn weitergeben (ich habe es mit Resharper versucht, aber es ist ein Albtraum). Wenn du mir Lesezugriff auf das Repo geben möchtest, würde ich es lieben :) Mein Gitlab-Benutzername ist zillemarco (genau wie hier auf github)

@ Zillemarco : Du
Sie sollten eine E-Mail von gitlab erhalten haben, vermutlich mit dem Link zum Repo.

Versuchen Sie ILSpy 4.0 Beta 2 anstelle von Resharper:
https://github.com/icsharpcode/ILSpy/releases

Wenn Sie in .NET Framework debuggen müssen, versuchen Sie es mit Live-Dekompilieren und Debuggen mit Rider. Das EAP ist kostenlos:
https://www.jetbrains.com/rider/eap/

@ststeiger hat die E-Mail bekommen danke :) Danke auch für den Tipp!

@ststeiger Sie können Zugriff auf das Repository AspNetCore geben. Bericht für okunevpy?

@OkunevPY : Du

@ststeiger Danke.

        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: 'Bei der Verarbeitung lokaler Berichte ist ein Fehler aufgetreten. Für die Codierung von 1252 sind keine Daten verfügbar. Informationen zum Definieren einer benutzerdefinierten Codierung finden Sie in der Dokumentation zur Methode Encoding.RegisterProvider.'

@Jhonnybmx : Es gibt eine Website namens google.com, auf der Sie die Fehlermeldung eingeben, und die Lösung ist der erste Link ...

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

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

Hallo, ich bin an LocalReport auf .NET Core interessiert, um den rdlc-Bericht als PDF zu exportieren.
Für mich ist die Windows-Version vorerst in Ordnung.

Ich bin auf das NuGet-Paket AspNetCore.ReportingServices von @ amh1979 gestoßen, das genau das ist, was ich brauche.
Das Problem ist, dass die InternalLocalReport-Klasse in diesem Paket intern ist und ich auf die gesamte API (wie in der ursprünglichen MS LocalReport-Implementierung) für Gl. Um das SubreportProcessing-Ereignis zu verwenden, rufen Sie die Methoden LoadSubreportDefinition () oder GetParameters () auf.

Diese Methoden sind in der AspNetCore.Reporting.LocalReport-Klasse (in AspNetCore.Reporting NuGet) nicht implementiert, daher muss ich sie direkt aufrufen.

Die Assembly AspNetCore.ReportingServices.dll hat InternalsVisibleTo für die Assembly AspNetCore.Reporting.dll festgelegt.
Kann ich das irgendwie so verwenden, wie es in https://github.com/amh1979/Reporting/tree/master/AspNetCore.Reporting mit Reporting.pfx-Zertifikat steht (für das ich kein Passwort habe).

Können Sie mir bitte helfen? Was ist die Lösung dafür?

@ststeiger Sie können mir auch Zugriff auf das GitLab-Repository AspNetCore.Reporting gewähren. Mein GitLab-Benutzername ist holajan.
Vielen Dank

Die AspNetCore.ReportingServices unter dieser Lizenz
http://go.microsoft.com/fwlink/?LinkId=826162
Ich habe es geschlossen

Kann jemand bitte Dokumentation / Hinweise oder Hinweise zur Verwendung / Implementierung dieses Pakets geben? Vielen Dank.

@ststeiger Könnten Sie mir bitte Zugriff auf das AspNetCore.Reporting-Repository gewähren? Ich versuche, es unter Linux mit PDF zum Laufen zu bringen.

@holajan , @skivsoft :
Sorry, war im Urlaub - war eine schöne Reise nach Singapur und Thailand.
Zugriff gewährt, sollten Sie eine E-Mail an die an gitlab angegebene Adresse erhalten haben.

@azharuddinsayed :

Wenn ich es mit einer .rdlc-Datei versuche, erhalte ich eine Ausnahme
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (von TMemberType, TCellType) .m_memberTreeHostsRemotable 'ist in diesem Kontext nicht verfügbar, da es sich um' Friend 'handelt.' in localreport.Execute ()
Bitte hilf mir

Ich habe es geschafft, diesen Fehler zu reproduzieren.
Folgende Änderungen sind erforderlich:


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)

und

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

Darüber hinaus ist die folgende Korrektur in
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 + "\"")

Dann funktioniert der benutzerdefinierte Code zumindest in meinem Fall.
Im Master aktualisiert.

@ststeiger Danke für den Zugang. Haben Sie eine Idee, wie Sie PDF unter Linux rendern können? Es gibt zu viele Pinvokes, um sie zu ersetzen.

@skivsoft : Es gibt noch keine.
Sie müssen alle Pinvokes durch ein Freetype-Äquivalent ersetzen, was eine Menge Arbeit bedeutet.

Wenn Sie nur ein PDF unter Linux erstellen müssen, können Sie PdfSharpCore oder PdfSharpNetStandard ausprobieren:
https://github.com/ststeiger/PdfSharpCore
https://github.com/ststeiger/PdfSharpNetStandard
Ich benutze beide unter Linux.
PdfSharpNetStandard ist vollständiger, verwendet jedoch auch GDI + / libGDIplus, während PdfSharpCore System.Drawing meidet.

@ststeiger Danke für den Zugang zum Repo.

Ich konnte meinen Bericht in meiner .NET Core 2.2 Windows-App zum Laufen bringen (als PDF exportieren).
Ich habe es auf einer Kopie Ihres ReportViewer_NetStandard-Projekts erstellt, weil ich LocalReports entfernt und InternalLocalReport in LocalReport geändert und die Klasse öffentlich gemacht habe (ich benötigte Zugriff auf die ursprüngliche LocalReport-API).

Für meinen Bericht habe ich zwei Probleme behoben:
Einige Visual Basic-Ausdrücke:
IIf - Ich habe den Import zu Microsoft.VisualBasic.Interaction in _ExprHostBuilder_ hinzugefügt und in netcoreapp2.2 geändert, wobei die Microsoft.VisualBasic.Interaction- Klasse in _Microsoft.VisualBasic.dll_ intern ist, und meine Microsoft.VisualBasic.Interaction- Klasse zu Microsoft.VisualBasic.Interaction hinzugefügt.

Format - Import zu Microsoft.VisualBasic.StringsEx in _ExprHostBuilder_ hinzugefügt, Klasse Microsoft.VisualBasic.StringsEx zu Microsoft.VisualBasic1 hinzugefügt (da die ursprüngliche Klasse Microsoft.VisualBasic.Strings öffentlich ist, jedoch keine Formatfunktion aufweist)

System.Environment.NewLine - Verweis auf System.Runtime.Extensions.dll in _ExprHostCompiler_ hinzugefügt.

Dies sind diese Änderungen im 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

Unterberichte mit Ausdrücken korrigieren:
Ich habe festgestellt, dass Unterberichtselemente ReportExprHost aus dem Hauptbericht und nicht ReportExprHost für einen bestimmten Unterbericht verwenden, sodass Ausdrücke in Unterberichten nicht funktionieren. Ich konnte Fehler in ReportRuntime.LoadExprHostAssembly finden, in ExpressionHost.dll Baugruppen mit Namen zwischengespeichert wurden, aber der Name für alle Berichte und subreports ist immer die gleiche „_ExpressionHost_“. Ich habe dieses Caching entfernt.
Änderungen im 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();
                }
            }

Bitte überprüfen Sie diese Änderungen und wenn dies für Sie sinnvoll ist, nehmen Sie diese Änderungen auch in Ihrem Repo vor.

Vielen Dank.

@holajan : Wenn ich System.String zu den Namespaces hinzufüge, erhalte ich:
Ambigous call to Replace - cannot resolve call
und wenn ich die Microsoft.VisualBasic.Interaction-Klasse hinzufüge, erhalte ich:
ambigous call to Microsoft.VisualBasic.Interaction
wenn ich es in NetCore oder .NET Framework 4 ausführe.
Möglicherweise funktioniert dies nur in .NET Core 2.2.

Wenn es falsch zwischengespeichert wird, wird es besser nicht zwischengespeichert.
Stimmen Sie dieser Änderung zu.
Ich habe den alten Code in #ifdef false (anstatt ihn zu entfernen).

@ststeiger Ich habe meinen Kommentar bearbeitet und für System.String war falsch. Ich habe jetzt Microsoft.VisualBasic.StringsEx stattdessen für Format und andere Funktionen implementiert. Das tut mir leid.

Ja Microsoft.VisualBasic.Interaction funktioniert nur in .NET Core 2.2., Da die Klasse Microsoft.VisualBasic.Interaction in Microsoft.VisualBasic.dll für .NETCoreApp v2.2 intern und in Microsoft.VisualBasic.dll für .NETCoreApp v2.09 enthalten ist öffentlich, aber mit interner Methode IIf .
Ich weiß nicht, wie ich das besser lösen kann, aber mit .NET Core 3.0 wird es wahrscheinlich trotzdem geändert.

@holajan : So lange, lass uns bis 3.0 warten
Ich habe InternalLocalReport veröffentlicht.
Seltsamer Name jetzt in Bezug auf seine Öffentlichkeit;)

@holajan : Microsoft.VisualBasic.StringsEx hinzugefügt, jetzt funktioniert es
Musste IReadOnlyDictionary für .NET 4 hinzufügen, aber das nur als kleine Bemerkung.
Könnten Sie testen, ob das bei Ihnen funktioniert?

@ststeiger Ich habe es getestet.
Ich muss #if falsch ändern in Microsoft.VisualBasic1._Interaction.cs für IIf Ausdruck Arbeit treu #IF.
Ansonsten funktioniert es gut.
Danke

@holajan : OK, so sollte es sein. Vielleicht wäre eine Definition in der Lösung besser.

Jeder in diesem Thread sollte dafür stimmen, dass dies hier hinzugefügt wird: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- Ader

Ab 2019/03 ist es das 7. von den meistgesuchten Funktionen: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Edit: Ab 2019/05 ist es 5. von oben

Edit: Ab 2019/07 ist es das 4. von oben

        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: 'Bei der Verarbeitung lokaler Berichte ist ein Fehler aufgetreten. Für die Codierung von 1252 sind keine Daten verfügbar. Informationen zum Definieren einer benutzerdefinierten Codierung finden Sie in der Dokumentation zur Methode Encoding.RegisterProvider.'

Fügen Sie den folgenden Code hinzu:
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
Es löst mein Problem

Hallo,

Ich habe versucht, einen Bericht in HTML mit dem folgenden Code zu exportieren, aber er wird nicht richtig gerendert.

Die .rdl-Datei enthält ein Diagramm

Ich habe einen Screenshot von HTML angehängt

Wir freuen uns sehr, wenn Sie uns bei der Lösung dieses Problems helfen können.

Vielen Dank

PlatForm: ASP.NET Core

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

string mimtype = "";
int extension = 1;

       LocalReport localReport = new LocalReport(_reportPath);

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



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

Chart_html

@chinturathod : Was zeigt die URL des "Berichtsdiagramm" -Elements?
Der HTML-Renderer verfügt über einen sekundären Ausgabestream für CSS.
Enthält es ein Base64-codiertes Image? Oder ist es nur ein Link zu einem Image-Handler?

@ststeiger
Hallo, bitte finden Sie unten HTML und CSS
HTML:

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







CSS:

"#rsoReportDiv .A97993c8d452f40d4910a317776d607f616xBc {
Rand: 1pt keine Schwarz;
Hintergrundfarbe : Transparent;
}}

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;

}}

Diagrammelement melden
Report chart
Ich denke, dieser Fehler verursacht das Problem

Vielen Dank..

@ststeiger

Hallo, irgendein Update?

@chinturathod :
Ich arbeite derzeit an CEF-pdf als wkhtml2X-Ersatz und an SwissRe-Berichten.

Ich werde frühestens in über zwei Wochen Zeit haben, mich mit diesem Projekt zu befassen.

Gibt es ein Repository (privat oder anderweitig) für das AspNetCore.ReportingServices-Paket, auf das ich Zugriff erhalten könnte?

@clintb : Ich benötige Ihren git LAB- Kontonamen, damit ich Ihnen Zugriff gewähren kann.
Sie erhalten dann eine E-Mail an die E-Mail-Adresse des Git Lab- Kontos, das den Repo-Zugriff enthält.

Hey Stefan, mein gitLab ist c_l_i_n_t. Vielen Dank!

Am Fr, 26. April 2019 um 12:18 Uhr Stefan Steiger [email protected]
schrieb:

@clintb https://github.com/clintb : Ich brauche also Ihren Git LAB- Kontonamen
Ich kann Ihnen Zugang gewähren.
Sie erhalten dann eine E-Mail an die E-Mail-Adresse des Git Lab
Konto mit dem Repo-Zugriff.

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/aspnet/AspNetCore/issues/1528#issuecomment-487133308 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/ABURO5ILQUEGMZARNW2HNALPSM2M5ANCNFSM4CFRN7MQ
.

@clintb : Du

Hallo @ststeiger , wenn Sie so wollen, gewähren Sie bitte Repo-Zugang zu Lotsatrees. Vielen Dank für Ihre Arbeit und Hilfe.

@lotsatrees : Du

Danke Stefan, ich freue mich, dir jederzeit ein gutes Bier zu kaufen.

Hallo @ststeiger , mein Gitlab ist edgardoreyes. Vielen Dank.

@ststeiger
Mein Gitlab ist Ikourfaln
Vielen Dank

@ikourfaln , @edgardoreyes : Ihr zwei hinzugefügt; Sie sollten eine E-Mail an das E-Mail-Konto erhalten haben, das Sie bei gitlab registriert haben.

@ststeiger , wäre es möglich mich auch hinzuzufügen (Mhirji auf gitlab)?

Vielen Dank!!

@Mhirji : Fertig.

Vielen Dank!!!

Warum nicht einfach ein Berichtsserverprojekt erstellen und dieses als Service für jeden Projekttyp verwenden?
Ihr ASP.NET Core-Projekt benötigt nur die URL des Berichtsdienstes, um Berichte anzuzeigen.
Gibt es ein Problem mit diesem Ansatz?

@ststeiger kann ich auch Zugang bekommen? (ConstantDisaster auf gitlab) Vielen Dank im Voraus

@ConstantDisaster : Hinzugefügt.
@mshwf : Nein, genau das möchte ich tun. Wir können also Berichte in unserer eigenen Anwendung ausführen und benötigen keinen Berichtsserver (immer ein Problem mit der Windows-Authentifizierung - aus bestimmten Gründen können IT-Abteilungen keine neuen Benutzer zu einer Gruppe hinzufügen - und immer ein Problem mit deinstallierten Service Packs, die nicht bereit sind, auf die neueste SQL Server-Version zu aktualisieren, weil Kunden eine Version überspringen möchten, Inkonsistenzen zwischen ReportViewer und ReportServer, unserem eigenen Systemadministrator zu faul, um etwas zu installieren usw.). Wie immer fehlt nur die Zeit. Außerdem sind es die ersten sonnigen Sommertage hier in Nordwesteuropa, und ich möchte sie nicht missen.

@ststeiger Gibt es bessere Alternativen? (Ich habe versucht, diesen Thread zu lesen, aber er ist sehr lang!)
Könnten Sie mir auch Zugriff auf das GitLab-Repo (mshwf) gewähren?
Vielen Dank

Bitte unterstützen Sie diese Anfrage , hoffentlich hört Microsoft uns zu!

Hey @ststeiger würdest du mich auch hinzufügen?
Mein Gitlab-Benutzername ist k3flo
Ich danke dir sehr
Vielen Dank 😊

@ststeiger danke fürs hinzufügen, wie

@ConstantDisaster : Es gibt ein "Beispiel" in AnyWebReporting\Any_TestCode\TestReport.cs .
Es zeigt, wie ein Bericht mit Parametern und Datensätzen in eine PDF-Datei gerendert wird.

In einer Nussschale:
1) Erstellen Sie ein Wörterbuch für Berichtsparameter:

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

2) Fügen Sie dem Wörterbuch alle Parameter hinzu, die Sie in Ihrem Bericht haben, z

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

3) Erstellen Sie einen neuen LocalReport-basierten Bericht und laden Sie ihn

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

Anschließend können Sie für alle Datensätze, die nur in Parametern verwendet werden, eine leere Datentabelle hinzufügen (nicht NULL).
lr.AddDataSource("SEL_Standort", new System.Data.DataTable());

Und für jedes verwendete Dataset müssen Sie eine Datentabelle mit dem Ergebnis der Abfrage für dieses Dataset füllen und das Dataset zu den Datenquellen hinzufügen:

lr.AddDataSource("DATA_Schluesselbestandeskontrolle", dt);

Anschließend können Sie den Bericht ausführen, das Ergebnis abrufen und irgendwo schreiben, z. B. Laufwerk d:

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

Ich habe eine HTML-Beispielseite hinzugefügt, die das Design der Berichtsoberfläche von ReportViewer 2014 und 2017 nachahmt, das ich in einer Entwurfsversion hatte. Wenn Sie erneut von git abrufen, finden Sie es in:

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

Und das ist es.
Wenn Sie den Bericht im Web anzeigen müssen, können Sie ihn in HTML rendern, indem Sie die entsprechende Aufzählung in lr.Execute (RenderType.HTML5_0 oder HTML4_0 oder Mhtml) übergeben und die richtige Seitenzahl übergeben. Das Ergebnis (HTML) befindet sich in MainStream und das CSS in SecondaryStream.

Wenn Sie jedoch die index.htm von ReportViewer mit lr.Execute per JavaScript verbinden, müssen Sie dies vorerst selbst tun. Ich bin noch nicht dazu gekommen. Im Moment benötige ich es zum Generieren von PDFs zum Anhängen an E-Mails.

@ k3flo @mshwf : Hinzugefügt.

@mshwf :

@ststeiger Gibt es bessere Alternativen? (Ich habe versucht, diesen Thread zu lesen, aber er ist sehr lang!)

Meines Wissens nicht, sonst würde ich es benutzen.
Vielleicht werden wir diesbezüglich nach der .NET Core 3.1-Version (LTS) etwas sehen , da dann die Möglichkeit besteht, einen Nur-Windows-ReportViewer auf der Basis von .NET Core zu erstellen.

So etwas wäre jedoch genauso bricolage wie dieses Projekt. Vielleicht nehmen sie sich die Zeit, um den gesamten System.Drawing-Code (und WinAPI-Aufrufe von GDI +) zu entfernen und es richtig zu machen, das heißt, plattformübergreifend. Obwohl dies meiner Meinung nach unwahrscheinlich ist. Nicht unglücklich, positiv überrascht zu sein (Husten).

Die Sache ist, dass Berichte VB-Code enthalten können und die VB-Unterstützung in .NET Core (<3) derzeit fraglich ist - bestenfalls. Dies wird (= sollte theoretisch) durch .NET Core 3 behoben werden, und wenn sie einen ReportViewer erstellen, werden sie höchstwahrscheinlich zumindest bis zur LTS-Veröffentlichung warten.

@mshwf :
Sie müssen nicht den gesamten Thread lesen.
Alles, was Sie tun müssen, ist, das Projekt mit einem Git-Klon zu versehen und den Beispielbericht anzuzeigen (Sie haben jedoch nicht die Datenbank, um es auszuführen).

Könnten Sie mich bitte auf Gitlab hinzufügen?
dcga

@dcga : Hinzugefügt.

Hallo, könntest du mich zu deinem Gitlab hinzufügen? Ich konvertiere jetzt einen Bericht in ein ASP.net Core-Projekt.

@ ericyu67 : Ich nehme an, dein Gitlab-Kontoname ist ericyu? In diesem Fall wurden Sie hinzugefügt.

Das ist richtig, danke.

@ststeiger könntest du mich bitte hinzufügen?
Rodrigorrl

@rodrigorrl : hinzugefügt.

@ststeiger könntest du mich bitte hinzufügen?

@myersBR : Fertig.

@ststeiger kannst du mich bitte hinzufügen?

@acofalc: Added @aco.mit

Hallo, @ststeiger bitte füge mich hinzu: oblin228, danke.

Gibt es darüber irgendwelche Neuigkeiten? Ich verwende ASP.NET Core und lehne es ab, zu Webformularen zurückzukehren. Ich habe ein Berichtsprojekt und füge die URL vom Berichtsserver meiner Anwendung zu, um die Datei herunterzuladen. Das Problem ist, dass es ständig nach Windows-Authentifizierung fragt und ich dies vermeiden möchte ...

@oblin : Hinzugefügt.

@jfcaldeira : Solange Sie die Anwendung unter Windows ausführen, sollte der Reportviewer unter gitlab mehr oder weniger funktionieren (offenes Problem mit Bildern in HTML-Ausgabe, bisher). Führen Sie es unter Linux aus, und es sollte funktionieren, solange Sie nicht PDF, TIFF oder PowerPoint als Ausgabeformat verwenden (Sie kennen kein Wort), aber Excel, HTML, XML und JSON funktionierten auch unter Linux (in Mein 1-Bericht-Test - kann nicht sagen, ob nichts explodiert, wenn Sie den gesamten Funktionsumfang nutzen.

Wenn Ihr Problem jedoch die Windows-Authentifizierung unter SSRS ist, verwenden Sie die benutzerdefinierte Sicherheit (auch bekannt als SSRS-Formularauthentifizierung).

Siehe hierzu:
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

Möglicherweise müssen Sie den Benutzer mit einem Formularbeitrag in JavaScript anmelden und eine P3P-Richtlinie (in SSRS über das http-Modul) festlegen, damit das SSRS-Auth-Cookie im IE über Domänen hinweg bestehen bleibt ... (Hinweis: Wenn Sie virtuelle Verzeichnisse verwenden und 2 Anwendungen auf einem SSRS haben, überschreibt das Auth-Cookie von application1 [das sich in der SSRS-Domäne befindet] das Auth-Cookie von application2, das sich ebenfalls in der SSRS-Domäne befindet.

@oblin : Hinzugefügt.

@jfcaldeira : Solange Sie die Anwendung unter Windows ausführen, sollte der Reportviewer unter gitlab mehr oder weniger funktionieren (offenes Problem mit Bildern in HTML-Ausgabe, bisher). Führen Sie es unter Linux aus, und es sollte funktionieren, solange Sie nicht PDF, TIFF oder PowerPoint als Ausgabeformat verwenden (Sie kennen kein Wort), aber Excel, HTML, XML und JSON funktionierten auch unter Linux (in Mein 1-Bericht-Test - kann nicht sagen, ob nichts explodiert, wenn Sie den gesamten Funktionsumfang nutzen.

Wenn Ihr Problem jedoch die Windows-Authentifizierung unter SSRS ist, verwenden Sie die benutzerdefinierte Sicherheit (auch bekannt als SSRS-Formularauthentifizierung).

Siehe hierzu:
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

Möglicherweise müssen Sie den Benutzer mit einem Formularbeitrag in JavaScript anmelden und eine P3P-Richtlinie (in SSRS über das http-Modul) festlegen, damit das SSRS-Auth-Cookie im IE über Domänen hinweg bestehen bleibt ... (Hinweis: Wenn Sie virtuelle Verzeichnisse verwenden und 2 Anwendungen auf einem SSRS haben, überschreibt das Auth-Cookie von application1 [das sich in der SSRS-Domäne befindet] das Auth-Cookie von application2, das sich ebenfalls in der SSRS-Domäne befindet.

Hallo, danke, dass Sie auf mein Problem geantwortet haben. Ich habe auf gitlab noch nichts von diesem Reportviewer gehört. Können Sie mir einen Anker dafür zeigen?

Bei der Windows-Authentifizierung besteht das Problem darin, dass der Benutzer mithilfe der Cookie-Authentifizierung in meinen Anwendungen in ASP.NET Core authentifiziert wurde. Die Problemumgehung, um Benutzer zum Zugriff auf den Bericht zu bewegen, besteht im Wesentlichen darin, die direkte URL mit Parametern an die href eines Ankers zu übergeben und wählen Sie auch PDF als Format. Ich habe versucht, einen Weg zu finden, um den Benutzer nicht um Authentifizierung zu bitten, da es für den Endbenutzer ärgerlich ist, sich zweimal authentifizieren zu müssen. Ich verwende bereits ein bestimmtes Konto nur für den Zugriff auf Datenquellen.

Hallo, @ststeiger - mein Gitlab ist Arunputhran. Können Sie mir bitte Zugang gewähren? Danke vielmals!

Reposting dies, weil es in allen "Gib mir Zugang zu Gitlab" -Anfragen begraben wurde.

Jeder, der auf diesen Thread stößt, sollte dafür stimmen, dass .NET Core SSRS hier hinzugefügt wird: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for -asp-net-core

Begonnen von oben auf Platz 7 und von oben auf Platz 4 gestiegen, die am häufigsten nachgefragte SQL Server-Funktion (https://feedback.azure.com/forums/908035-sql-server?category_id=325159).

Bearbeiten: Aufgrund dieses Beitrags ist es jetzt bis zum 3. Platz

Ich bin mir nicht sicher, ob es überhaupt hilft ...

@arunputhrankyc : Hinzugefügt.

@ k290 :
Anscheinend haben sie noch nichts von SQL-ops-studio / AzureDataStudio gehört .

Ich denke, in diesem Sinne sollte jemand dieser Wunschliste ein flaches Design hinzufügen, nur als Scherz.
Leider ist es noch nicht der 1. April: zwinker:

Übrigens bekomme ich Berichte als PDF von einer Web-API und verwende keine Wcf-Bits.
nur Seife / Asmx-Anrufe und http-Anrufe.
Dabei übergebe ich Credentails ohne Probleme.
Mein Code ist asp.net 4.6 / web api 2
Wenn du sehen willst, was ich mache, kann ich nächste Woche Code auf einen Github setzen, damit du ihn auschecken kannst.
Ich rufe Report Server 2016 an, aber das meiste, was ich tue, funktioniert mit den älteren ssrs-Versionen.

Hallo, ich habe Ihren Kommentar gelesen, wie Sie mit SSRS umgehen. Ich mache auch etwas Ähnliches. Ich habe einen Anker in einer ASP.NET Core-Anwendung, der die URL direkt zum Bericht mit den enthaltenen Parametern und der Formaterweiterung enthält. Das Problem ist jedoch, dass die Windows-Authentifizierung angefordert wird. Gibt es eine Möglichkeit, dies nicht mehr zu fragen, da sich Benutzer bereits mithilfe der Cookie-Authentifizierung bei meiner App angemeldet haben? Es ist mir nicht einmal wichtig, den Bericht anzuzeigen, solange er heruntergeladen wird, aber es wäre schön, die Authentifizierung zu überspringen

@arunputhrankyc : Hinzugefügt.

@ k290 :
Anscheinend haben sie noch nichts von SQL-ops-studio / AzureDataStudio gehört .

Ich denke, in diesem Sinne sollte jemand dieser Wunschliste ein flaches Design hinzufügen, nur als Scherz.
Leider ist es noch nicht der 1. April 😉

Nun, ich würde sicher für ein dunkles Thema für SSMS töten, aber ich würde meine bloßen Hände für dieses SSRS essen. Der Arbeitsaufwand durch das Rendern gruppierter Daten direkt aus SQL ist erstaunlich.

Tolle Lösung, bitte füge mich in gitlab hinzu: @kholossok , danke

Bitte füge mich auch in gitlab hinzu: @EMaderbacher

@kholossok , @EMaderbacher : Hinzugefügt.

Füge mich bitte auch hinzu @jfcaldeira

@jfcaldeira : Du musst mir einen Git Lab Account geben.
Dies ist ein Git- Hub- Konto.
Es ist kostenlos. https://gitlab.com
Private Repositories waren zu dieser Zeit auf Github nicht kostenlos.

@ststeiger
Private Repositories sind jetzt auf GitHub kostenlos, die Anzahl der Mitarbeiter ist begrenzt.

@jfcaldeira : Du musst mir einen Git Lab Account geben.
Dies ist ein Git- Hub- Konto.
Es ist kostenlos. https://gitlab.com
Private Repositories waren zu dieser Zeit auf Github nicht kostenlos.

Ich habe ein Konto mit demselben Benutzernamen erstellt

@jfcaldeira : Hinzugefügt. Sie sollten eine E-Mail mit den Zugangsinformationen erhalten haben.
@ikourfaln : Ich weiß. Ich wusste nicht, dass es eine Beschränkung auf 3 Mitarbeiter in privaten Github-Repos gibt. Gut zu wissen, danke .

Gitlab-Einschränkungen:

Um die guten Nachrichten von heute zu feiern, haben wir unser Speicherlimit pro Repository auf GitLab.com dauerhaft von 5 GB auf 10 GB erhöht. Nach wie vor sind öffentliche und private Repositorys auf GitLab.com unbegrenzt, haben kein Übertragungslimit und umfassen unbegrenzte Mitarbeiter.

Darf ich bitte auch hinzugefügt werden? Mein GitLab-Konto ist barryjsilver. Vielen Dank!

Kann ich bitte bitte hinzugefügt werden? @jyanosu Danke!

@BarryJSilver : Hinzugefügt.

@jyanosu : Ich brauche den Account von git lab .com, nicht github.

@ststeiger Whoops, einfach einrichten .. gleicher Benutzername @jyanosu

@jyanosu : Hinzugefügt.

@ststeiger kannst du mein gitlab account hinzufügen @ kanichi123
Vielen Dank!

@ kanichi123 : Hinzugefügt.

@ststeiger bitte mein account zu sheryever

@sheryever : Hinzugefügt.

@ststeiger bitte kannst du mein gitlab account hinzufügen @PentaTech
Vielen Dank!

@ststeiger könntest du mich auch hinzufügen? @glebteterin
Vielen Dank!

@ PentaTech , @ g-rad: hinzugefügt.

@ststeiger gute Mühe, könntest du bitte gitlab account brad0000 hinzufügen?

@ brad0000 : Fertig.

Hallo @ststeiger , kannst du mich auch hinzufügen? Gitlab-Konto: Wyepez. Vielen Dank

@ Wyepez : Hinzugefügt.

@ststeiger Kannst du mich bitte auch hinzufügen?

Gitlab-Benutzername: choudeshell

@choudeshell : Hinzugefügt.

Kannst du mich bitte hinzufügen? Vielen Dank!

Funktioniert Ihre Lösung mit .rdlc (sowie serverseitiger .rld)? Vielen Dank

Funktioniert Ihre Lösung mit .rdlc (sowie serverseitiger .rld)? Vielen Dank

@mpirritano : Ja, tatsächlich gibt es keinen großen Unterschied zwischen RDL und RDLC.
Aber es ist nur Web. Keine Windows-Forms.
Ich brauche ein Git- Lab- Konto, um dich hinzuzufügen, nicht Github.

@ststeiger Danke - Ich habe jetzt ein GitLab-Konto erstellt : @mdpirrit

Das ist großartig - ich brauche es nur für ASP .NET Core, das auf .NET Core abzielt. Vielen Dank!

@mpirritano : Hinzugefügt, Sie sollten eine E-Mail an das E-Mail-Konto erhalten haben, mit dem Sie gitlab registriert haben.

Ich habs; Vielen Dank!

@ststeiger es funktioniert großartig, außer es kann keine Datei oder Assembly konnte nicht geladen werden" angezeigt. System.Windows.Forms, Version = 4.0.0.0 "

Ist dies eine bekannte Einschränkung oder fehlt mir etwas?

Vielen Dank

@ststeiger Es scheint auch nicht so, als ob Unterberichte unterstützt werden. Das heißt, es scheint keinen Eventhandler für die Verarbeitung von Unterberichten zu geben, mit dem der Unterberichtsinstanz Datenquellen hinzugefügt werden können

Vielen Dank

Kannst du mich bitte hinzufügen? Vielen Dank! @ashabyralieva

Funktioniert Ihre Lösung mit .rdlc (sowie serverseitiger .rld)? Vielen Dank

@mpirritano : Ja, es gibt wirklich keinen großen Unterschied zwischen RDL und RDLC.
Dies ist jedoch nur ein Netzwerk. Keine Windows Forms.
Ich benötige einen Git Lab- Account, um dich hinzuzufügen, nicht GitHub.

Kannst du mich hinzufügen? Vielen Dank! @ashabyralieva

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

@mpirritano :

Ist dies eine bekannte Einschränkung oder fehlt mir etwas?

Ja, eine Einschränkung, von der ich wusste, dass sie existieren könnte.
Außerdem gibt es ein Problem mit der Bildausgabe in HTML.
Offene Punkte.
Ich habe noch nicht einmal an Unterberichte gedacht.
Leider haben wir auch einige davon, daher wird dies auch mein Problem sein.
Apropos, ich weiß nicht einmal, wie Unterberichte im normalen ReportViewer im gesamten Framework behandelt werden, zumal sie rekursiv sein können.

Wahrscheinlich liegt irgendwo ein Problem vor, da "System.Windows.Forms, Version = 4.0.0.0" in dieser Version in .NET Core nicht vorhanden ist und die Assembly stattdessen im ReportViewer für System.NetStandard.Forms heißt .NET Core. Könnte mit einem vollständigen Framework funktionieren, da dort System.Windows.Forms, Version = 4.0.0.0 vorhanden ist.

Das Problem mit System.Windows.Forms kann wahrscheinlich so einfach behoben werden, wie der Name und die Version der Assembly (wo immer sie sich im Quellcode versteckt) in ein ifdef zu setzen, die Unterberichte eher nicht, denke ich.

Ich muss diese Woche noch einen Dienst zum Senden von Berichten beenden, damit ich mir nächste Woche möglicherweise das Problem mit System.Windows.Forms ansehen kann.

Was Unterberichte angeht: Sie sind sowieso eine schlechte Idee, verursachen häufig Probleme mit PDF und Excel, und falls Sie nur einen Bericht haben, würde ich empfehlen, zu prüfen, ob es nicht möglich ist, den Unterbericht irgendwie vollständig zu entfernen und alles in einem Bericht enthalten.

Добавлено
Wie bekomme ich die Datenbank COR_Basic_SwissLife_UAT?

: rofl: Haha, gut, du nicht, diese DB ist vertraulich.
Sie können jedoch mithilfe Ihrer eigenen Datenbank einen eigenen Beispielbericht erstellen.
Sie sollten anhand des Beispiels sehen, wie es verwendet wird.

@ststeiger Danke. Tatsächlich sehe ich, dass in AsNetCore.Reporting.InternalLocalReport ein SubreportProcessing-Ereignis definiert ist. Ich kann versuchen, eine öffentliche Schnittstelle dafür zu erstellen und zu prüfen, ob ich Datenquellen an Unterbericht-Intances übergeben kann. Ich komme vielleicht erst nächste Woche dazu ...

Ich versuche auch, Unterberichte zu vermeiden, aber ich habe sie für notwendig befunden, wenn Sie einen sich wiederholenden Abschnitt innerhalb eines sich wiederholenden Abschnitts benötigen. In Bezug auf Excel ist es möglich, jede Unterberichtinstanz als Arbeitsblatt in Excel mit rdlc / rdl zu rendern

Reposting dies für Neulinge.

Jeder in diesem Thread sollte dafür stimmen, dass dies hier hinzugefügt wird: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- Ader

Im März dieses Jahres war es der 7. von oben.

Jetzt haben wir den zweiten Platz in den SQL Server-Vorschlägen erreicht: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Können wir den Dunklen Modus schlagen?

@ststeiger Ich hatte heute tatsächlich etwas Zeit und konnte erfolgreich Berichte mit Unterberichten in .docx, .xlsx und .pdf rendern.

Als schnellen Test für meine lokale Kopie habe ich den Zugriffsmodifikator der Eigenschaft "localReport" der Klasse "LocalReport" von "intern" in "öffentlich" geändert. Dann könnte ich wie immer einen Handler für das Ereignis "SubreportProcessing" schreiben (wobei ich den Wert des Parameters in die Unterberichtsinstanz einlesen und damit ein Dataset filtern würde, das ich an die Datenquelle der Unterberichtsinstanz übergeben würde).

Ich habe keine Ahnung, wie das Problem beim Rendern von Diagrammen mit .NET Core behoben werden kann. Wenn Sie also jemals eine Lösung finden könnten, wäre das erstaunlich. Abgesehen davon denke ich, dass Ihre Lösung alles tut, was ich brauche (ich persönlich rendere niemals Berichte im HTML-Format).

Vielen Dank

Exportwort, Excel nicht wachen?
FormatException: Der Header enthält ungültige Werte am Index 0: ''

Der Service ist sehr langsam. was kann man machen Bitte helfen Sie ....

Hallo allerseits, ich habe gerade einen benutzerdefinierten Port des Report Viewer-Steuerelements mit der in SSRS integrierten ReportExecutionService.asmx geschrieben und auf ASP.NET MVC abgezielt. Ich hatte jemanden vorgeschlagen, es auf .NetCore & MVC zu portieren, also habe ich das abgeschlossen. Probieren Sie es aus und lassen Sie mich wissen, was Sie denken: https://github.com/alanjuden/MvcReportViewer

Alan

Exportwort, Excel nicht wachen?
FormatException: Der Header enthält ungültige Werte am Index 0: ''

Der Service ist sehr langsam. was kann man machen Bitte helfen Sie ....

@azikaa : Verwenden Sie MvcReportViewer oder AspNetCore.ReportViewer?

Wir schließen dieses Problem, da es für dieses Repo nicht direkt relevant ist. Aufgrund der Kommentare hier ist dem SSRS-Team dieses Feedback bereits bekannt. Angesichts der Anzahl der Kommentare ist dies jetzt nicht mehr zu handhaben.

Die Antwort von @ k290 ist hier die umsetzbarste. Bitte folgen Sie seinem Vorschlag hier :

Reposting dies für Neulinge.

Jeder in diesem Thread sollte dafür stimmen, dass dies hier hinzugefügt wird: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- Ader

Im März dieses Jahres war es der 7. von oben.

Jetzt haben wir den zweiten Platz in den SQL Server-Vorschlägen erreicht: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Können wir den Dunklen Modus schlagen?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen