Aspnetcore: Pelaporan Inti Asp.Net (SSRS)

Dibuat pada 2 Jun 2016  ·  269Komentar  ·  Sumber: dotnet/aspnetcore

Saya sedang mengerjakan aplikasi ASP.NET Core dan tidak dapat menemukan solusi untuk menampilkan laporan SSRS. Dengan absennya "Microsoft.Reporting.WebForm" tidak lagi berfungsi. Apa praktik terbaik untuk menampilkan laporan SSRS di web di ASP.NET Core

External

Komentar yang paling membantu

Hampir 2 tahun. Core 2.0 dirilis. Tim SSRS, bangun.

Semua 269 komentar

Dengan Core masih berada di RC (RTM pada akhir bulan), saya tidak berpikir bahwa skenario SSRS direncanakan dalam 6 bulan ke depan tetapi saya bukan bagian dari tim.

Saya akan menghasilkan laporan tersebut di sisi klien dengan menggunakan beberapa perpustakaan javascript atau membuat laporan tersebut sebelumnya.

Jika Anda membutuhkan sesuatu yang lebih "terintegrasi", Anda dapat melihat paket komunitas ini:

https://github.com/ilich/MvcReportViewer

Dengan melihat masalah https://github.com/ilich/MvcReportViewer/issues/121 , mereka tertarik untuk mengintegrasikannya tetapi sejauh ini tidak berhasil.

Saya tidak mengerti mengapa inisiatif inti dotnet dan ASP.net tetap diam tentang masalah ini pada semua pengumuman sebelumnya. Ini seperti
[Pelaporan bukanlah perhatian utama bagi pengembang dan mereka dapat menanganinya menggunakan kelas html dan print css]
saat ini kami sedang memigrasi erp kecil dengan banyak file ssrs rdlc dan pendekatan css tidak memberikan hasil yang baik dalam pelaporan lintas browser.
di sisi lain, minggu lalu microsoft merilis ssrs 2016 dengan html5 viewer murni yang menghilangkan kebutuhan untuk instalasi activex [yang merupakan satu-satunya downside untuk menggunakan ssrs pada browser non-ie]
ssrs 2016 viewer sangat cocok dengan core eco system asp.net dengan sempurna
tetapi tidak ada pernyataan resmi mengenai dukungan inti asp.net yang diumumkan.

apakah semuanya diblokir oleh System.Drawing ?? karena itextsharp belum merilis perpustakaan sampai sekarang.
jika itu adalah System.Drawing maka setidaknya implementasi windows dapat diselesaikan sebelum [linux dan OSX] untuk meningkatkan adopsi untuk pengembang windows saat ini daripada menunggu implementasi lintas platform penuh untuk System.Drawing

Saya harap posting ini akan membuat tim mempertimbangkan kembali beberapa prioritas untuk mengaktifkan ssrs dalam inti asp.net

sehubungan dengan MvcReportViewer yang disebutkan di posting sebelumnya (ini adalah pembungkus di sekitar penampil formulir web) dan itu membantu banyak pengembang mvc di masa lalu untuk mengatasi kurangnya penampil laporan mvc di mvc1 ke mvc5 [Terima kasih banyak ilich], saya berharap untuk melihat solusi lengkap karena ssrs bukanlah prioritas kelas satu dan orang-orang terus memikirkannya di mvc pra-inti.

Tolong pengembang,
meneruskan masalah ini kepada kolega Anda untuk mengomentarinya.
ini mungkin memberikan prioritas untuk itu dan memotivasi tim untuk melakukan sesuatu.

@ ddddddddeee22211 Ini adalah V1.

Anda tidak mengirim dengan dukungan SSRS pada awalnya. Dukungan dengan SSRS mungkin akan datang dari tim SSRS dan bukan tim .NET. Karena kami bahkan belum keluar dari RC, saya tidak melihat ini sebagai fitur penting di V1.

Jika Anda perlu melakukan laporan, bolehkah saya merekomendasikan untuk menjalankan versi formulir web saja? Ya. Sudah tua. Tapi setidaknya itu berhasil dan didukung.

Jika Anda membutuhkan laporan X-Plat, saya akan merekomendasikan sesuatu seperti Chartist . Ini memungkinkan Anda untuk menghasilkan grafik langsung di klien. Tambahkan file CSS untuk keperluan pencetakan dan boom. Anda memiliki laporan yang bisa dicetak.

dari sudut pandang Anda, ini mungkin tidak kritis
tetapi beberapa pengembang lain menganggapnya sangat penting untuk proyek mereka karena begitu mereka mengembangkan aplikasi dan menjalankannya, tugas pengembangan ditahan dan tugas pelaporan menjadi tugas rutin harian. juga beberapa proyek menangani pembuatan laporan ke tim BI (intelijen bisnis) yang tahu cara menggunakan ssrs tetapi tidak memiliki ide tentang inti asp.net.

tujuan posting saya adalah untuk memahami posisi SSR dalam sistem eko ​​inti asp.net. atau jika akan diabaikan seperti pada mvc1 hingga mvc5. Tim ssrs berada dalam microsoft dan tim inti asp.net dapat mendiskusikan masalah ini dengan mereka.
Yang membuat saya gila adalah ketika saya melihat catatan rilis ssrs 2016 minggu lalu tanpa menyebutkan apa pun tentang inti asp.net. sementara di sisi lain Anda melihat dukungan berkelanjutan untuk azure dalam asp.net core. percayalah jika kami tidak meningkatkan permintaan untuk ssrs, itu akan diabaikan seperti pada mvc 5 sebelumnya.

saran Anda tentang penggunaan formulir web adalah contoh tentang memperlambat penerapan inisiatif inti. setidaknya jika saya memiliki pernyataan tentang apakah itu akan didukung atau tidak, saya akan dapat membuat keputusan strategis tentang hal itu.

terima kasih atas tip obrolan. Saya akan memeriksanya dan saya harap Anda memahami sudut pandang saya.

@ ddddddddeee22211 Ahhh ... kalau begitu aku tidak bisa menjawab.

Saat ini, satu-satunya cara untuk membuat komponen SSRS berfungsi di ASP.NET adalah di WebForms.

Jika Anda menginginkan posisi strategis mereka atau jika mereka akan mendukungnya, kami harus menunggu karyawan MS menjawab.

Mungkin kita bisa / cc @coolcsh ? Dia mungkin tidak menjawab di sini tetapi posting blog yang menjelaskan posisi itu akan menyenangkan.

Dalam tim SSRS, kami menyadari keterbatasan ASP.NET WebForms dan kami secara aktif menyelidiki dan bekerja dalam opsi baru untuk kontrol Penampil Laporan
Terima kasih

@jtar

Terima kasih atas jawabannya!

Kami sudah menginginkan alternatif sejak MVC. :menjulurkan lidah mengedip mata:

Hal itu membuat hari saya menyenangkan. [~ akhir bahagia ~]
Terima kasih @jtarquino , @MaximRouiller untuk semua upaya.

@jtar
Kedengarannya bagus :-)

Dapatkah Anda mengatakan sesuatu tentang kapan Anda akan merilis versi pertama "opsi baru" untuk Kontrol Penampil Laporan?
(Apakah ada peta jalan / rencana untuk ini?)

Br.
Boe

Sayangnya, saya tidak memiliki jadwal untuk dibagikan saat ini

sudahkah Anda mencoba menggunakan Library dengan menginstal Package di Package Manager Console dan ketik perintah berikut ke dalam jendela perintah.

PM> Instal-Paket ReportViewerForMvc
meskipun saya telah mencoba di formulir web dan tampilannya cukup bagus.

untitled

@bethwellag
sekali lagi nyalakan kesalahan " ketergantungan ReportViewerForMvc tidak mendukung kerangka kerja .NetCoreapp "
catatan:
mengerjakan proyek ASP.NET Core

@jtarquino ping ini. Sepertinya ada lebih banyak minat: https://github.com/aspnet/Mvc/issues/5332

@jtarquino BTW jika Anda ingin memulai diskusi dengan tim saya, silakan email saya dan kita bisa mengobrol.

Ohhh saya suka! Bolanya bergulir! 😀

Halo semuanya, saya baru saja selesai menulis port kustom dari kontrol penampil laporan menggunakan ReportExecutionService.asmx yang dibangun ke dalam SSRS dan saya menargetkan ASP.NET MVC. Saya meminta seseorang untuk memindahkannya ke .NetCore & MVC jadi saya telah menyelesaikannya. Cobalah dan beri tahu saya pendapat kalian: https://github.com/alanjuden/MvcReportViewer

Alan

Sepertinya sudah sekitar tiga bulan sejak ReportViewer di ASP Netcore MVC dibahas di sini. Saya bekerja dengan versi yang disediakan Alan Juden dalam proyek yang saya pindahkan dari WinForms ke netcore. Apakah ada tanda-tanda Microsoft sedang melangkah untuk menyediakan dukungan SSRS ReportViewer kelas satu atau apakah mereka meletakkan SSRS di lemari yang sama dengan yang mereka gunakan pada Visual FoxPro beberapa tahun yang lalu?

Ada kemajuan MS? Pilihan terbaik untuk saat ini adalah menggunakan alat pihak ketiga seperti Telerik Reports untuk rendering browser dan backend SSRS untuk langganan laporan. Mungkin seperti yang ddddddddeee22211 tulis, SSRS 2016 sudah memiliki kemampuan melalui mesin rendering HTML5 tetapi tidak ada dokumentasi?

Hei @Eilon.

Ada berita sejak September? Apalagi karena kalian sekarang sudah meluncurkan 1.0 (selamat!), Tekanan pasti turun sedikit.

Ada yang bisa Anda bagikan?

/ cc @jtarquino

Belum ada yang bisa saya bagikan, begitu saya memiliki berita tentang inti .NET, Anda akan menjadi orang pertama yang mengetahuinya.
Seperti yang Anda sebutkan, kami baru saja merilis nuget terbaru untuk ASP.NET Webforms dan kontrol Winforms

Saya ingin menambahkan permintaan saya ke tim juga ... Ini adalah masalah besar. Saya menghargai solusi AlanJuden, tetapi kami membutuhkan solusi "resmi" ... Mengingat inti 1 telah keluar selama berbulan-bulan sekarang, akan sangat membantu untuk mengetahui status ini. Jika Anda bisa memberi kami kabar di timeline untuk solusi, itu akan menjadi sesuatu. Masalah ini cukup besar sehingga akan mencegah kami menggunakan inti mvc. Satu catatan. Kami benar-benar membutuhkan solusi yang mengatasi kebutuhan pengguna untuk masuk ke server ssrs. Inilah mengapa proyek saya harus menggunakan reportviewer saat ini (menggunakan reportviewer kami memiliki proyek mvc menyediakan login standar ke server ssrs untuk semua pengguna)

Sql server 2017 adalah pratinjau komunitas2 sekarang
Dan
Rilis standar bersih 2.0 ditutup dengan pengumuman terbaru
Dan masih belum ada kabar tentang penampil layanan pelaporan inti asp.net asli
Harap undang pengembang lain ke masalah ini untuk memberikan umpan balik dan membuat tim sadar akan perlunya upaya untuk kerangka kerja mahakarya yang diimpikan setiap pengembang.

@jtarquino : apakah ada forum atau pilihan pengguna untuk SSRS?
bagaimana cara pengguna menghubungi tim SSRS?

Terima kasih, saya benar-benar ingin mendapatkan bantuan agar aplikasi baru saya berfungsi dengan SSRS.
Apakah ada cara untuk mendapatkan kode yang digunakan oleh kontrol formulir web untuk halaman aspx untuk disobek?
Saya ingin melihat apakah saya bisa membuat tampilan sudut 2 yang "berfungsi seperti" dan "terlihat seperti" kontrol formulir web.

Hai,

Kami ingin memigrasi beberapa situs web kami dll ke inti asp.net tetapi beberapa menyertakan Kontrol Penampil Laporan SSRS. Apakah ada kemajuan pada kontrol penampil laporan untuk inti .net?

Terima kasih
Tim

jika Anda menargetkan Full .NET 4.x dan bukan .NET Core, pertimbangkan # 2022 ini sebelum pindah ke ASP.NET Core.
ASP.NET Core 2 tidak akan mendukung Full .NET 4.x

@tokopedia Agak diperdebatkan tahap ini melihat tidak ada reportviewer di inti asp.net untuk dipecahkan. Dengan perubahan yang akan datang di Q3 di asp.net core 2 serta .net standar 2 dengan shims kompatibilitas yang memungkinkan penargetan kerangka kerja .net, saya pikir sangat tidak mungkin Microsoft akan menulis reporter untuk inti asp.net saat ini. 1.1.

Saat ini saya telah mencoba masuk ke ekstensi autentikasi untuk SSRS dan ternyata berantakan untuk dicoba dan diubah, Anda dapat memasukkan auth / login baru tetapi kemudian ketika Anda mencoba mengaktifkan CORS sehingga aplikasi web dapat memanggil SSRS untuk menjalankan laporan, browser tidak bisa mendapatkan OPTIONS permintaan preflight untuk bekerja dan itu mengakhiri seluruh gagasan itu.

jadi sekarang saya membuat aplikasi web formulir web yang saya tambahkan dukungan OpenId Connect sehingga saya dapat memiliki SSO yang bekerja antara aplikasi sudut baru saya yang mengkilap dan laporan saya

maka saya akan melihat apakah saya bisa membawa mereka bersama dengan peretasan iframes atau cara lain.

berharap microsoft akan memperbarui ssrs untuk bermain lebih baik dengan teknologi web baru.

Pemikiran lain: Laporan KPI dan Seluler SSRS: apakah ada cara untuk menggunakannya di aplikasi web ??

@alanjuden Adakah kesempatan untuk mengkonfigurasi paket Anda untuk mengaktifkan rendering laporan rdlc? Memasang Server Pelaporan dan mengelolanya untuk setiap klien sangat merepotkan.

@IonRobu , saya mungkin gila ... tapi saya tidak segila itu! : P

Alasan sebenarnya mengapa saya tidak akan melakukan itu adalah karena saya hanya menjadi penampil ujung depan penampil laporan. Saya mengandalkan SSRS sepenuhnya untuk membuat laporan dan mengembalikan data laporan melalui SSRS API. Jadi itu membutuhkan backend server laporan. Maaf, tapi itu akan menjadi pekerjaan yang jauh lebih banyak daripada yang ingin saya lakukan dalam proyek ini. Saya membuat MvcReportViewer saya sebagai solusi mudah untuk mengatasi kesulitan membawa versi kontrol ASP.NET WebForms.

Report Server atau RDLC yang disebut "laporan klien"
server laporan lebih banyak bekerja untuk mengatur dan mengelola ya itu benar.
tetapi memiliki sejumlah manfaat:

laporan dibuat di server ujung belakang, yang mengambil beban kerja dari server web ujung depan.
hasil laporan dapat diuangkan dan dapat mengurangi beban kerja server sql produksi Anda.
laporan kompleks dapat dijalankan sesuai jadwal dan bekerja pada saat beberapa pengguna berada di sistem dan
permintaan kemudian dapat disajikan dari snapshot yang telah dikompilasi sebelumnya itu.
juga menggunakan SSRS, string koneksi server sql tetap di server laporan dan tidak perlu dikelola di file konfigurasi server web
juga server SSRS menjadi titik pusat yang dapat dipublikasikan oleh penulis laporan dan semua pengguna bisa mendapatkan laporan dari server.
SSRS dapat mengatur pengiriman laporan melalui email secara otomatis kepada pengguna, Anda dapat mengirim tautan melalui email ke server laporan untuk beberapa pengguna dan file pdf, word atau excel ke yang lain.

juga meningkatkan skala, jika Anda perlu melayani lebih banyak pengguna, Anda mungkin perlu menambahkan lebih banyak server web sebelum Anda membutuhkan lebih banyak server laporan, Anda tidak perlu menyalin file rdlc dalam jumlah besar ke semua server web.

jadi ya jika Anda hanya memiliki sedikit laporan dan tidak membutuhkan manfaat apa pun, Anda dapat menggunakan rdlc.
tetapi untuk sistem yang lebih besar yang perlu menyajikan banyak laporan ke banyak pengguna, server SSRS memiliki beberapa manfaat yang sangat bagus.
juga bahwa api SSRS sangat kuat untuk digunakan, Anda dapat memanggil api untuk mengembalikan pdf laporan misalnya tanpa perlu memiliki formulir web sisi klien atau kontrol penampil mvc.
api juga dapat mengelola laporan, mengunggahnya ke server, mengatur izin dan membuat daftar laporan.
di tempat kerja saya menggunakan api untuk memungkinkan aplikasi klien kami membuat daftar laporan yang dapat dijalankan pengguna, untuk memeriksa parameter yang dibutuhkan laporan dan kemudian menjalankan laporan untuk pengguna.

jadi perhatikan baik-baik manfaatnya tidak hanya di overhead admin.

@jogja_lowker
Laporan klien unggul dalam konteks yang berbeda dari yang Anda deskripsikan
Banyak klien tidak menggunakan server laporan dan tidak memiliki personel yang memenuhi syarat untuk mengelola dan memelihara masalahnya
Juga ketika Anda mengirimkan produk dengan laporan yang disesuaikan (60+) untuk setiap klien, Anda menghadapi overhead penerapan aplikasi + laporan penerapan
Banyak pengguna bukan teknisi yang dapat memahami laporan yang dihasilkan oleh server dan ditampilkan sesuai respons tanpa melihat pratinjau terlebih dahulu (faktur misalnya dapat diverifikasi melalui penampil dengan mudah daripada mengunduh beberapa faktur yang diperbaiki ke tab yang berbeda)

Seperti yang Anda lihat, mudah bagi pengguna untuk beradaptasi dengan penampil laporan sederhana daripada skenario yang rumit
Juga dikembangkan menghabiskan banyak usaha untuk mengembangkan laporan klien dan sekarang mereka menjadi tidak berguna dalam penggunaan sebenarnya

Saya harap tim Microsoft memahami rasa sakit kami

Tidak begitu yakin saya mendapatkan semua yang Anda katakan tetapi ya laporan klien berguna, saya hanya menguraikan alasan server, mengapa itu mungkin layak untuk dilihat. Jarak tempuh Anda mungkin berbeda dan semua itu.

hari ini standar bersih 2 dirilis dengan lebih banyak permukaan api untuk system.drawing
mungkinkah ini kesempatan untuk sepatah kata dari tim srss tentang ssrs viewer untuk asp.net core?

Perusahaan saya sangat bergantung pada laporan ekspor dokumen RDLC dalam format PDF. Tidak dapat melakukan ini di .net core pada dasarnya adalah pemblokir bagi kami yang menggunakan .net core dan berjalan di platform lain seperti buruh pelabuhan.

Saya berharap dari setiap pembuat kode dapat mendorong rekan-rekannya untuk mengomentari masalah ini di sini

Bagi yang masih mencari solusi:
Jika Java diinstal, Anda dapat menyematkan Eclipse BIRT atau JasperReports sebagai alternatif.
Dari keduanya, JasperReports jelas merupakan alternatif SSRS terbaik (sedikit lebih rumit, tetapi juga jauh lebih bertenaga / sempurna piksel).
Ini memiliki server pelaporan yang berdiri sendiri dan dapat disematkan, mampu mengakses sumber data JDBC apa pun, dan juga BigData seperti Cassandra atau Apache Spark (SparkSQL).

Ini menyediakan pelaporan dan analitik yang dapat disematkan ke dalam web atau aplikasi seluler serta beroperasi sebagai pusat informasi pusat untuk perusahaan dengan mengirimkan informasi penting misi secara real-time atau terjadwal ke browser, perangkat seluler, atau kotak masuk email dalam berbagai format file.

Anda dapat melakukan penerapan mandiri runtime Java dengan menyediakan BIRT / Jasper melalui Launch4j.

@jtarquino ada kabar baik untuk .Net Core?

Saya tidak percaya ini masih menjadi masalah sekitar 15 bulan setelah diangkat. Sangat mengecewakan.

Kami sangat membutuhkan ini untuk bekerja, bahkan titik sederhana di SSRS, ReportName dan Params, buka di DIV atau semacamnya. Kami telah menginvestasikan banyak waktu untuk membuat laporan SSRS pada SQL secara langsung dan saya memerlukan cara untuk menampilkannya dalam aplikasi Core2.0 MVC sederhana.

Ada tips?

@cgountanis , Ini bekerja untuk saya:
https://github.com/aspnet/Home/issues/1528#issuecomment -259169426

@gountan
apakah Anda memerlukan pdf dari laporan atau laporan interaktif lengkap seperti yang ditunjukkan portal web ??

saya dapat memberi Anda beberapa permulaan tentang bagaimana saya melakukannya dari aplikasi sudut

Inilah yang saya lakukan. Menggunakan kredensial klien yang mungkin tidak berfungsi untuk sebagian besar.
Mengubah ukuran halaman bekerja lebih besar, membuatnya lebih kecil tidak.


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

satu hal adalah menggunakan layanan web server laporan, dari mereka Anda bisa mendapatkan daftar laporan dan folder dan sumber data dll ... dan menggunakan data itu untuk membangun portal / menu laporan Anda sendiri dan mengelola laporan mana yang dapat dilihat pengguna di aplikasi Anda.
kami membuat sekumpulan pengguna windows di server laporan dan menggunakannya untuk membatasi laporan mana yang mereka dapatkan,
memetakan peran pengguna aplikasi ke pengguna server laporan.

ketika kita menjalankan laporan kita melewatkan pengguna server laporan sebagai pengguna yang menjalankan laporan, jenis menyebalkan karena itu berarti kita kehilangan "pengguna sebenarnya" kecuali kita mencatatnya di kode kita.
tapi itu berhubungan dengan ketergantungan server laporan pada akun pengguna windows. jika mereka memperbaruinya untuk menggunakan token jwt dan mendapatkan peran dari token, semuanya akan lebih baik bagi kami.

kami menggunakan iframe untuk menempatkan kontrol formulir web ke dalam tampilan aplikasi sudut, juga bukan yang terbaik tetapi berfungsi.
pengguna tidak dapat benar-benar melihat peretasan di balik layar yang kami lakukan.

@ ctrl-brk Saya mengalami masalah ini dengan Core 2.0, mungkin saya melewatkan sesuatu. https://github.com/alanjuden/MvcReportViewer/issues/43

@steelwil Terima kasih, tetapi saya perlu NetworkCredential kustom.

@figuerres Kami menampilkan laporan dari SSRS firewall, aplikasi WebForm melakukan semua kerja keras dengan SSRS.ReportViewer, tidak dapat hanya untuk Pengguna Windows. JWT yang setuju akan menyenangkan. Contohnya akan keren, mencoba mencocokkan fungsionalitas ReportViewer yang kami miliki dengan WebForms / NUGET.

Terima kasih semuanya!

Akhirnya mereka akan merilis NUGET resmi untuk ini kan?

@cgountanis "Mereka" adalah tim SQL Server, bukan tim ASP.NET Core. Disitulah letak masalahnya. Ini tim yang berbeda.

@giddev pertanyaan sebenarnya di sini adalah apakah tim lain yang Anda maksud ini benar-benar masih ada di Microsoft dan memiliki pengembang aktif yang masih bekerja di tim tersebut dan apakah mereka cukup bangga dengan pekerjaan mereka untuk menghasilkan dan menerbitkan solusi kelas satu untuk menanamkan SSRS melaporkan ke dalam aplikasi web ASP.Net Core 1 atau 2. Apakah mereka memiliki peta jalan yang dipublikasikan? Apakah ASP.Net Core bagian dari rencana atau apakah SSRS telah ditinggalkan dan diganti dengan barang POWER BI? Saya mulai melihat tanda-tanda bahwa SSRS sedang menuju ke lubang tikus yang sama dengan Microsoft Visual FoxPro jatuh ke dalamnya.

@wqwalter sesuatu seperti itu .....
Saya mendapat kesan bahwa Microsoft memiliki cara untuk banyak tim yang masing-masing mengikuti peta mereka sendiri dan tidak banyak orang yang memastikan bahwa mereka memiliki seperangkat penyampaian dan komunikasi yang sama di antara mereka.
ini seperti menggiring kucing, mereka semua terbang ke arah yang berbeda ....

jika itu salah - nampaknya seperti itu.

Saya merasa sulit untuk percaya bahwa mereka akan meninggalkan SSRS karena SSRS banyak digunakan oleh pengembang sekarang karena Crystal Reports tidak populer.

@gountan
Seperti halnya saya menyukai beberapa hal dari Microsoft, saya telah melihat 20 tahun sejarah mereka berulang kali menghentikan produk dan melakukan hal-hal yang bertentangan dengan pemahaman saya. salah satu contohnya adalah Virtual PC, diakuisisi oleh Microsoft, dijual oleh Microsoft untuk sementara waktu, kemudian dibuat gratis, lalu mereka bunuh.
itu hanya salah satu dari banyak kasus seperti itu ....

Saya memang mendengar pembicaraan tentang power BI dan beberapa gosip bahwa itu mungkin SSRS baru pada waktunya.
Saya tidak yakin apakah itu pasti atau hanya gosip. itu akan mengikuti model mendorong layanan berbasis Azure.

Senang melihat SSRS mendukung otentikasi berbasis web - lebih disukai OpenID Connect - di luar kotak. Selangkah lebih maju - akan luar biasa jika SSRS adalah nuget untuk ASP.NET Core. Penjadwalan laporan dan admin pengguna - mungkin memberikan proyek contoh, tetapi saya akan baik-baik saja untuk mengembangkan bagian yang diberikan dokumentasi di API SSRS.

@Tokopedia
sepakat!
OIDC akan sangat cocok untuk apa yang saya lakukan.
peran tersebut perlu dilakukan sehingga kami dapat menyediakan pemetaan untuk peran server laporan ke peran aplikasi kami.

Saat ini saya memiliki aplikasi yang menggunakan OIDC dengan ujung depan Angular 4/5 yang harus memuat halaman laporan formulir web ke dalam iFrame dan harus menggunakan akun pengguna windows untuk mengontrol izin jadi jika saya menanyakan database server laporan saya bisa tidak benar-benar melihat pengguna mana yang menjalankan laporan. itu tambalan yang bisa kita gunakan tapi jauh dari ideal.

Ini adalah masalah besar bagi kami juga dan saya benar-benar tidak percaya kami masih belum mendengar APA PUN dari Microsoft tentang ini. Ini secara serius membuat kami mempertimbangkan opsi non-microsoft pada saat ini. Jika kita setidaknya memiliki garis waktu, kita dapat membuat keputusan yang tepat.

Saya setuju, saya telah mengikuti rute menggunakan ReportServer / ReportExecution2005.asmx secara langsung hanya untuk mengekspor bekerja secara langsung. Bekerja dengan baik saat dihosting di bawah IIS mendapatkan kesalahan aneh.

Itu membuat frustasi.

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

kesalahan tersebut mengatakan bahwa header untuk otorisasi tidak ada, permintaan http perlu menyertakan header. apakah hanya satu panggilan yang menjadi masalah?

Bekerja dengan baik sampai dihosting di bawah IIS. Bahkan mesin pengembangan saya berbicara dengan server laporan yang sama dan berfungsi tetapi setelah diterbitkan dan dihosting dengan II Anda mendapatkan kesalahan itu. Pikirkan apa yang dikatakannya adalah server merespons dengan semacam kesalahan kosong tetapi saya mengirimkan semuanya.

Ingatlah bahwa IIS Express berjalan di bawah kredensial pengguna Anda sehingga hop ganda mungkin baik-baik saja. Apa yang mungkin terjadi adalah Anda tidak memiliki kerberos yang disiapkan di server IIS Anda dan bahkan jika Anda mengaktifkan delegasi, laporan Anda tidak akan berfungsi karena laporan berjalan sebagai anonim.

Jawaban singkat: Anda tidak dapat menggunakan delegasi tanpa kerberos mengatur, yang memerlukan pengaturan pada kontroler domain Anda untuk akun IIS App Pool berjalan sebagai.

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

Saya tahu ini bukan tempat yang tepat tetapi saya ingin menindaklanjutinya. Hosting Core di IIS, tidak peduli apa yang Anda setel pengaturan IIS. Hanya untuk S&G, saya membuat Administrator pengguna appPool dan berhasil. Pergi gambar ... Ini tanpa pengaturan Otentikasi IIS diaktifkan selain Anonymous. Ada yang menjelaskan ini? Apakah ia perlu mengakses lib untuk WCF di Core yang memerlukan akses khusus? Apa yang memberi? SAYA BINGUNG ... dan khawatir tentang keamanan.

@cgountanis dapatkah Anda membuka masalah baru dengan pertanyaan Anda?

@jtarquino Apakah Anda memiliki pembaruan untuk jadwal rilis penampil laporan berbasis inti .net? Saya putus asa untuk mendapatkan setidaknya garis waktu. Apakah kita berbicara 6 bulan? 12 bulan? Kami pada dasarnya menghadapi keputusan untuk meninggalkan semua laporan SSRS kami saat ini dan menggunakan solusi lain karena kami tidak memiliki alternatif dan tidak ada jadwal pada ketersediaan apa pun.

@ExcaliburVT itu ada di backlog kami tetapi saya tidak memiliki timeline yang dapat saya berikan saat ini.

@jtarquino open source bagus dan semuanya tetapi pada saat yang sama Microsoft harus bertanggung jawab kepada pelanggan, pelanggan membayar produk, pelanggan membutuhkan pengiriman produk. kami adalah pelanggan.

ini adalah satu area di mana migrasi Microsoft tidak begitu besar. jika kita sebagai pelanggan tidak bisa mendapatkan jawaban yang benar maka berapa lama kita akan terus datang kembali?

hal yang sama ini terjadi di beberapa produk, tidak hanya yang ini. mengapa saya harus menyarankan manajer saya untuk melisensikan rilis berikutnya dari SQL Server dan SSRS jika kami tidak dapat memperoleh pembaruan yang kami perlukan untuk menjalankan bisnis?

@jtarquino Saya harus setuju dengan @figuerres karena saya benar-benar baru saja menyelesaikan pertempuran 3 bulan untuk mendapatkan persetujuan untuk menggunakan SQL daripada Oracle dan datang untuk mengetahui salah satu nilai jual utama saya Tidak didukung secara native. Saya mengecam Oracle karena tidak memiliki driver .Net Core yang tersedia dan mereka setidaknya memiliki tanggal rilis yang diumumkan. SSRS adalah produk Anda sendiri dan Anda sepenuhnya tertinggal dua generasi bahkan tanpa tanggal penyelesaian yang diusulkan.

Menggunakan layanan konektor VS2017 WCF baru (Core 2) memungkinkan Anda mengekspor laporan dengan parameter ke PDF, Word, Excel, CSV ... cukup mudah jika Anda menginginkan bantuan sebelum paket NUGET penampil ini dirilis. Ya, Anda harus menggunakan ReportExecution2005.asmx yang disertakan dengan SSRS tetapi begitu juga apa pun yang mereka buat. Kami baru saja memutuskan untuk membuang aspek penampil untuk saat ini dan melakukan unduhan file langsung.

Sunting: Hanya masalah yang datang untuk mengatasi izin AppPool yang saya sebutkan sebelumnya.

dengan cara saya mendapatkan laporan sebagai pdf dari api web dan saya tidak menggunakan bit wcf.
hanya panggilan sabun / asmx dan panggilan http.
dalam melakukannya saya melewati credentails tanpa masalah.
kode saya adalah asp.net 4.6 / web api 2
jika Anda ingin melihat apa yang saya lakukan, saya dapat memasang beberapa kode di github minggu depan untuk Anda periksa.
saya menelepon server laporan 2016 tetapi sebagian besar dari apa yang saya lakukan akan bekerja dengan rilis ssrs yang lebih lama.

Adakah yang baru untuk Core 2 dengan SSRS (RDLC Designer)?

@figuerres jika Anda telah memasang kode apa pun di github, silakan bagikan tautannya.

@tokopedia
akan memposting minggu depan, tidak di kantor sampai saat itu. tidak ada yang meminta kode sampai sekarang.

Saya sedang mengerjakan aplikasi intranet Angular5 / .NetCore2 MVC5 (tumpukan RC saat ini dari MS), kami menggunakan SSRS 2012, dan perlu membuat langganan laporan berbasis waktu untuk pengguna yang bukan akun windows yang masuk.

@figuerres Mungkin Anda punya beberapa ide?

Anda dapat menggunakan SSRS dan layanan eksekusi pelaporan yang dibangun untuk memuntahkan PDF sepanjang hari.

@cgountanis Terima kasih atas tanggapan yang cepat, Anda membantu saya menyadari bahwa saya tidak cukup deskriptif / akurat saat menjelaskan apa yang perlu saya lakukan. Saya telah memperbarui komentar asli saya menjadi "buat langganan laporan berbasis waktu"

Hmm rasa saya melakukan hal seperti itu dengan memasukkan baris jadwal langganan langsung ke database laporan (menebak cara kerja layanan berlangganan berdasarkan tabel dan baris yang ada).

@ExcaliburVT Saya telah menggunakan SOAP API dan SP yang besar untuk berinteraksi dengan DB sejauh ini, dan ingin menghindari modifikasi DB secara langsung. Saya senang mengetahui ada opsi fallback.

apa yang Anda maksud dengan waktu?

apakah Anda perlu menjalankan laporan pada waktu tertentu?
apakah Anda perlu menjalankan laporan saat pengguna melakukan sesuatu?

@figuerres berdasarkan waktu, artinya jadwal berulang seperti setiap Rabu jam 8 pagi.

Ya, saya tidak dapat menemukan cara untuk melakukan itu tanpa memasukkan catatan secara manual setidaknya kembali ke SQL 2012. Jika saya ingat benar, Anda tidak perlu mengubah skema atau apa pun, cukup masukkan baris di tabel langganan dan saya bisa untuk mengirim laporan ke grup distribusi dengan cara itu.

ok maka portal server laporan dapat menjalankan laporan pada jadwal yang direncanakan, dapat menyimpannya ke file atau mengirim email ketika waktu itu terjadi.
Anda tidak perlu meminta siapa pun untuk masuk saat program ini dijalankan.

Anda baru saja membuat langganan dari portal.

Anda juga dapat melakukannya dari api sabun tetapi saya tidak yakin persis set panggilan api yang harus dilakukan.

Izinkan saya memberi lebih banyak konteks sebelum berbicara tentang apa yang saya lihat dari soapAPI.

Saya sedang menulis aplikasi web yang menggunakan SSRS soapAPI dan kredensial seperti "ssrsReportWebAdmin". Dalam pengembangan saat ini "ssrsReportWebAdmin" memiliki semua peran keamanan, tetapi berdasarkan dokumentasi tampaknya peran Pengelola Konten adalah yang diperlukan. Seorang pengguna akan menggunakan aplikasi web untuk membuat langganan bagi orang lain dan mengirimkan permintaan tersebut melalui soapAPI.

Panggilan CreateSubscriptionAsync mengembalikan kesalahan yang mengatakan bahwa pengguna tidak memiliki izin.

jadi memanggil api Anda meneruskan objek cred untuk pengguna "ssrsReportWebAdmin" yang memiliki semua peran tetapi Anda mendapatkan kesalahan yang tidak memiliki izin ?? menarik....

dari apa yang saya baca SSRS diatur sehingga satu-satunya orang yang dapat membuat langganan standar (berulang, berbasis waktu) adalah pengguna itu sendiri. Langganan Datadriven dapat disiapkan dengan peran Pengelola Konten.

Lihat ContentManagerTasks - Kelola Semua Langganan
https://technet.microsoft.com/en-us/library/ms159693 (v = sql.105) .aspx

Lihat kalimat pertama di bawah tajuk dimulai "Layanan Pelaporan mendukung dua jenis ..."
https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/subscriptions-and-delivery-reporting-services#bkmk_standard_and_datadriven

@figuerres @ExcaliburVT
Saya dapat membuat langganan standar ke email dan fileshares menggunakan akun AD dengan peran SSRS Pengelola Konten. Dari apa yang saya dapat melihat masalah izin yang saya hadapi pada hari Jumat adalah efek samping dari parameter MatchData kosong / rusak.

Hampir 2 tahun. Core 2.0 dirilis. Tim SSRS, bangun.

@ codehippie1 jangan terlalu kasar. kita semua adalah manusia di sini. tumbuh!

Itu hanyalah lelucon di gua pengembang. Tidak ada pelanggaran berarti apa pun. Bercanda, ReportViewerForMVC memiliki 72.799 unduhan yang sekarang berlangsung dari awal 2014 (https://www.nuget.org/packages/ReportViewerForMvc). Tim SSRS telah mengabaikan ASP.NET MVC selama bertahun-tahun, dan sekarang mengabaikan ASP.NET Core selama 2 tahun. Berbicara kasar, 72.799 kali itu banyak.

Saya akan puas dengan ekspor yang bagus ke perpustakaan PDF yang didukung secara resmi, tidak perlu penampil hari ini dengan persyaratan responsif apa adanya.

@cgountanis : Buat template HTML (ukuran kertas yang benar - hanya html, gambar sebagai base64, gaya sebaris). Isi placeholder, dan jangan lupa untuk mengatur encoding-HTML ke utf8. Kirim teks ke StandardInput dari wkhtmltopdf - ambil keluaran dari StandardOutput dari wkhtmltopdf. Dan kemudian, Anda memiliki sesuatu yang jauh lebih baik daripada SSRS.

@cgountanis Saya telah memikirkan pendekatan seperti itu, tetapi menghasilkan laporan piksel yang sempurna dengan header / footer halaman dan jeda baris di tempat yang logis tidaklah mudah.

Untuk semua yang berbagi rasa sakit karena tidak memiliki penampil laporan lokal MS RDLC pada inti aspnet; Saya telah mencoba pendekatan alternatif dengan bantuan pdfJs dan ViewerJs dari mozilla - demo pdfJs dengan penampil laporan MS RDLC untuk memuntahkan laporan sebagai byte. Bagi saya, ini adalah yang terbaik dari kedua dunia, karena saya masih dapat menggunakan file RDLC, menggunakannya untuk menghasilkan laporan di sisi server, dan memiliki firefox yang kuat di dalam penampil dokumen untuk menampilkan hasilnya. PdfJs masih bukan penampil laporan, tetapi untuk kasus saya dengan navigasi halaman, pratinjau cetak, pencarian, dan banyak fungsi berguna lainnya, itu juga tidak kurang.

Jika Anda tertarik, Berikut adalah inti untuk membantu Anda bagaimana menggunakannya di dalam aplikasi inti aspnet (dengan sisi klien di sudut 2 atau lebih tinggi, rxJs dan Typecript). Bagi saya, ini adalah yang terbaik dari kedua dunia.

Bagaimana menambahkan pdf.js dan viewer.html ke aplikasi sudut 2. (Dengan opsional pembuatan laporan backend aspnet core / webapi / mvc menggunakan MS Local RDLC report viewer)

Saya percaya, Anda dapat mengubah sudut 2 dengan sangat baik dengan react atau pustaka sisi klien lainnya, tetapi prinsipnya tetap sama.

Apakah ini bekerja dengan SSRS secara langsung?

@cgountanadalah posting sebelumnya adalah RDLC yang berarti tidak ada server laporan, server web membuat laporan.

Pembaruan menarik dari Microsoft ...

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

Kami senang mengumumkan bahwa kami telah memperoleh teknologi dari Perangkat Lunak Forerunner https://forerunnersw.com/ untuk mempercepat investasi kami dalam Layanan Pelaporan. Teknologi ini mencakup, antara lain, rendering laporan Layanan Pelaporan (* .rdl) sisi klien, widget UI responsif untuk melihat laporan, dan JavaScript SDK untuk mengintegrasikan laporan ke dalam aplikasi lain - sebuah bukti tentang apa yang dapat dicapai mitra kami dalam membangun platform terbuka kami.

Ini adalah kabar baik untuk Anda, karena kami melihat peluang untuk menerapkan teknologi ini ke beberapa poin masukan yang kami dengar dari Anda:

  • Anda mencari Software-as-a-Service (SaaS) cloud atau Platform-as-a-Service (PaaS) yang dapat menjalankan laporan SSRS. Seperti yang mungkin telah Anda lihat di Catatan Rilis Musim Semi '18 kami https://aka.ms/businessappsreleasenotes , kami secara aktif bekerja untuk menghadirkan laporan SSRS ke layanan cloud Power BI, dan kami sedang membangun rendering sisi klien ke buat itu mungkin.
  • Anda ingin melihat laporan SSRS di ponsel Anda, mungkin menggunakan aplikasi Power BI. Kami yakin teknologi ini akan membantu kami memberikan UI yang lebih baik dan lebih responsif untuk menyediakan nilai parameter laporan, menavigasi dalam laporan, dan bahkan mungkin melihat konten laporan.
  • Anda menyukai kontrol Penampil Laporan ... tetapi itu adalah kontrol Formulir Web ASP.NET. Anda memerlukan sesuatu yang dapat diintegrasikan ke dalam aplikasi ASP.NET Core / MVC atau aplikasi non-ASP.NET. Dengan teknologi ini, kami berharap dapat memberikan Penampil Laporan sisi klien / berbasis JavaScript yang dapat Anda integrasikan ke dalam aplikasi modern apa pun.

Ini adalah usaha besar dan kami belum memiliki jangka waktu untuk dibagikan, tetapi pantau terus selama beberapa bulan mendatang karena kami selalu berusaha untuk membagikan kemajuan kami dengan Anda dan mendengar tanggapan Anda sedini dan sesering mungkin.

Salam

Paul


Dari: Denny Figuerres [[email protected]]
Dikirim: Jumat, 23 Maret 2018 02.19
Untuk: aspnet / Home
Cc: Paul Sheldon; Komentar
Subjek: Perihal: [aspnet / Beranda] Pelaporan Inti Asp.Net (SSRS) (# 1528)

@cgountanis https://github.com/cgountanis posting sebelumnya adalah RDLC yang berarti tidak ada server laporan, server web membuat laporan.

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub https://github.com/aspnet/Home/issues/1528#issuecomment-375408680 , atau nonaktifkan utas https://github.com/notifications/unsubscribe-auth/AEHciZa6- jjUl8kgdHtuCdH6lSwhoCyyks5tg-s6gaJpZM4IsW_Z .

Ya Tuhan, jangan omong kosong jQuery ini lagi.
Bloatware.
Dan bukan hanya bloatware, tetapi juga memperlambatwwwwww ...

Jika Anda membutuhkan definisi bloatware, ini adalah definisi yang bagus.
Untuk kesempurnaan, pada dasarnya hanya kekurangan jQuery UI, tapi saya yakin orang-orang yang melakukan hal seperti itu masih akan menemukan waktu untuk menambahkannya untuk datepicker.

Oh tunggu, saya baru saja melihat

jquery-ui-1.10.3.forerunner.js

Saya buruk, sudahlah.
Ini jelas contoh yang sempurna.
Kami tentu saja tidak hanya menambahkan jQuery-UI, kami juga meluncurkan versi modifikasi kami sendiri.

Ya Tuhan, ini terlihat seperti omong kosong. Laporan di telepon - tepat yang kami butuhkan - tepat setelah CrApple iPads dan layar sentuh di desktop ...
Dan saya masih puas dengan SSRS yang bekerja dengan proxy-server, atau untuk dapat melakukan auth-cookie-sharing (hosting berbasis nama virtual multi-tenant - penyertaan iframe multi-direktori multi-domain domain tunggal tanpa menimpa auth-cookie dari direktori virtual lain). Atau jika (di SSRS 2016+) akan membuat batas tabel sama di IE dan Chrome, dan mungkin Firefox.
Atau hanya untuk dapat mengatur budaya secara manual melalui query-string, minta judul parameter diterjemahkan dan lakukan sendiri datepicker itu sendiri, karena MS tidak akan melakukannya dengan benar ...

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

Bagaimana tentang:

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

atau bahkan lebih baik

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

Poin bonus jika menambahkan stempel waktu unix ke setiap skrip dan lembar gaya, sehingga perubahan / perbaikan benar-benar berlaku. Poin bonus yang diperpanjang jika meneruskan nilai datetime sebagai unix-timestamp alih-alih string khusus budaya, dan tidak gagal untuk tanggal> 2030 atau 9999. Atau pada karakter UTF8. Sekarang untuk dukungan bahasa kanan-ke-kiri - kami tidak ingin terlalu memaksakan batasan untuk microsoft. Mereka gagal jauh sebelumnya. Mereka pasti sudah melebihi harapan saya jika itu bekerja untuk lebih dari satu bahasa Eropa secara bersamaan (misalnya Inggris, Jerman, Prancis dan Italia).

Dear Microsoft, mungkin saya juga ingin menguji apakah sebuah laporan memiliki semua bidang yang diterjemahkan, dan untuk itu, saya hanya ingin masuk sebagai pengguna berbeda dengan bahasa yang berbeda - tanpa harus mengubah pengaturan bahasa browser saya setiap saat (atau memberi tahu pelanggan bagaimana melakukan ini - itulah pencapaian akhir Anda hingga saat ini - pengalaman [sangat negatif] tak terlupakan yang dapat saya tambahkan - terutama setelah beralih ke windows 8).
Jika Anda memerlukan sesuatu yang dapat ANDA hubungkan - mungkin terkadang ada juga pengguna bahasa Inggris yang bekerja di komputer yang telah disiapkan untuk pengguna non-Inggris. Oleh karena itu, alangkah baiknya jika saya sebagai pengembang dapat mengatur bahasa tampilan dari aplikasi saya, tidak hanya ditentukan oleh pengaturan bahasa agen pengguna. Mungkin Anda bisa mempertimbangkan setidaknya ini kali INI.

Tetapi jika saya melihat omong kosong di atas, saya sudah tahu bahwa Anda tidak akan melakukannya.

Ngomong-ngomong, cara mengatur budaya dalam inkarnasi SSRS saat ini, Anda perlu melakukan hal berikut:

panggil laporan dengan & in_language = IETF-bahasa-tag

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


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

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

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

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

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

    base.InitializeCulture();
}
</script>

Kemudian bahasa perlu ditimpa di permintaan http, (Modul HTTP khusus di SSRS)
(dan kebijakan P3P untuk itu, form-login-post berfungsi jika berada di iframe di domain yang berbeda).

Bisakah Anda memastikan bahwa Anda tidak merusak ini tanpa menawarkan parameter bahasa (DISPLAY)?
Parameter Anda rs:ParameterLanguage hanya memengaruhi parameter di URL, bukan tampilan laporan. Dan itu tidak harus ada di tempat pertama, misalnya jika Anda baru saja melewati datetime sebagai unix-timestamp (UTC). Dan tentu saja, Anda harus selalu memiliki header asal yang sama, atau header allow-from (iframe berada di domain yang berbeda dari ReportServer). Ngomong-ngomong, menyetel bahasa permintaan dalam modul HTTP adalah untuk menyetel pemilih data dengan SSRS 2016 ke bahasa yang diperlukan - jika tidak, JavaScript gagal jika memiliki pemilih data en-US. Hebat, bukan?

Bagaimana dengan: & rs: language = tag bahasa IETF / IANA?


namespace libRequestLanguageChanger
{


    public class RequestLanguageChanger : System.Web.IHttpModule
    {


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


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


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

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


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

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

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

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

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

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

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


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

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

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

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

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


        } // End Sub context_BeginRequest 



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

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


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


    }


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

    } // End Using context_EndRequest


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


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


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

        return false;
    } // End Function Contains 


} // End Class RequestLanguageChanger 


} // End Namespcae libRequestLanguageChanger 

TOLONG Microsoft tidak menggunakan kode pelari depan seperti itu!
aplikasi web sisi klien modern akan beralih dari kueri j ke modul es dan semacamnya.
kita tidak perlu atau ingin menarik banyak kode j query.
Saya lebih suka memberikan klien pdf atau kontrol asp.net saat ini daripada tumpukan kueri j.

buat paket npm yang berfungsi baik dengan Angular 2-6 dan node serta kerangka kerja klien web lainnya.
juga tetap bekerja dengan rendering SSRS, ini memiliki banyak manfaat. dapatkan saja satu set api layanan web yang diperbarui

Ada pembaruan tentang ini?

Nah, pada dasarnya kita sudah memiliki semua yang kita butuhkan.
Yang kami perlukan adalah implementasi versi REST / JSON
http: //localhost/ReportServer/ReportExecution2005.asmx
(Tidak ada salahnya jika kita / siapa saja bisa menyesuaikan url)
sebagai paket nuget - yang juga berfungsi di Linux / Mac.
Satu-satunya hal yang perlu dilakukan adalah mem-port kode .NET ke .NET Core / NetStandard, dan menghapus semua pinvoke ke windows dll. Kemudian, tambahkan kemampuan mengeluarkan PAGED html melalui layanan web (yang saat ini kurang - karena ada di asp.net-render-control), tentu saja, dan izinkan untuk menyetel nama file unduhan.

Pemilihan parameter bahkan bisa kita lakukan sendiri - membaca RDL dengan XmlDocument.
(beberapa masalah dengan opsi eksplisit off, opsi ketat off, opsi menyimpulkan dengan VB-Code akan mungkin)
Jenis seperti kontrol ASP.NET saat ini, hanya saja tanpa semua hal ASP.NET-WebForms.

Jadi menurut saya bahkan tidak ada persyaratan untuk satu baris JavaScript - yang akan berbeda dari proyek ke proyek, dari perusahaan ke perusahaan, dari orang ke orang.
Beberapa menyukai jQuery. Beberapa Suka Angular. Some Like Vue. Beberapa Suka Bereaksi. Beberapa menyukai NodeJS dengan NPM, beberapa seperti bower, beberapa seperti TypeScript, beberapa seperti Babel, beberapa aliran, beberapa bahkan menggunakan jQuery-UI untuk datepicker.

Saya misalnya sangat membenci semua kerangka kerja itu (terutama jquery-ui) dengan umur lalat buah, ketidakcocokan antara versi, mengasapi, non-modularitas dan kurva pembelajaran apa pun, komunitas orang yang tidak tahu apa itu. sedang melakukan (catatan: Saya dengan ini tidak ingin menyiratkan bahwa saya selalu tahu apa yang saya lakukan), dan manajer paket yang rusak seperti npm / bower, yang memiliki karakteristik tidak menyenangkan yaitu selalu menemukan cara untuk menciptakan kegembiraan baru setiap kali Anda ingin menggunakannya.

Jadi saya hanya menggunakan VanillaJS (dengan ECMA-modules dan async - transpiled dengan babel atau typescript - dan siapa yang peduli dengan transpiler.

Sekarang tentu saja banyak orang akan tidak setuju - dan Anda berhak untuk tidak setuju, karena ada alasan untuk tidak setuju. Pada akhirnya, saya tidak peduli apa yang Anda gunakan - gunakan coffeescript dan emacs dengan jquery-ui dan vue jika Anda benar-benar ingin - jangan paksa saya melakukannya. Saya tidak membutuhkan / ingin jquery / angular / vue / react / bower / npm atau hal-hal yang membengkak dan tidak dapat diandalkan.

Sekarang, yang mengatakan, jika Anda ingin menyediakan pustaka JavaScript yang dapat diletakkan siapa saja di situs mereka untuk memilih parameter secara otomatis, seperti di ReportServer (sebagai lawan RDLC), dan tidak seperti kontrol reportviewer saat ini, saya mendukungnya . Hanya jika Anda melakukannya, buat itu terlepas dari "kontrol" laporan. Dan menggunakan struktur mirip node untuk menyusun modul ECMA, sehingga orang yang ingin menggunakan node dapat menggunakannya dengan node / npm, dan mereka yang tidak perlu melakukannya.

Sebagai sidenode, jika REST / JSON-versi diizinkan untuk mengambil data filter dari layanan sebagai json, seperti file diberikan, kita bahkan tidak perlu membaca file RDL, dan kami akan memiliki sangat PBB rumit JS Perpustakaan. Kode VB yang saat ini diizinkan dalam parameter tetap tidak akan memungkinkan untuk melakukan ini di sisi klien.

Atau jika dipikir lebih lanjut, akan lebih baik jika layanan diizinkan untuk mengambil setiap set data dalam laporan sebagai JSON. Saya rasa kita juga harus bisa membaca nilai default untuk setiap parameter. Kemudian kami bahkan dapat melakukan pengujian unit atas kebenaran data SQL yang digunakan dalam laporan!
(laporan pengujian unit saat ini agak tidak mungkin)

Satu lembar gaya tambahan untuk pemformatan kemudian akan menyelesaikan trik (mohon SASS). Dan sistem plugin untuk penyaji tambahan / alternatif akan melengkapi itu. ¨

Namun pada intinya, kami benar-benar hanya membutuhkan pustaka rendering laporan multi-platform.
Segala sesuatu yang lain sudah bisa dilakukan hari ini oleh komunitas.
Saya rasa jika sumber untuk kontrol yang ada tersedia, semua atau sebagian besar pekerjaan yang diperlukan bahkan dapat dilakukan sepenuhnya oleh komunitas - bahkan tidak akan membebani Microsoft sepeser pun.

Apakah alanjuden MvcReportViewer bekerja dengan SSRS 2017 dan inti 2. Dapatkah saya menggunakan pendekatan ini untuk SSRS 2017 dan inti 2

Tidak, bukan tanpa banyak sakit kepala. Solusi termudah adalah mengekspor PDF secara langsung menggunakan reportexecution2005 secara langsung, imho. Mencoba untuk mendapatkan salah satu pemirsa lama dalam format yang responsif terutama untuk ponsel dan tablet sangat merepotkan.

@Mahenbisht , saya harus membangunnya dari sumber dengan paket yang diperbarui ke versi terbaru untuk membuatnya berfungsi di inti 2. Belum mencoba 2017.

Saya menggunakan SQL Server 2017 dengan SSRS 2017 dan inti 2.
Jika saya tidak dapat menggunakan alanjuden.MvcReportViewer.NetCore lalu apakah ada pendekatan lain

@ Mahenbisht , saya tahu saya sudah lama tidak aktif di situs saya ... namun, Anda masih dapat menggunakan pendekatan serupa. Anda selalu dapat terhubung ke api Layanan Pelaporan yang saya gunakan (yang dibangun ke dalam SSRS) untuk menjalankan laporan Anda sendiri dan menempatkannya dalam format apa pun yang Anda inginkan.

@ Mahenbisht : Ada paket nuget .NET Core di sini:
https://www.nuget.org/packages/AspNetCore.ReportViewer/
Sayangnya, tidak ada sumber apa pun, jadi Anda tidak dapat melihat fungsinya dan cara menggunakannya.
Jadi saya mendekompilasi di sini (dikompilasi).

Tampaknya kelas yang dihasilkan dari ReportExecution2005 & ReportService2010-WSDL untuk .NET Core.
Jadi tidak ada yang menghentikan Anda untuk menulis penampil Anda sendiri, jika Anda memiliki akses jaringan ke contoh SQL-server yang berjalan dengan SSRS.
Jika saya ingat benar, Anda harus meneruskan deviceinfo untuk membuat itu Anda mendapatkan output html halaman.
Itu membuat Anda melakukan parameter secara manual - yang saya (secara teoritis) sedang kerjakan.

@alanjuden : Masalah dengan pendekatan Anda adalah bahwa pendekatan ini memerlukan instance SQL-Server dengan ReportingServices diinstal. Jika Anda memilikinya, Anda juga dapat meletakkan iframe ke / ReportServer, dan menambahkan sedikit otentikasi khusus + header W3C dan DLL bahasa-localizer ke layanan pelaporan. Maka Anda tidak membutuhkan pekerjaan Anda sama sekali.

Masalahnya adalah itu
A) Pelanggan N tidak selalu menginstal versi SSRS yang sama (dengan semua pembaruan kumulatif / servicepacks - dalam kasus saya saat ini mulai dari SSRS-2008R1 hingga 2016),
dan B) bahwa penginstalan SSRS-Express hanya memiliki akses ke database di komputer lokal. Dan yang benar-benar menyebalkan adalah tidak ada kontrol ReportViewer yang berfungsi pada PC non-Windows (Linux, Mac) - jadi Anda harus menggabungkan .NET dengan Java untuk Birt atau Jasper - yang merusak penerapan xcopy - belum lagi overhead dalam 2-3 format laporan, dan seluruh java JVM dan bloatware birt / jasper termasuk tomcat dan / atau omong kosong lainnya.
dan C) bahwa ReportingService menggunakan otentikasi windows terintegrasi. Jadi, meskipun Anda menggunakan Windows, Anda perlu menambahkan autentikasi khusus untuk di luar intranet, yang berarti Anda harus memiliki akses modifikasi ke ReportingServices, dan modifikasi Anda mungkin merusak perangkat lunak lain, jadi setiap pelanggan waras harus menginstal instance baru dari SSRS / SQL-Server (yang membutuhkan biaya).
juga D) bahwa parameter ReportingService tidak dapat dilokalkan tanpa memodifikasi ReportViewer.aspx, lihat C)
dan juga E) bahwa versi apa pun dari SSRS <2016 Renders quirks-html (dan sementara 2016+ lebih baik, itu jauh dari sempurna dalam hal itu, btw)
Namun, karena versi lama dari tahun 2008 masih ada pada tahun 2018, mungkin perlu 5 hingga 10 tahun lagi untuk mati. Pada saat itu, SSRS 2016 akan sangat ketinggalan zaman. Jika Microsoft masih ada pada saat itu, itu saja.

Docker untuk menyelamatkan - untungnya. Tapi itu tetap omong kosong.

dan menambahkan sedikit otentikasi khusus + header W3C dan DLL pelokalan bahasa ke layanan pelaporan.

@ Ststeiger ada contoh online untuk menempatkan penampil SSRS di iframe tanpa melewati identifikasi otomatis khusus dari situs utama dan header W3C?

@adopilot : Berikut cara perkiraannya:

Tambahkan autenikasi kustom ke SSRS

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

(Anda harus sedikit memodifikasinya sehingga menggunakan SATU pengguna per database.
Anda tidak ingin mulai menyinkronkan pengguna SSRS dan izin dengan pengguna formulir Anda!
Berikan hak pengguna ini pada folder untuk database ini saja.
)

Tambahkan http-modul ke SSRS , yang menyetel header p3p, dan menimpa context.Request.UserLanguages ​​[i] dengan bahasa pilihan Anda (jika tidak, pemilih data tidak akan berfungsi)

Ubah halaman logon ReportServer, untuk bereaksi untuk mendapatkan dan memposting parameter, dan mengatur login_cookie, lalu mengarahkan ulang ke laporan yang telah diposting ke.

Kode di Page_Load di kelas FormsAuthentication_RS2012.LogOn di Assembly FormsAuthentication_RS2012

Posting data yang dienkripsi PGP / RSA dengan stempel waktu unix (sehingga tidak dapat diputar ulang) yang dienkripsi dengan kunci publik di formulir Anda, dekripsi data posting di FormsAuthentication_RS2012 di page_load.

(tidak dapat memberi Anda kode FormsAuthentication_RS2012, karena berisi kunci pribadi dan kata sandi administrator yang di-hardcode)


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

Tambahkan ke ReportViewer.aspx


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

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

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

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

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

        base.InitializeCulture();
    }

</script>

Tambahkan fungsi terjemahan parameter ke reportviewer.aspx:
(
Parameter telah ditulis dalam bahasa Jerman / Prancis / Italia / Inggris
)
membagi / dan default ke Jerman (Anda mungkin ingin menggunakan bahasa Inggris)
tambahkan parameter in_language (in_sprache) ke report-url, dan Anda sudah selesai, jika Anda memahami idenya.


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>

Sekarang, untuk menggunakan ini di beberapa halaman web, buat iframe bernama ifrmSSRS_Login (atau sesuaikan dengan keinginan Anda) dan lakukan posting formulir di klik tautan:

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

dengan cara itu Anda dapat menjembatani otentikasi dengan SSRS, ditambah pengguna dari setiap pelanggan (nama-database) hanya melihat laporan mereka (izin pada ssrs menurut nama-database).

Perhatikan bahwa cairan harus diberikan dalam huruf kecil, karena jika tidak, SSRS menolak untuk bekerja dengan benar / meledak seperti perangkat lunak yang jelek itu.

catatan:
Kode tersebut terakumulasi dalam jangka waktu yang lebih lama, untuk beberapa versi SSRS, dan mungkin menimpa kultur-inisialisasi-laman tidak lagi diperlukan jika modul-http menimpa bahasa agen-pengguna (yang hanya saya ketahui setelah menyadari laman yang menggantikan itu -inisialisasi-budaya tidak cukup baik untuk datepicker SSRS).
Juga, penggunaan garis miring sebagai pemisah untuk terjemahan sangat disayangkan. coba gunakan karakter yang tidak Anda butuhkan, seperti £ atau ¦.

Header P3P diperlukan sehingga IE 11 pada comptuers non-windows-10 tidak menolak auth-cookie (karena ssrs berjalan di iframe lintas domain, ini ditangani sebagai cookie pihak ketiga oleh IE).

Selain itu, gunakan SSRS 2016+, karena jika tidak, Anda perlu fitur mode quirks, seperti lebar batas, ketinggian, margin, menyembunyikan fungsi cetak, dan semua jenis "hal khusus IE8 yang menarik" dll.

Seperti yang disebutkan dalam nama assembly, ini dilakukan untuk server produksi kami (SSRS 2012) dan semuanya berevolusi dari peretasan SSRS 2005 yang buruk.

Simpan link dalam kolom di tabel navigasi Anda, misalnya sebagai kolom NA_Link di T_Navigation
'{@report} Budget_SNB & in_user = {@ user} & in_sprache = {@ language} & rc: Stylesheet = COR_RS2012_v7'
gunakan placeholder untuk baseLink, pengguna dan bahasa, dan setel stylesheet (jika Anda memiliki latar belakang hitam, Anda perlu memberi tahu ssrs untuk menggunakan modifikasi Anda pada lembar gaya mereka)

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

Dan perhatikan bahwa .NET-Framework bermasalah jika perlu mengarahkan tautan dengan titik dua di dalamnya.
Anda dapat menyalin kode yang berfungsi untuk url-redirection dari mono-project.

Juga, perhatikan bahwa Anda tidak bisa hanya meneruskan userid sebagai string / number - itu perlu dienkripsi (privat / publik) sehingga tidak ada yang bisa menebak user-id. Tapi sebagai permulaan, md5-hash dari userid mungkin bisa membantu.

@tokopedia
AspNetCore.ReportViewer telah diganti dengan AspNetCore.Reporting
itu termasuk LocalReport dan ServerReport

@ amh1979 : Kerja bagus - Saya akan melihatnya.
Saya mengambilnya dari ketergantungan itu AspNetCore.ReportingServices.dll membutuhkan WindowsBase dan pinvoke advapi32.dll / kernel32.dll / ReportingServicesService.exe bahwa ini hanya berfungsi pada Windows dengan .NET dengan Framwork 4 diinstal?

PS: bahasa Inggris yang benar adalah "AspNetCore.ReportViewer telah> diganti dengan <AspNetCore.Reporting", bukan "bukan", tapi saya mengerti maksud Anda;)
Atau Anda juga bisa mengatakan "telah dilampaui oleh", yang mungkin merupakan kata / frasa yang Anda cari;)

@ amh1979 : Bagus sekali, harus melakukan beberapa pekerjaan karena saya tidak memasang kerangka kerja 4.7.1.
Saya mengerti, MainStream adalah result / html dan SecondaryStream adalah CSS.
Tapi bangun dan jalankan.
Bahwa HTML dihalaman juga bagus.
Tahukah Anda: Apakah ada cara untuk mengulang semua hasil atau mendapatkan satu file HTML besar tanpa memanggil fungsi render untuk setiap halaman?

@ SEMUA : Meskipun ini berjalan di bawah .net penuh, saya tidak bisa menjalankan ini di bawah .NET Core di bawah Windows.
Masalah dengan System.Drawing.Color ToKnownColor, IsSystemColor dan tidak ada DiketahuiColor.
Memperbaiki itu, tetapi sekarang mengeluh tentang tidak dapat memuat Sistem perakitan. Menggambar.Grafik dengan tanda tangan ...

Apakah ada cara untuk menjalankan rakitan .net LENGKAP dalam proyek .NET Core di Windows?

@ststeiger Saya akan memperbarui dan memperbaiki pertanyaan ini di versi berikutnya.

@ amh1979 :

Saat Anda melakukannya, jika Anda mencari dan mengganti System.Array.Empty<T> dengan ArrayExtension.Empty<T> , maka Anda sudah 90% cara membuatnya berfungsi dengan .NET 4.0.

    internal static class ArrayExtension
    {

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

    }

@ amh1979 :

Ini menggunakan yang berikut ini

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

yang tidak diimplementasikan oleh System.Drawing.Common milik .NET Core.
Ini adalah pengganti System.Drawing.KnownColor.cs
(ini tidak sempurna karena ambiguitas, tetapi dengan tidak adanya akses ke nilai internal System.Drawing.Color. ini adalah yang terbaik yang bisa saya lakukan - mungkin menggunakan #ifs untuk membuat full .net framework memanggil properti aktual jika penuh. kerangka bersih ...)


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 


}

Saya memilikinya kompilasi di bawah NetStandard 2.0

CARA:
Ambil System.CoreFX.Forms dan konversikan ke NetStandard 2.0. Kemudian tambahkan System.Drawing.Common dan System.Reflection.Emit.

Ambil AspNetCore.ReportingServices dan tambahkan

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

Tambahkan referensi ke System.CoreFX.Forms (NetStandard)

Dapatkan file berikut dari 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")

Dan tambahkan kelas pembungkus untuk System.Web


namespace System.Web
{

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

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

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

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


        public static HttpContext Current;
    }
}

Dan izinkan kode yang tidak aman di proyek netstandard 2.0 yang baru.

Sekarang tambahkan AssemblyInfo.cs dengan

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

Dan sekarang sudah dikompilasi di NetStandard 2.0.

Hai @Semua berita luar biasa:

Saya memilikinya bekerja dengan .NET Core di Windows!
100% NetStandard, 0% NetFramework

Html, Pdf, Excel, Excel2007 +, Word, Word2007 + dan tiff semuanya bekerja dengan baik pada laporan tabular 57 halaman dengan kolom varchars, ints, tinyint2, bits, dan computed.
Semua format keluaran berfungsi, kecuali RDL, yang agak lucu, tapi siapa peduli.
Kita akan menemukan masalahnya pada akhirnya, bukan?

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 

Dan ada kabar baik lainnya:
WindowsBase (alias WPF) hanya digunakan untuk System.IO.Packaging, yang tersedia dalam .NET Core.
Sekarang itu berarti bahwa jika kita dapat menghilangkan pinvoke, tidak ada penghalang utama untuk membuatnya bekerja di Linux / Mac juga!

Sekarang seseorang dengan cepat mulai menulis editor RDL berbasis web!
Kemudian kami juga dapat memiliki laporan "dinamis" (buatan pengguna).
PostgreSQL-ReportingServices untuk Linux akan datang;)
(ok, ada pedang resmi Damocles tentang hal semacam itu, tetapi jika kita bisa menerbitkannya dari China, yang memiliki hak kekayaan intelektual yang "lebih longgar" ...) :)

Oke, mungkin itu terlalu jahat.
Pikirkan Microsoft ReportingServices untuk Oracle / SAP sebagai gantinya!
Atau Layanan Pelaporan untuk Cassandra / Spark: senyum:

@ amh1979 :
Apakah tidak ada penyaji PowerPoint di sana?
Apakah Anda membuatnya dari reportviewer versi terbaru? (SSRS 2017)
Versi terbaru yang saya tahu di nuget:
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
(140.1000.523, 10 bulan yang lalu)
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WinForms
(140.1000.523)
https://www.nuget.org/packages/Microsoft.SqlServer.Types
(14.0.314.76)

Berikut implementasi CoreFX WinForms untuk NetStandard:
https://github.com/ststeiger/System.CoreFX.Forms

Perhatikan celahnya, karena saya menambahkan proyek NetCore tambahan, dan mengganti nama System.CoreFX.Forms menjadi System.NetStandard.Forms, mungkin mengalami kesulitan memuat sumber daya yang disematkan, jika melakukannya.

File-file tersebut dapat ditemukan di sini:

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

@ amh1979 :
Ah, begitu, itu bukan di Microsoft.ReportViewer.Common.dll.
Tapi ada di direktori ReportServer:
Microsoft.ReportingServices.PowerPointRendering.dll
dan untuk CSV / XML / Atom:
Microsoft.ReportingServices.DataRendering.dll

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

@ALL : Ladies, HTML-renderer bekerja di Linux pada .NET Core / NetStandard 2.0!
Begitu juga dengan WordOpenXML dan perender ExcelOpenXML!
(tidak diuji dengan gambar / grafik - hanya teks dan kode)

PDF-renderer memiliki masalah dengan pinvoke penyematan font.
(Perender Word / Excel-2003 menggunakan pinvoke dan karena itu tidak berfungsi.)
Jika Anda menggunakan versi eval Aspose Cells / Words, Anda dapat mengonversi xlsx menjadi xls, dan docx menjadi doc.
Anda juga dapat membuat PDF dari file kata:
soffice --headless --convert-to pdf filename.docx
(atau sekali lagi, dengan aspose eval)
Berpikir tentang itu, penyaji PPTX juga harus mudah dilakukan, karena yang dilakukannya hanyalah mengambil gambar dari file TIFF dan meletakkan setiap gambar halaman tiff sebagai jpg / png ke slide pptx.
Sepertinya perender gambar adalah hal tersulit untuk dilakukan.
Atau Anda dapat menggunakan wkhtmltoX dan membuat setiap halaman HTML menjadi gambar / pdf.
Itu mungkin akan sedikit lambat.

Luar biasa!

HTML for report

@ SEMUA : Atom / CSV / XML berfungsi. Begitu juga dengan perender NULL.
Di Linux juga.

Render PowerPoint hanya berfungsi di Windows - pinvokes

Fakta menyenangkan: Sepertinya ada perender JSON di sana.
Tetapi untuk beberapa alasan, omong kosong itu hanya berfungsi dalam kasus useSharedDataSetTableHandler, apa pun artinya

ParseDeviceInfo(deviceInfo);

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

Siapapun yang berada di bahaya tahu bagaimana menggunakan JSON-renderer?

@ amh1979 Saya mencoba menggunakan laporan server tetapi sepertinya parameter yang saya tambahkan untuk laporan tersebut tidak bertahan ke server di LoadReport. Apakah ada kemungkinan Anda bisa mengaturnya sehingga dikirim ke server di build Anda berikutnya?

Hai @ststeiger dan @ amh1979 , Kerja bagus untuk ini, apakah ada tutorial tentang cara menggunakan perpustakaan ini di luar sana? Saya mencoba untuk mencari tahu bagaimana / jika saat ini mendukung parameter multi nilai dan apakah penelusuran didukung.
Saya terus mencoba untuk masuk ke situs yang tertaut dalam deskripsi paket nuget (http://www.amhx.org/) untuk melihat, tetapi saya tetap kehabisan waktu.

@Devilindonesia :
Berikut kode uji saya untuk AspNetCore.Reporting.LocalReport, yang saya minati:
catatan:
Jenis render Rpl, RGDI, Atom, Xml, Json, Csv, null, pptx
tidak akan tersedia untuk Anda, karena mereka tidak dalam perakitan amh1979.
(mereka adalah bagian dari SSRS, tetapi tidak ada di ReportViewer yang dapat didistribusikan ulang)

Perhatikan juga, bahwa sumber data bersama (* .rds) harus berada dalam direktori yang sama dengan * .rdl, jika tidak, Anda akan mendapatkan pengecualian referensi null di LocalReport.Execute.

Untuk pertanyaan lebih lanjut:
https://github.com/icsharpcode/ILSpy/releases/tag/v4.0-beta2
(Catatan: dalam kode yang tepat, Anda harus membuang dataTable setelah selesai menggunakannya)

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


    }


}

@ SEMUA : Ada yang ingin membantu?
Jawab pertanyaan ini:
https://stackoverflow.com/questions/52093440/how-to-call-wine-dll-functions-from-c

Dapatkah saya menyarankan bahwa memposting banyak kode dan komentar panjang adalah cara yang sangat sulit untuk dicerna dan dibaca untuk melacak masalah ini?

Saya dapat melihat banyak aktivitas, banyak kode, tetapi sebenarnya saya tidak tahu apa-apa tentang perkembangan terkini (yang tampaknya luar biasa).

Dapatkah saya menyarankan agar semuanya tetap rapi & rapi di sini, dan menggunakan repo / alat lain yang sesuai untuk berbagi kode? Apakah ada pembaruan status sederhana & sederhana yang mungkin dibagikan di sini?

seperti @kierenj saya pikir daftar kode sebagai posting membuatnya sulit untuk diikuti. memasang github dan kemudian membagikan tautan. lihat apakah admin repo ini ingin membuat beberapa cabang dll ...

@kierenj @figuerres : Saya akan baik-baik saja dengan itu, tetapi jika Anda menerbitkan kode Microsoft yang didekompilasi dalam jumlah yang lebih besar tanpa meminta izin terlebih dahulu, Anda mungkin berisiko melewati batas ke tempat mereka mungkin ingin melakukan sesuatu tentang itu ...

aku aku aku. Pembatasan Distribusi. Anda mungkin tidak
• mendistribusikan Kode Terdistribusi untuk dijalankan di platform selain platform Windows;
• kode tersebut diungkapkan atau didistribusikan dalam bentuk kode sumber; atau
• orang lain berhak untuk memodifikasinya.

@tokopedia
dan Anda dapat bekerja dengan repo di sini untuk membuat cabang dan meletakkan kode di cabang itu.
kemudian mereka memilikinya dan mengetahuinya, dll ...

@figuerres : Saya membuat repo di gitlab, di mana repositori pribadi gratis.

@MaximRouiller :
Saya akan memiliki versi ReportViewer (laporan lokal) yang secara kasar bekerja di bawah ASP.NET Core.
Sekitar 75% dari itu bahkan akan bekerja di bawah Linux, yang mana Microsoft telah menerbitkan SQL-Server.
Bagian-bagian yang berfungsi di Linux kemungkinan besar juga berfungsi di MacOS.

Namun versi ReportViewer ini didasarkan pada kode
https://www.nuget.org/packages/AspNetCore.Reporting
yang tampaknya didasarkan pada kode dari
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
yang berada di bawah lisensi ini
http://go.microsoft.com/fwlink/?LinkId=826162

Lisensi ini tidak mengizinkan untuk
• mendistribusikan Kode Terdistribusi untuk dijalankan di platform selain platform Windows;
• kode tersebut diungkapkan atau didistribusikan dalam bentuk kode sumber; atau
• orang lain berhak untuk memodifikasinya.
• mengatasi segala batasan teknis dalam perangkat lunak;
•> rekayasa balik tidak diperbolehkan <

Saya ingin (secara publik) membagikan kode itu dengan komunitas di sini di github, di lokasi yang belum ditentukan, untuk tujuan meningkatkan kode dan untuk mengatasi kemungkinan bug yang tersisa, untuk membawa ReportViewer ke .NET Core.
Namun, saya tidak ingin mengambil langkah seperti itu secara sepihak mengingat lisensi ReportViewerControl.WebForms saat ini.

Saya pikir banyak yang telah berubah sejak lisensi itu pertama kali ditulis / terakhir diperbarui.
Misalnya, tidak masuk akal untuk mempublikasikan ReportViewer untuk .NET Core ketika hasilnya hanya akan berfungsi pada platform windows - juga mempertimbangkan bahwa Microsoft telah merilis SQL-Server untuk Linux, yang berarti pada suatu titik waktu, SSRS harus ikuti saja.

Dan mengingat bahwa ASP.NET-Core tidak mengimplementasikan WebForms, perubahan dari ReportViewer-WebForms ke ReportViewer-NetCore akan menjadi perubahan yang mengganggu.

Bisakah Anda secara diam-diam meminta kekuatan yang, jika, mempertimbangkan keadaan, mereka memberi lampu hijau untuk usaha seperti itu - yang kebetulan akan menghemat waktu dan tenaga MEREKA, juga - dan selaras dengan baik dengan sifat sumber terbuka .NET-Core / NetStandard 2.0.

Sudah lebih dari 2 TAHUN sejak .NET-Core dirilis, dan masih belum ada solusi untuk laporan yang luas dan jauh. Sudah saatnya ini diperbaiki.
Jika kita melakukannya bersama, kita semua akan menjadi lebih cepat dan lebih baik.

http://go.microsoft.com/fwlink/?LinkId=826162
Apa yang saya khawatirkan.
Jika tidak, saya akan menghapus daftar paket dari NuGet.

@ SEMUA : Kabar gembira: Menghapus panggilan COM-InterOP untuk XLS / DOC dan menggantinya dengan OpenMcdf.
XLS / DOC-Renderer sekarang bekerja di Linux dan Windows.
Sekarang 85% bekerja di Linux.

Sepertinya kita turun ke 3 panggilan WinAPI untuk PDFWriter, dan 13 Panggilan WinAPI untuk ImageRenderer / Grafik.
Saya pikir PdfWriter itu sendiri mungkin cukup mudah.

Hai @ststeiger Saya tidak dapat menjalankan AspNetCore. Melaporkan Fungsi Azure dengan Rencana Konsumsi karena telah memblokir fungsi GDI +. Apakah Anda punya solusi untuk itu? Terima kasih.

Belum cukup - itu membuat beberapa panggilan ke GDI + dan usp10.dll, terutama untuk mendapatkan informasi font.
Juga meneruskan petunjuk GDI +, dan tidak ada pengganti sederhana, karena mono libgdi + memilih untuk melakukan sesuatu secara berbeda (untuk alasan yang baik).

Saya telah dapat menulis ulang fungsi GetFontData di C # dengan membaca sumber C Wine, tetapi saya memerlukan freetype untuk mendapatkan informasi font TrueType (wine menggunakan FreeType juga).
SixLabors.Fonts dan LayoutFarm belum ada di sana (dengan margin lebar).
Sini:
https://gist.github.com/ststeiger/273341aebd29009f2b272b822b69563f

Juga, saya mengganti ukuran teks dengan freetype

Sekarang saya perlu mengganti setiap pegangan perangkat GDI dengan kelas khusus.
Kelas itu kemudian harus berisi informasi font / grafik / freetype-face / handle, dll. Jadi saya tidak perlu menulis ulang penyaji.

Ketika itu selesai, saya perlu melihat anggur lagi, untuk transformasi kertas-ke-dunia dan dunia-ke-kertas.
Dan kemudian itu harus dilakukan.
Saya pikir transformasi kertas-ke-dunia dan dunia-ke-kertas mungkin sudah ada di System.Drawing.Graphics.
Sepertinya bagian dari kode tersebut pernah ditulis menggunakan .NET Framwork 1.0.

Selain itu, saya masih perlu memetakan antara font .NET dan font freetype.

hai teman-teman @ALL dan @ststeiger
salam untuk:

@ SEMUA : Kabar gembira: Menghapus panggilan COM-InterOP untuk XLS / DOC dan menggantinya dengan OpenMcdf.
XLS / DOC-Renderer sekarang bekerja di Linux dan Windows.
Sekarang 85% bekerja di Linux.

Office Open XML

sejujurnya saya pikir akan lebih baik untuk menggunakan dokumen XML doc yang lebih baru, maka tidak diperlukan bentuk OLE sama sekali.
Ok jadi jika seseorang masih menggunakan aplikasi Office yang sangat lama, tidak begitu bagus untuk back compat. tetapi Office Open XML telah ada sejak sekitar 2002-2006 sehingga siapa pun yang menggunakan kata atau excel dari 10 tahun terakhir akan dapat menggunakan format file docx dan xlsx dengan baik.
hanya pikiranku tentang itu ...

Supaya kami tidak salah paham:
Tentu saja perender OpenXml Excel bekerja dengan baik.

Saya hanya mengatakan XLS / DOC berfungsi dengan baik, jika perlu.
Sekarang, apakah XLS / DOC harus diekspos atau tidak, atau apakah itu bisa dihapus dengan aman adalah pertanyaan lain. Mungkin masih ada beberapa program lama di luar sana yang tidak dapat bekerja dengan XLSX.

UBS misalnya masih menggunakan program COBOL.
Dan masih banyak lagi lainnya.
Jadi mungkin lebih baik membiarkan fungsionalitas XLS sedikit lebih lama, untuk berjaga-jaga.

@Raymond :
Jika Azure telah memblokir fungsi GDI +, apakah System.Drawing.Common berfungsi sama sekali?
Atau apakah ini hanya berlaku untuk panggilan DllImport framework-eksternal?

Hmm, googling saja.
Sepertinya Perpustakaan System.Drawing tersedia di Azure Cloud Service (pada dasarnya hanya VM), tetapi tidak di Azure Web App (pada dasarnya shared hosting?).
Ini bisa jadi masalah.
Jadi setelah ini dijalankan di Linux, kita perlu mengganti System.Drawing dengan SixLabors.ImageSharp nanti, untuk menjalankannya di Azure Web App.

Ini akan membutuhkan waktu dan tenaga.
@Raymond :
Bisakah Anda memeriksa apakah FreeType (SharpFont wrapper) berfungsi di Azure?
https://github.com/Robmaister/SharpFont

catatan:
Pada x64-Windows, Anda perlu mengganti klausa penggunaan untuk FT_Long dan FT_ULong dengan ini

#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

karena dll freetype yang ditambal tidak berfungsi pada x64-Windows.

Inilah cara saya melakukannya:
https://gist.github.com/ststeiger/9e2eb98e29a3c987aca739045af1d2ce

(Catatan: tentukan WINDOWS dalam opsi build)

dengan beberapa kode tes:

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 akan menghasilkan pengecualian jika koreksi WINDOWS tidak diterapkan.

ketika saya mencoba dengan file .rdlc saya mendapatkan pengecualian
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Dari TMemberType, TCellType) .m_memberTreeHostsRemotable 'tidak dapat diakses dalam konteks ini karena ini adalah' Teman '.'. ' di localreport.Execute ()
tolong bantu aku

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

Tampaknya Anda memiliki masalah dengan ekspresi VB yang disematkan.
Bagaimanapun, ada banyak masalah.

Di Microsoft.VisualBasic1 \ VBCodeGenerator.cs
UseShellExecute harus disetel ke false.

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

Dan FromFileBatch perlu diganti dengan roslyn jika dikompilasi untuk netstandard (penyedia CodeDom tidak dapat mengkompilasi untuk netstandard - pengecualian lucu jika ekspresi VB digunakan, misalnya dalam parameter)


        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

Ada RoslynCodeDomProviders di https://github.com/aspnet/RoslynCodeDomProvider , tetapi mereka tetap menggunakan Roslyn di belakang layar. Dan kompilasi relatif keras dengan "C: \ WINDOWS \ Microsoft.NET \ Framework\\ vbc.exe "bagaimanapun juga adalah ide yang buruk.

Sekarang saya mendapatkan perender lengkap HTML4, HTML5 dan MHTML.
Bukan hanya yang berpagar.

Hai, saya menggunakan [https://www.nuget.org/packages/AspNetCore.Reporting] dan berfungsi dengan sempurna di IIS lokal.
Tapi begitu saya menyebarkannya di windows server 2012 R2 saya mengalami masalah.

Log Kesalahan.

gagal: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]
Pengecualian tidak tertangani telah terjadi saat menjalankan permintaan.
AspNetCore.Reporting.LocalProcessingException: Terjadi kesalahan selama pemrosesan laporan lokal.; Definisi laporan 'D: \ Apps \ BillingApproval \ ReportFiles \ ReleaseProcess.rdl' tidak valid.
Kesalahan tak terduga terjadi saat menyusun ekspresi. Nilai hasil compiler asli: -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: Terjadi kesalahan yang tidak terduga saat menyusun ekspresi. Nilai hasil compiler asli: -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)
di AspNetCore.Reporting.Report.SetParameters (parameter ReportParameter)
di 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) di D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Extension \ AspNetCoreReportingExtension.cs: baris 27
di BA.UI.WebV2.Controllers.ReportsController.ReleaseProcessToPDF (DateTime from, DateTime to) di D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Controllers \ ReportsController.cs: baris 65
di lambda_method (Penutupan, Objek, Objek [])
di Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute (IActionResultTypeMapper mapper, pelaksana ObjectMethodExecutor, Object controller, Object [] argumen)
di Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync ()
di Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync ()
di Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (konteks ActionExecutedContext)
di Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (Status & berikutnya, Cakupan & cakupan, Objek & status, Boolean & isCompleted)
di Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()
di Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()
di Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (konteks ResourceExecutedContext)
di Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (Status & berikutnya, Cakupan & cakupan, Objek & status, Boolean & isCompleted)
di Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync ()
di Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
di Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext)
di Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (konteks HttpContext)
di Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (konteks HttpContext)
di Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke (konteks HttpContext)

@jfmjason : Ini disebabkan ketika CodeDom Code Compiler (.NET 4.0) mencoba untuk mengkompilasi beberapa file di lintasan sementara di ExprHostCompiler. Ia ingin mengkompilasi rakitan NetStandard / NetCore dengan penyedia .NET 4.0. Itu tidak berhasil. Ketika mencoba untuk mengkompilasi file tersebut, csc.exe diam-diam gagal dengan nilai kembali -1073741819.
Karena Anda tidak dapat mengkompilasi kode .NET Core dengan kompiler .NET 4.0, Anda perlu menggunakan RoslynCompilers, yang tidak ada di System.CodeDom. NetStandardFromFileBatch saya di atas memperbaiki masalah itu dengan tepat (dan menggunakan CodeDom jika dikompilasi untuk NetFramework 4).

Namun, perhatikan bahwa runtime VB di .NET Core sangat terbatas.
Pada dasarnya, .NET Core tidak terlalu mendukung VB.NET ..

Jika Anda melihat hal-hal dasar VB, seperti 50 atau lebih fungsi string VB, seperti Replace, Trim, AscW, ChrW, LCase, Len, Mid, di Microsoft.VisualBasic.Strings - .NET Core 2.0 mendukung tepat 2 di antaranya, AscW dan ChrW ...

Jika Anda melihat sumber saat ini di github, Anda akan melihatnya sekarang, mereka ada di sana - tetapi semua bertopik yang menampilkan null.
https://github.com/dotnet/corefx/blob/master/src/Microsoft.VisualBasic/ref/Microsoft.VisualBasic.cs

Jadi selain itu, Anda mungkin harus sedikit mengedit kode VB di laporan Anda - untuk mendukung .NET Core dan NetFramework.

Jadi @ALL : inilah idenya:
Jika Anda ingin laporan Anda dengan kode yang berjalan di .NET Core tanpa modifikasi, mulailah menerapkan fungsi string di Microsoft.VisualBasic.cs.
Atau hapus hal-hal khusus VB-runtime, dan coba gunakan kelas dan fungsi anggota yang disediakan dengan C #, seperti string. Panjang alih-alih Len, IndexOf alih-alih InStr, Subtring alih-alih Mid, "BLA" .ToLower () alih-alih LCase ("BLA") dll ..

Juga, VB-Code secara umum, tidak hanya di .NET Core, memiliki masalah dengan sintaks nullable?.
Jadi gunakan System.Nullable (Of Double) daripada Double ?, jika Anda perlu mendeklarasikan, misalnya, nilai pengembalian fungsi.

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

Selain itu, Anda perlu mengubah referensi assembly di ExprHostCompiler.cs:
(AspNetCore.ReportingServices.RdlExpressions \ ExprHostCompiler.cs)

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

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


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

            return nsAssembly;


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

            // return nsAssembly;
        }



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

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

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

#if NETSTANDARD2_0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                compilerParameters.CompilerOptions += m_langParser.GetCompilerArguments();

@ amh1979 : Saya belum melihatnya, tetapi dalam versi halaman Viewer, apakah gambar dalam laporan muncul dalam rendering HTML halaman?
Karena ketika saya mengambil renderer lengkap html4 & 5 dari ReportServer, gambar sepertinya didelegasikan ke penangan axd atau ashx dari ReportingServices. Namun, mereka muncul dalam versi MHT.

Mereka mungkin harus diubah menjadi url ("data: image / png; base64, SOME_BASE64_IMAGE"); sebagai gantinya, agar mereka sejajar dalam HTML.
Artinya, jika mereka menuju ke tautan non-eksternal.
Tidak menguji apakah itu juga memengaruhi penonton.

@tokopedia

Terima kasih atas tanggapannya. Saya bertanya-tanya mengapa ini berfungsi dengan sempurna ketika saya menerbitkan versi rilis aplikasi web saya (.net core 2.1) di IIS lokal.

Mungkin ini berfungsi secara lokal karena Anda memiliki .NET Framework yang diinstal secara lokal.
Atau karena server web lokal Anda tidak dalam mode terintegrasi, berjalan di bawah pengguna lain, atau mengenai jalur logika lain, pengaturan kumpulan aplikasi, pengaturan keamanan, pengalihan perakitan, dll ..
Juga, ServicePacks, CumulativeUpdates dan "fitur" menarik lainnya.

Membuat aplikasi uji kecil.
Setelah menambahkan System.Drawing.Common di bawah Win10, itu berfungsi dengan baik.
Berjalan di Ubuntu 16.04 menyebabkan kesalahan.
AspNetCore.Reporting.LocalProcessingException: Terjadi kesalahan selama pemrosesan laporan lokal.; Definisi laporan '/opt/testReportViewer/bin/Debug/netcoreapp2.1/Reports/Report1.rdlc' tidak valid.
Kesalahan tak terduga terjadi dalam Pemrosesan Laporan.
Tidak dapat memuat pustaka bersama 'kernel32.dll' atau salah satu dependensinya. Untuk membantu mendiagnosis masalah pemuatan, pertimbangkan untuk menyetel variabel lingkungan LD_DEBUG: libkernel32.dll: tidak dapat membuka file objek bersama: Tidak ada file atau direktori seperti itu ---> AspNetCore.Reporting.DefinitionInvalidException: Definisi laporan '/ opt / testReportViewer /bin/Debug/netcoreapp2.1/Reports/Report1.rdlc 'tidak valid.
Kesalahan tak terduga terjadi dalam Pemrosesan Laporan.
Tidak dapat memuat pustaka bersama 'kernel32.dll' atau salah satu dependensinya. Untuk membantu mendiagnosis masalah pemuatan, pertimbangkan pengaturan variabel lingkungan LD_DEBUG: libkernel32.dll: tidak dapat membuka file objek bersama: Tidak ada file atau direktori tersebut ---> AspNetCore.ReportingServices.ReportProcessing.ReportProcessingException: Terjadi kesalahan yang tidak terduga dalam Pemrosesan Laporan.
Tidak dapat memuat pustaka bersama 'kernel32.dll' atau salah satu dependensinya. Untuk membantu mendiagnosis masalah pemuatan, pertimbangkan untuk mengatur variabel lingkungan LD_DEBUG: libkernel32.dll: tidak dapat membuka file objek bersama: Tidak ada file atau direktori seperti itu ---> System.DllNotFoundException: Tidak dapat memuat perpustakaan bersama 'kernel32.dll' atau satu ketergantungannya. Untuk membantu mendiagnosis masalah pemuatan, pertimbangkan untuk mengatur variabel lingkungan LD_DEBUG: libkernel32.dll: tidak dapat membuka file objek bersama: Tidak ada file atau direktori seperti itu
di AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat (Stream definitionStream, String & description, String & bahasa, ParameterInfoCollection & parameter, DataSourceInfoCollection & dataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlashistternal & dataSetReferences, UserLocation &Lashperlinks & BetsteLocation & parameter
di AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat (Byte [] definisi, String & deskripsi, String & bahasa, ParameterInfoCollection & parameter, DataSourceInfoCollection & dataSources, DataSetInfoCollection & shared dataDataSetReferences, UserLocationFlash &ternalsImetsReferences & UserLocationFlags & linkImetsSetReferensi
di AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport (PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String & reportDescription, String & reportLanguage, ParameterInfoCollection & parameter, DataSourceInfoCollection & DataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, Boolean & hasExternalImages, Boolean & hasHyperlinks, Byte [] & dataSetsHash)
di AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
--- Akhir dari jejak tumpukan pengecualian dalam ---
di AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
di AspNetCore.Reporting.ReportCompiler.CompileReport (konteks ICatalogItemContext, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
--- Akhir dari jejak tumpukan pengecualian dalam ---
di AspNetCore.Reporting.ReportCompiler.CompileReport (konteks ICatalogItemContext, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
di AspNetCore.Reporting.LocalService.GetCompiledReport (PreviewItemContext itemContext, Boolean membangun kembali, ControlSnapshot & snapshot)
di AspNetCore.Reporting.LocalService.CompileReport ()
di AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport ()
di AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession ()
--- Akhir dari jejak tumpukan pengecualian dalam ---

@ststeiger ada berita di perpustakaan AspNetCore.Reporting? Saya telah mencari solusi untuk membuat PDF dari file RDL di .NET Core sejak berhari-hari dan satu-satunya solusi yang saya temukan adalah AspNetCore. Pelaporan, yang kemudian saya temukan hanya berfungsi di Windows dan modifikasi yang Anda buat dan laporkan di sini sangat menarik , juga karena saya mengalami cukup banyak masalah dalam menggunakan sublaporan dan saya tidak dapat men-debug AspNetCore. Pelaporan tanpa sumber, yang Anda miliki :) ... Saya akan sangat tertarik untuk membantu Anda dengan pustaka tersebut untuk meningkatkan bit yang hilang ( dan akhirnya dapat men-debugnya ...)

@ OkunevPY : Ada kemungkinan hal ini disebabkan oleh salah satu fungsi manajemen memori yang digunakan untuk menyimpan data sumber data dengan aman. Di Linux, saya baru saja mematikannya - menyimpan data tanpa enkripsi. Kemudian berhasil, meskipun tidak aman. Anda harus melakukannya dalam kode-ReportViewer. Kode tingkat produksi harus menerapkan metode enkripsi / dekripsi, yang tidak sulit - tetapi saya lebih suka semua fitur berfungsi dulu,

@bayu_joo;
Pembuatan PDF belum berfungsi (hanya berfungsi di Windows).
Juga, jika Anda membuat aplikasi apa pun yang Anda terapkan dengan dll yang direkayasa balik itu, secara teknis Anda melakukan sesuatu yang ilegal.

Jika Anda membutuhkan PDF yang dihasilkan di Linux, saya sarankan untuk membuatnya dari HTML dengan wkHtmlToPdf.
Berikut varian .NET-Core:
https://github.com/ststeiger/libWkHtml2X
Gunakan hanya varian yang dapat dieksekusi (wkhtmltopdf.exe, wkhtmltoimage.exe melalui input / output-stream)
libWkHtmlToX.ProcessManager(opts)
karena wkhtmltox.dll tidak berfungsi dalam skenario multi-threading, ditambah lagi antarmuka C # saya belum sepenuhnya bebas bug.

Beberapa contoh penggunaan (converter.telerik.com untuk mengubah ke C #):

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

Atau, Anda dapat menggunakan PdfSharp untuk .NET-Core
https://github.com/ststeiger/PdfSharpCore

Saya juga telah mem-porting pustaka PDF lengkap ke NetStandard, yang dapat ditemukan di sini:
https://github.com/ststeiger/PdfSharpNetStandard
(jika Anda tidak membutuhkan Azure-hosting, saya sarankan Anda memilih PdfSharpNetStandard)

Sejauh menyangkut ReportViewer-PDF di Linux:
Anda harus menerapkan banyak pinvoke terlebih dahulu (Linux tidak mengimplementasikan Windows-API, dan Anda tidak bisa meneruskan semua panggilan dll ke wine).

Saya baru saja melakukan GetFontData, karena ini yang paling penting (font-embedding).
Jika Anda dapat memberikan nama akun gitlab (bukan hub) Anda, saya dapat memberi Anda akses baca ke repositori.

@ststeiger Saya tahu bahwa menerapkan aplikasi dengan pustaka itu akan ilegal dan saya tidak bermaksud melakukannya, tetapi dengan kode sumber saya setidaknya dapat men-debugnya memahami mengapa saya tidak dapat memuat sublaporan dan meneruskan data ke sana (saya sudah mencoba dengan resharper tapi itu mimpi buruk). Jika Anda ingin memberi saya akses membaca ke repo, saya akan menyukainya :) Nama pengguna gitlab saya adalah zillemarco (seperti di sini di github)

@zillemarco : Menambahkan Anda.
Anda seharusnya mendapat email dari gitlab, mungkin dengan tautan ke repo.

Coba ILSpy 4.0 Beta 2 sebagai ganti Resharper:
https://github.com/icsharpcode/ILSpy/releases

Jika Anda perlu melakukan debug di dalam .NET Framework, coba live-decompile & debug dengan Rider, EAP gratis:
https://www.jetbrains.com/rider/eap/

@ststeiger mendapat email terima kasih :) Terima kasih atas tipnya juga!

@ststeiger Anda dapat memberi akses ke gudang AspNetCore. Melaporkan okunevpy?

@OkunevPY : Anda telah ditambahkan. Lihat email.

@steiger Terima kasih.

        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: 'Terjadi kesalahan selama pemrosesan laporan lokal.; Tidak ada data yang tersedia untuk pengkodean 1252. Untuk informasi tentang menentukan pengkodean khusus, lihat dokumentasi untuk metode Encoding.RegisterProvider.'

@Jhonnybmx : Ada situs web, bernama google.com, tempat Anda memasukkan pesan kesalahan, dan solusinya adalah tautan pertama ...

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

Hai, saya tertarik dengan LocalReport di .NET Core untuk mengekspor laporan rdlc ke PDF.
Bagi saya versi Windows saja sudah cukup untuk saat ini.

Saya menemukan paket NuGet AspNetCore.ReportingServices oleh @ amh1979 yang persis seperti yang saya butuhkan.
Masalahnya adalah bahwa kelas InternalLocalReport dalam paket ini adalah internal dan saya perlu mengakses seluruh API (seperti dalam implementasi MS LocalReport asli) untuk eq. untuk menggunakan peristiwa SubreportProcessing, panggil metode LoadSubreportDefinition () atau GetParameters ().

Metode ini tidak diterapkan di kelas AspNetCore.Reporting.LocalReport (di AspNetCore.Reporting NuGet) jadi saya perlu memanggilnya secara langsung.

Rakitan AspNetCore.ReportingServices.dll telah menetapkan rakitan InternalsVisibleTo untuk AspNetCore.Reporting.dll.
Dapatkah saya entah bagaimana menggunakannya seperti itu di https://github.com/amh1979/Reporting/tree/master/AspNetCore.Reporting dengan sertifikat Reporting.pfx (yang saya tidak memiliki kata sandi).

Tolong bisakah Anda membantu saya? Apa solusi untuk ini?

@ststeiger Anda dapat memberi saya akses ke gudang GitLab AspNetCore. Pelaporan juga. Nama pengguna GitLab saya adalah holajan.
Terima kasih

AspNetCore.ReportingServices di bawah lisensi ini
http://go.microsoft.com/fwlink/?LinkId=826162
Saya telah menutupnya

Bisakah seseorang memberikan dokumentasi / petunjuk atau petunjuk tentang cara menggunakan / mengimplementasikan paket ini? Terima kasih banyak.

@ststeiger Bisakah Anda memberi saya akses ke AspNetCore.Reporting repository? Saya mencoba membuatnya berfungsi di Linux dengan PDF.

@holajan , @skivsoft :
Maaf, sedang liburan - perjalanan yang menyenangkan ke Singapura dan Thailand.
Akses diberikan, Anda seharusnya sudah mendapatkan email ke alamat yang diberikan ke gitlab.

@tokopedia

ketika saya mencoba dengan file .rdlc saya mendapatkan pengecualian
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Dari TMemberType, TCellType) .m_memberTreeHostsRemotable 'tidak dapat diakses dalam konteks ini karena ini adalah' Teman '.'. ' di localreport.Execute ()
tolong bantu aku

Saya berhasil mereproduksi kesalahan itu.
Perubahan berikut diperlukan:


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)

dan

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

Selain itu, koreksi berikut pada
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 + "\"")

Kemudian kode kustom berfungsi, setidaknya dalam kasus saya.
Diperbarui dalam master.

@ststeiger Terima kasih atas aksesnya. Apakah Anda tahu cara merender PDF di Linux? Ada terlalu banyak pinvoke untuk diganti.

@skivsoft : Belum ada.
Anda harus mengganti semua pinvoke dengan freetype yang setara, yang membutuhkan banyak pekerjaan.

Jika Anda hanya perlu membuat PDF di Linux, Anda dapat mencoba PdfSharpCore atau PdfSharpNetStandard:
https://github.com/ststeiger/PdfSharpCore
https://github.com/ststeiger/PdfSharpNetStandard
Saya menggunakan keduanya di Linux.
PdfSharpNetStandard lebih lengkap, tetapi juga menggunakan GDI + / libGDIplus, sedangkan PdfSharpCore menghindari System.Drawing.

@ststeiger Terima kasih atas akses ke repo.

Saya bisa mendapatkan laporan saya berfungsi (ekspor ke PDF) di aplikasi Windows .NET core 2.2 saya.
Saya membuatnya di salinan proyek ReportViewer_NetStandard Anda, karena saya menghapus LocalReports dan mengubah InternalLocalReport ke LocalReport dan membuat kelas menjadi publik (saya memerlukan akses ke API LocalReport asli).

Untuk laporan saya, saya memperbaiki dua masalah:
Beberapa ekspresi Visual Basic:
IIf - Saya menambahkan Impor ke Microsoft.VisualBasic.Interaction di _ExprHostBuilder_, Berubah ke netcoreapp2.2 di mana kelas Microsoft.VisualBasic.Interaction di _Microsoft.VisualBasic.dll_ bersifat internal dan menambahkan kelas Microsoft.VisualBasic.Interaction saya ke Microsoft.VisualBasic1 .

Format - menambahkan Impor ke Microsoft.VisualBasic.StringsEx di _ExprHostBuilder_, menambahkan kelas Microsoft.VisualBasic.StringsEx ke Microsoft.VisualBasic1 (karena kelas asli Microsoft.VisualBasic.Strings bersifat publik tetapi tanpa fungsi Format)

System.Environment.NewLine - menambahkan Referensi ke System.Runtime.Extensions.dll di _ExprHostCompiler_.

Ini adalah perubahan dalam kode:

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

Perbaiki sublaporan dengan ekspresi:
Saya melihat bahwa elemen Sublaporan menggunakan ReportRuntime.LoadExprHostAssembly , di mana rakitan ExpressionHost.dll di -cache dengan nama, tetapi nama untuk semua laporan dan sublaporan selalu sama "_ExpressionHost_". Saya menghapus cache ini.
Perubahan kode:

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

Harap tinjau perubahan ini dan jika ini masuk akal bagi Anda, lakukan perubahan tersebut di repo Anda juga.

Terima kasih.

@holajan : Jika saya menambahkan System.String ke ruang nama, saya mendapatkan:
Ambigous call to Replace - cannot resolve call
dan jika saya menambahkan kelas Microsoft.VisualBasic.Interaction, saya mendapatkan:
ambigous call to Microsoft.VisualBasic.Interaction
ketika saya menjalankannya di NetCore atau .NET Framework 4.
Mungkin ini hanya berfungsi di .NET Core 2.2.

Jika cache salah, maka lebih baik tidak cache.
Setuju dengan perubahan itu.
Saya memasukkan kode lama ke #ifdef false (alih-alih menghapusnya).

@ststeiger Saya mengedit komentar saya, menggunakan untuk System.String salah, saya sekarang menerapkan Microsoft.VisualBasic.StringsEx sebagai gantinya untuk Format dan fungsi lainnya. Maaf untuk itu.

Ya Microsoft.VisualBasic.Interaction hanya bekerja di .NET Core 2.2., Karena kelas Microsoft.VisualBasic.Interaction ada di Microsoft.VisualBasic.dll untuk .NETCoreApp v2.2 internal , di Microsoft.VisualBasic.dll untuk .NETCoreApp v2.09 adalah publik tetapi dengan metode internal IIf .
Saya tidak tahu bagaimana menyelesaikan ini dengan lebih baik, tetapi dengan .NET core 3.0 itu mungkin akan berubah.

@holajan : Sampai
Saya membuat InternalLocalReport menjadi publik.
Nama yang aneh sekarang terkait dengan kemasyarakatannya;)

@holajan : Menambahkan Microsoft.VisualBasic.StringsEx, sekarang berfungsi
Harus menambahkan IReadOnlyDictionary untuk .NET 4, tetapi itu hanya sebagai komentar kecil.
Bisakah Anda menguji apakah itu berhasil dengan Anda.

@steiger saya mengujinya.
Saya harus mengubah # jika salah menjadi # jika benar di Microsoft.VisualBasic1._Interaction.cs agar ekspresi IIf berfungsi.
Jika tidak, itu bekerja dengan baik.
Thanx

@holajan : Oke, begitulah seharusnya. mungkin definisi dalam solusi akan lebih baik.

Setiap orang di utas ini harus memilih ini untuk ditambahkan, di sini: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- inti

Pada 2019/03, yang ke-7 dari Fitur yang paling dicari: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Edit: Pada 2019/05 yang ke-5 dari atas

Sunting: Pada 2019/07 yang ke-4 dari atas

        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: 'Terjadi kesalahan selama pemrosesan laporan lokal.; Tidak ada data yang tersedia untuk pengkodean 1252. Untuk informasi tentang menentukan pengkodean khusus, lihat dokumentasi untuk metode Encoding.RegisterProvider.'

Tambahkan kode di bawah ini:
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
Itu memecahkan masalah saya

Hai,

Saya telah mencoba mengekspor laporan dalam Html menggunakan kode di bawah ini tetapi tidak ditampilkan dengan benar.

File .rdl berisi bagan

Saya telah melampirkan tangkapan layar Html

Sangat menghargai jika Anda dapat membantu kami untuk menyelesaikan masalah ini.

Terima kasih

PlatForm: ASP.NET Core

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

string mimtype = "";
ekstensi int = 1;

       LocalReport localReport = new LocalReport(_reportPath);

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



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

Chart_html

@chinturathod : Apa yang ditampilkan oleh URL dari "bagan laporan"?
HTML-renderer memiliki aliran keluaran sekunder untuk CSS.
Apakah itu berisi gambar berenkode base64? Atau hanya tautan ke penangan gambar?

@tokopedia
Hai, Temukan HTML dan CSS di bawah ini
HTML:

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







CSS:

"#rsoReportDiv .A97993c8d452f40d4910a317776d607f616xBc {
batas: 1pt tidak ada Hitam;
background- color: Transparan;
}

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;

}

Laporkan elemen bagan
Report chart
saya pikir kesalahan ini menyebabkan masalah

Terima kasih..

@tokopedia

Hai, Ada Pembaruan?

@chinturod :
Saat ini saya mengerjakan CEF-pdf sebagai pengganti wkhtml2X, dan di SwissRe Reports.

Saya akan punya waktu untuk melihat proyek ini paling cepat dalam dua minggu.

Apakah ada repositori (pribadi atau lainnya) untuk paket AspNetCore.ReportingServices yang dapat saya akses?

@clintb : Saya memerlukan nama akun git LAB Anda , jadi saya dapat memberi Anda akses.
Anda kemudian akan menerima email ke alamat email dari akun lab git yang berisi akses repo.

Hei Stefan, gitLab-ku adalah c_l_i_n_t. Terima kasih!

Pada Jum, 26 Apr 2019 pukul 12:18 PM Stefan Steiger [email protected]
menulis:

@clintb https://github.com/clintb : Saya perlu nama akun Git LAB Anda , jadi
Saya dapat memberi Anda akses.
Anda kemudian akan menerima email ke alamat email dari git lab
akun yang berisi akses repo.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/aspnet/AspNetCore/issues/1528#issuecomment-487133308 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ABURO5ILQUEGMZARNW2HNALPSM2M5ANCNFSM4CFRN7MQ
.

@ clintb : Anda telah ditambahkan.

Hai @ststeiger , jika Anda mau, berikan akses repo ke lotsatrees. Terima kasih atas pekerjaan dan bantuan Anda.

@lotsatrees : Anda telah ditambahkan.

Terima kasih Stefan, senang membelikanmu bir enak kapan saja.

Hai @ststeiger ,

@tokopedia
Gitlab saya adalah ikourfaln
Terima kasih

@ikourfaln , @edgardoreyes : Menambahkan kalian berdua; Anda seharusnya sudah menerima email ke akun email yang Anda daftarkan dengan gitlab.

@ststeiger , apakah mungkin juga menambahkan diri saya (Mhirji di gitlab)?

Terima kasih!!

@Mhirji : Selesai.

Terima kasih!!!

Mengapa tidak hanya membuat Proyek Server Laporan dan menggunakannya sebagai layanan untuk jenis proyek apa pun?
Proyek ASP.NET Core Anda hanya memerlukan URL layanan laporan untuk menampilkan laporan.
Ada masalah dengan pendekatan itu?

@ststeiger bisakah saya mendapatkan akses juga? (ConstantDisaster di gitlab) terima kasih sebelumnya

@ConstantDisaster : Ditambahkan.
@mshwf : Tidak, sebenarnya itulah yang ingin saya lakukan - jadi kita dapat menjalankan laporan di aplikasi kita sendiri, dan tidak diperlukan server laporan (selalu ada masalah dengan otentikasi windows - karena beberapa alasan departemen TI tidak dapat menambahkan pengguna baru ke grup - ditambah selalu masalah dengan paket layanan yang dicopot, tidak mau memperbarui ke versi SQL-server terbaru karena pelanggan ingin melewatkan versi, membuat ketidakkonsistenan antara ReportViewer dan ReportServer, sysadmin kami terlalu malas untuk menginstal apa pun, dll.). Hanya kekurangan waktu, seperti biasa. Ditambah lagi hari-hari cerah pertama di musim panas, di sini di Eropa Barat Laut, dan saya tidak ingin melewatkannya.

@ststeiger Apakah ada alternatif yang lebih baik? (Saya mencoba membaca utas ini, tetapi sangat panjang!)
juga dapatkah Anda memberi saya akses ke repo GitLab (mshwf)?
Terima kasih

Mohon dukung permintaan ini, semoga Microsoft mendengarkan kami!

Hai @ststeiger, maukah Anda menambahkan saya juga?
Nama pengguna gitlab saya adalah k3flo
Terima kasih banyak
Vielen Dank 😊

@ststeiger terima kasih telah menambahkan, jadi bagaimana saya mulai menggunakan ini lagi? dalam proyek inti bersih asp? pikir itu readme atau sesuatu, terima kasih lagi.

@ConstantDisaster : Ada "contoh", di AnyWebReporting\Any_TestCode\TestReport.cs .
Ini menunjukkan bagaimana membuat laporan dengan parameter dan dataset ke dalam PDF.

Pendeknya:
1) Buat kamus untuk parameter laporan:

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

2) Tambahkan semua parameter yang Anda miliki dalam laporan Anda ke kamus, misalnya

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

3) Buat laporan berbasis LocalReport baru dan muat

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

Kemudian, untuk semua dataset yang hanya digunakan dalam parameter, Anda dapat menambahkan dataable kosong (bukan NULL)
lr.AddDataSource("SEL_Standort", new System.Data.DataTable());

Dan untuk setiap dataset yang digunakan, Anda perlu mengisi datatable dengan hasil query dari dataset tersebut, dan menambahkan dataset tersebut ke sumber data:

lr.AddDataSource("DATA_Schluesselbestandeskontrolle", dt);

Kemudian, Anda dapat menjalankan laporan, mengambil hasilnya, dan menulisnya di suatu tempat, misalnya drive d:

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

Saya telah menambahkan contoh halaman HTML yang meniru desain antarmuka laporan ReportViewer 2014 & 2017, yang saya miliki dalam versi draf. Jika Anda mengambil lagi dari git, Anda akan menemukannya di:

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

Dan itu dia.
Jika Anda perlu menampilkan laporan di web, Anda dapat merender ke html dengan meneruskan masing-masing Enum ke di lr.Execute (RenderType.HTML5_0 atau HTML4_0 atau Mhtml), dan meneruskan nomor halaman yang benar. Hasilnya (HTML) ada di MainStream, dan CSS ada di SecondaryStream.

Namun, menghubungkan index.htm ReportViewer dengan lr.Execute by JavaScript, Anda perlu melakukannya sendiri, untuk saat ini. Belum sempat melakukan itu. Untuk saat ini, saya membutuhkannya untuk membuat PDF untuk ditambahkan ke email.

@ k3flo @mshwf : Ditambahkan.

@bayu_joo

@ststeiger Apakah ada alternatif yang lebih baik? (Saya mencoba membaca utas ini, tetapi sangat panjang!)

Tidak sepengetahuan saya, kalau tidak saya akan menggunakannya.
Mungkin kita akan melihat sesuatu dalam hal ini setelah rilis .NET Core 3.1 (LTS) , karena jalan akan bebas untuk membuat ReportViewer khusus windows berdasarkan .NET Core.

Namun, hal seperti itu akan menjadi bricolage seperti proyek ini, jadi mungkin mereka akan meluangkan waktu untuk menghapus semua kode System.Drawing (dan WinAPI memanggil ke GDI +), dan melakukannya dengan benar, artinya, lintas platform. Padahal menurut saya, ini tidak mungkin. Meskipun demikian, bukannya tidak senang mendapat kejutan positif (batuk).

Masalahnya, Laporan dapat berisi kode VB, dan dukungan VB di .NET Core (<3), saat ini, patut dipertanyakan - paling banter. Ini akan (= seharusnya secara teoritis) diperbaiki oleh .NET Core 3, dan jika mereka membuat ReportViewer, mereka kemungkinan besar akan menunggu sampai rilis LTS, setidaknya.

@bayu_joo
Anda tidak perlu membaca seluruh utas ini.
Yang perlu Anda lakukan hanyalah git-clone proyek dan melihat contoh laporannya (Anda tidak akan memiliki database untuk menjalankannya).

Bisakah Anda menambahkan saya di gitlab?
dcga.dll

@dcga : Ditambahkan.

Hai, Bisakah Anda menambahkan saya di gitlab Anda? Saya mengubah laporan ke proyek Inti ASP.net sekarang.

@ ericyu67 : Saya kira nama akun gitlab Anda adalah ericyu? Dalam hal ini Anda ditambahkan.

Benar, terima kasih.

@ststeiger bisakah Anda menambahkan saya?
rodrigorrl

@rodrigorrl : ditambahkan.

@ststeiger bisakah Anda menambahkan saya?

@myersBR : Selesai.

@ststeiger bisakah Anda menambahkan saya?

@acofalc : Menambahkan @ aco.mit

Hai, @ststeiger tolong tambahkan saya: oblin228, terima kasih.

Ada berita tentang ini? Saya menggunakan ASP.NET Core dan saya menolak kembali ke formulir web. Saya memiliki proyek laporan dan saya memberi makan url dari server laporan ke aplikasi saya untuk mengunduh file. Masalahnya adalah ia terus-menerus meminta otentikasi windows dan saya ingin menghindari ini ...

@oblin : Ditambahkan.

@jfcaldeira : Selama Anda menjalankan aplikasi di Windows, reportviewer di gitlab akan berfungsi, lebih atau kurang (buka masalah dengan gambar dalam output HTML, sejauh ini). Jalankan di Linux, dan itu akan berfungsi selama Anda tidak menggunakan PDF, TIFF atau PowerPoint sebagai format keluaran (tidak tahu tentang kata), tetapi Excel, html, xml, dan json bekerja di Linux, juga (dalam uji 1-laporan saya - tidak dapat mengatakan apakah tidak ada yang meledak jika Anda menggunakan set fitur lengkap).

Tetapi jika masalah Anda adalah otentikasi Windows pada SSRS, mengapa Anda tidak menggunakan keamanan khusus (alias. Otentikasi bentuk SSRS).

Untuk itu lihat disini:
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

Anda mungkin perlu memasukkan pengguna dengan Form-Post di JavaScript, dan menetapkan kebijakan P3P (di SSRS melalui modul http) agar SSRS-auth-cookie tetap ada di IE di seluruh domain ... (catatan: jika Anda menggunakan direktori virtual, dan memiliki 2 aplikasi di satu SSRS, cookie-auth dari application1 [yang ada di domain-SSRS] akan menimpa cookie-auth dari application2, yang juga ada di domain-SSRS)

@oblin : Ditambahkan.

@jfcaldeira : Selama Anda menjalankan aplikasi di Windows, reportviewer di gitlab akan berfungsi, lebih atau kurang (buka masalah dengan gambar dalam output HTML, sejauh ini). Jalankan di Linux, dan itu akan berfungsi selama Anda tidak menggunakan PDF, TIFF atau PowerPoint sebagai format keluaran (tidak tahu tentang kata), tetapi Excel, html, xml, dan json bekerja di Linux, juga (dalam uji 1-laporan saya - tidak dapat mengatakan apakah tidak ada yang meledak jika Anda menggunakan set fitur lengkap).

Tetapi jika masalah Anda adalah otentikasi Windows pada SSRS, mengapa Anda tidak menggunakan keamanan khusus (alias. Otentikasi bentuk SSRS).

Untuk itu lihat disini:
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

Anda mungkin perlu memasukkan pengguna dengan Form-Post di JavaScript, dan menetapkan kebijakan P3P (di SSRS melalui modul http) agar SSRS-auth-cookie tetap ada di IE di seluruh domain ... (catatan: jika Anda menggunakan direktori virtual, dan memiliki 2 aplikasi di satu SSRS, cookie-auth dari application1 [yang ada di domain-SSRS] akan menimpa cookie-auth dari application2, yang juga ada di domain-SSRS)

Halo, terima kasih telah menjawab tentang masalah saya. Saya belum pernah mendengar reportviewer ini di gitlab, dapatkah Anda menunjukkan kepada saya jangkar untuk itu?

Dan tentang otentikasi windows, masalahnya adalah saya memiliki pengguna yang diautentikasi menggunakan otentikasi cookie pada aplikasi saya di ASP.NET Core dan solusi untuk membuat pengguna mengakses laporan pada dasarnya meneruskan URL langsung dengan parameter ke href dari jangkar dan pilih PDF sebagai format di atasnya juga. Saya mencoba menemukan cara untuk tidak meminta otentikasi kepada pengguna karena mengganggu pengguna akhir karena harus mengautentikasi dua kali. saya sudah menggunakan akun tertentu hanya untuk akses sumber data, itu salah.

Hai, @ststeiger - gitlab saya adalah arunputhran. Bisakah Anda memberi saya akses? terimakasih banyak!

Memposting ulang ini karena sudah terkubur di semua permintaan "beri saya akses ke gitlab".

Setiap orang yang menemukan utas ini harus memilih .NET Core SSRS ini untuk ditambahkan, di sini: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for -asp-net-core

Mulai ke-7 dari atas, dan naik ke peringkat ke-4 dari atas, fitur SQL Server yang paling banyak diminta (https://feedback.azure.com/forums/908035-sql-server?category_id=325159)

Sunting: Karena posting ini naik ke posisi ke-3 sekarang

Tidak yakin apakah itu membantu ...

@arunputhrankyc : Ditambahkan.

@ k290 : Nah, seperti yang Anda lihat, Tema Gelap untuk SQL Server Management Studio 2017 jelas lebih penting: scream:: man_facepalming:: woman_facepalming:
Rupanya, mereka belum pernah mendengar tentang SQL-ops-studio / AzureDataStudio .

Saya pikir, dalam semangat itu, seseorang harus menambahkan desain datar ke daftar keinginan itu, hanya sebagai lelucon.
Sayangnya, ini belum 1 April: wink:

dengan cara saya mendapatkan laporan sebagai pdf dari api web dan saya tidak menggunakan bit wcf.
hanya panggilan sabun / asmx dan panggilan http.
dalam melakukannya saya melewati credentails tanpa masalah.
kode saya adalah asp.net 4.6 / web api 2
jika Anda ingin melihat apa yang saya lakukan, saya dapat memasang beberapa kode di github minggu depan untuk Anda periksa.
saya menelepon server laporan 2016 tetapi sebagian besar dari apa yang saya lakukan akan bekerja dengan rilis ssrs yang lebih lama.

Halo, saya membaca komentar Anda ini bagaimana Anda menangani SSRS. Saya juga melakukan hal serupa, saya memiliki jangkar di aplikasi ASP.NET Core yang memiliki URL langsung ke laporan dengan parameter disertakan dan ekstensi format. Namun masalahnya adalah ia meminta otentikasi windows. Apakah ada cara untuk berhenti menanyakan hal ini karena pengguna sudah masuk ke aplikasi saya menggunakan otentikasi cookie? Saya bahkan tidak peduli menampilkan laporan selama itu diunduh tetapi alangkah baiknya untuk melewati otentikasi

@arunputhrankyc : Ditambahkan.

@ k290 : Tidak, seperti yang Anda lihat, Tema Gelap untuk SQL Server Management Studio 2017 jelas lebih penting 😱 🤦‍♂ 🤦‍♀
Rupanya, mereka belum pernah mendengar tentang SQL-ops-studio / AzureDataStudio .

Saya pikir, dalam semangat itu, seseorang harus menambahkan desain datar ke daftar keinginan itu, hanya sebagai lelucon.
Sayangnya, ini belum 1 April 😉

Yah saya akan membunuh untuk tema gelap untuk SSMS pasti tetapi saya akan makan tangan kosong saya untuk SSRS itu. Jumlah pekerjaan yang disimpan dengan merender data yang dikelompokkan langsung dari SQL sangatlah menakjubkan.

Solusi hebat, tambahkan saya di gitlab: @kholossok , terima kasih

Tolong tambahkan saya juga di gitlab: @EMaderbacher

@kholossok , @EMaderbacher : Ditambahkan.

Tolong tambahkan saya juga @jfcaldeira

@jfcaldeira : Anda harus memberi saya akun lab git.
Ini adalah akun git hub .
Gratis. https://gitlab.com
Repositori pribadi tidak gratis di github pada saat itu.

@tokopedia
Repositori pribadi sekarang gratis di GitHub, batasannya ada pada jumlah kolaborator.

@jfcaldeira : Anda harus memberi saya akun lab git.
Ini adalah akun git hub .
Gratis. https://gitlab.com
Repositori pribadi tidak gratis di github pada saat itu.

Saya telah membuat akun dengan nama pengguna yang sama

@jfcaldeira : Ditambahkan. Anda seharusnya mendapatkan email dengan informasi akses.
@ikourfaln : Saya tahu. Tidak tahu ada batasan untuk 3 kolaborator di repo pribadi github. Senang mengetahuinya, terima kasih .

Batasan Gitlab:

Untuk merayakan kabar baik hari ini, kami telah menaikkan batas penyimpanan per repositori di GitLab.com secara permanen dari 5GB menjadi 10GB. Seperti sebelumnya, repositori publik dan pribadi di GitLab.com tidak terbatas, tidak memiliki batas transfer, dan termasuk kolaborator tanpa batas.

Bolehkah saya ditambahkan juga? Akun GitLab saya adalah barryjsilver. Terima kasih!

Bisakah saya ditambahkan? @jyanosu Terima kasih!

@BarryJSilver : Ditambahkan.

@jyanosu : Saya memerlukan akun git lab .com, bukan github.

@ststeiger Ups, setel saja .. nama pengguna yang sama @jyanosu

@jyanosu : Ditambahkan.

@ststeiger dapat menambahkan akun gitlab saya @ kanichi123
Terima kasih!

@ kanichi123 : Ditambahkan.

@steiger tolong akun saya juga sheryever

@sheryever : Ditambahkan.

@ststeiger tolong bisa tambahkan akun gitlab saya @PentaTech
Terima kasih!

@ststeiger bisakah Anda menambahkan saya juga? @bayu_joo
Terima kasih!

@PentaTech , @ g-rad: ditambahkan.

Usaha yang bagus

@ brad0000 : Selesai.

Hai @ststeiger , bisakah Anda menambahkan saya juga? akun gitlab: wyepez. Terima kasih

@wyepez : Ditambahkan.

@ststeiger Bisakah Anda menambahkan saya juga?

Nama pengguna Gitlab: choudeshell

@choudeshell : Ditambahkan.

Bisakah Anda menambahkan saya? Terima kasih!

Apakah solusi Anda berfungsi dengan .rdlc (serta sisi server .rld)? Terima kasih

Apakah solusi Anda berfungsi dengan .rdlc (serta sisi server .rld)? Terima kasih

@mpirritano : Ya, sebenarnya tidak banyak perbedaan antara RDL dan RDLC.
Tapi itu hanya web. Tidak ada Formulir Windows.
Saya perlu akun lab git untuk menambahkan Anda, bukan github.

@ststeiger Terima kasih - Saya telah membuat akun GitLab sekarang : @mdpirrit

Itu bagus - Saya hanya membutuhkannya untuk ASP .NET Core yang menargetkan .NET Core. Terima kasih!

@mpirritano : Ditambahkan, Anda seharusnya sudah mendapatkan email ke akun email yang Anda gunakan untuk mendaftar gitlab.

Oke; Terima kasih!

@ststeiger bekerja dengan baik kecuali tidak dapat membuat Grafik. - itu membuat area bagan dengan kesalahan: " Tidak dapat memuat file atau perakitan" System.Windows.Forms, Versi = 4.0.0.0 "

Apakah ini batasan yang diketahui atau saya melewatkan sesuatu?

Terima kasih

@ststeiger Juga, tampaknya sublaporan tidak didukung. yaitu, tampaknya tidak ada eventhandler pemrosesan sublaporan untuk menambahkan sumber data ke turunan sublaporan

Terima kasih

Bisakah Anda menambahkan saya? Terima kasih! @tokopedia

Apakah solusi Anda berfungsi dengan .rdlc (serta sisi server .rld)? Terima kasih

@mpirritano : Ya, sebenarnya tidak banyak perbedaan antara RDL dan RDLC.
Tapi ini hanya jaringan. Tidak ada Formulir Windows.
Saya memerlukan akun Git Lab untuk menambahkan Anda, bukan GitHub.

Bisakah anda menambahkan saya Terima kasih! @tokopedia

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

@bayu_joo :

Apakah ini batasan yang diketahui atau saya melewatkan sesuatu?

Ya, satu batasan yang saya sadari bahwa itu bisa ada.
Dan juga, ada masalah dengan keluaran gambar dalam HTML.
Poin terbuka.
Saya bahkan belum memikirkan sublaporan.
Sayangnya, kami memiliki beberapa dari mereka juga, jadi ini akan menjadi masalah saya juga.
Berbicara tentang itu, saya bahkan tidak tahu bagaimana sublaporan ditangani dalam ReportViewer normal pada kerangka penuh, khususnya karena dapat bersifat rekursif.

Mungkin ada masalah di suatu tempat, karena "System.Windows.Forms, Version = 4.0.0.0" tidak ada dalam versi itu di .NET Core, dan juga, rakitan disebut System.NetStandard.Forms sebagai gantinya di ReportViewer untuk .NET Core. Mungkin bekerja pada kerangka penuh, karena memang ada System.Windows.Forms, Versi = 4.0.0.0.

Masalah dengan System.Windows.Forms mungkin dapat diperbaiki semudah memasukkan nama dan versi assembly (di mana pun ia bersembunyi di kode sumber) ke dalam ifdef, sublaporan agak tidak saya kira.

Saya masih harus menyelesaikan layanan pengiriman laporan minggu ini, jadi saya mungkin dapat melihat masalah System.Windows.Forms beberapa waktu minggu depan.

Sejauh sublaporan berjalan: bagaimanapun juga itu adalah ide yang buruk, cenderung menimbulkan masalah dengan PDF dan Excel, dan jika Anda hanya memiliki 1 laporan, saya akan merekomendasikan untuk melihat apakah tidak mungkin untuk menghilangkan sublaporan sama sekali entah bagaimana caranya , dan membuat semua yang ada dalam satu laporan.

Добавлено
Bagaimana cara mendapatkan database COR_Basic_SwissLife_UAT?

: rofl: Haha, bagus, tidak, DB itu rahasia.
Tapi Anda bisa membuat laporan contoh Anda sendiri, menggunakan database Anda sendiri.
Anda harus melihat dari contoh cara menggunakannya.

@steiger Terima kasih. Sebenarnya, saya melihat bahwa ada acara SubreportProcessing yang didefinisikan di AsNetCore.Reporting.InternalLocalReport. Saya dapat mencoba membuat antarmuka publik untuk ini dan melihat apakah saya dapat meneruskan sumber data ke maksud sublaporan. Saya mungkin tidak akan membahas ini sampai minggu depan juga ...

Saya mencoba untuk menghindari sublaporan juga, tetapi saya menganggapnya perlu jika Anda memerlukan bagian berulang dalam bagian berulang. Sehubungan dengan Excel, dimungkinkan untuk membuat setiap contoh sublaporan sebagai lembar kerja di excel dengan rdlc / rdl

Memposting ulang ini untuk pendatang baru.

Setiap orang di utas ini harus memilih ini untuk ditambahkan, di sini: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- inti

Pada bulan Maret tahun ini, peringkat ke-7 dari atas.

Sekarang, kami telah mendapatkannya hingga ke-2 dari atas saran SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Bisakah kita mengalahkan Mode Gelap?

@ststeiger Saya sebenarnya punya sedikit waktu hari ini dan berhasil membuat laporan dengan sublaporan dalam .docx, .xlsx, dan .pdf.

Sebagai tes cepat pada salinan lokal saya - Saya mengubah pengubah akses properti "localReport" dari kelas "LocalReport" dari "internal" menjadi "publik". Kemudian saya dapat menulis penangan untuk peristiwa "SubreportProcessing" seperti yang biasa saya lakukan (di mana saya akan membaca nilai parameter ke instance subreport dan menggunakannya untuk memfilter kumpulan data yang akan saya berikan ke sumber data dari instance sublaporan)

Saya tidak tahu bagaimana cara memperbaiki masalah rendering grafik dengan .NET Core; jadi jika Anda bisa mencapai solusi yang luar biasa. Tetapi selain itu, saya pikir solusi Anda melakukan semua yang saya perlu lakukan (saya pribadi tidak pernah membuat laporan dalam format HTML)

Terima kasih

ekspor- kata, unggul tidak bangun?
FormatException: Header berisi nilai yang tidak valid pada indeks 0: ''

pelayanannya sangat lambat. apa yang bisa dilakukan? Tolong bantu....

Halo semuanya, saya baru saja selesai menulis port kustom dari kontrol penampil laporan menggunakan ReportExecutionService.asmx yang dibangun ke dalam SSRS dan saya menargetkan ASP.NET MVC. Saya meminta seseorang untuk memindahkannya ke .NetCore & MVC jadi saya telah menyelesaikannya. Cobalah dan beri tahu saya pendapat kalian: https://github.com/alanjuden/MvcReportViewer

Alan

ekspor- kata, unggul tidak bangun?
FormatException: Header berisi nilai yang tidak valid di indeks 0: ''

pelayanannya sangat lambat. apa yang bisa dilakukan? Tolong bantu....

@azikaa : Apakah Anda menggunakan MvcReportViewer, atau AspNetCore.ReportViewer?

Kami menutup masalah ini karena tidak relevan secara langsung dengan repo ini dan berdasarkan komentar di sini tim SSRS sudah mengetahui umpan balik ini. Mengingat jumlah komentar yang didapatnya, sekarang tidak dapat dikelola.

Tanggapan @ k290 adalah yang paling bisa ditindaklanjuti di sini, jadi ikuti sarannya di sini :

Memposting ulang ini untuk pendatang baru.

Setiap orang di utas ini harus memilih ini untuk ditambahkan, di sini: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- inti

Pada bulan Maret tahun ini, peringkat ke-7 dari atas.

Sekarang, kami telah mendapatkannya hingga ke-2 dari atas saran SQL Server: https://feedback.azure.com/forums/908035-sql-server?category_id=325159

Bisakah kita mengalahkan Mode Gelap?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat