Aspnetcore: Asp.Net Core Reporting (SSRS)

تم إنشاؤها على ٢ يونيو ٢٠١٦  ·  269تعليقات  ·  مصدر: dotnet/aspnetcore

أنا أعمل على تطبيق ASP.NET Core ولا يمكنني العثور على حل لعرض تقارير SSRS. مع غياب "Microsoft.Reporting.WebForm" لم يعد يعمل. ما هي أفضل ممارسة لعرض تقارير SSRS على الويب في ASP.NET Core

External

التعليق الأكثر فائدة

ما يقرب من 2 سنوات. تم إصدار Core 2.0. فريق SSRS ، استيقظ.

ال 269 كومينتر

مع استمرار Core في RC (RTM بحلول نهاية الشهر) ، لا أعتقد أنه تم التخطيط لسيناريو SSRS خلال الأشهر الستة المقبلة ولكني لست جزءًا من الفريق.

سأقوم إما بإنشاء تلك التقارير من جانب العميل باستخدام بعض مكتبات جافا سكريبت أو إنشاء تلك التقارير مسبقًا.

إذا كنت بحاجة إلى شيء "متكامل" ، يمكنك التحقق من حزمة المجتمع هذه:

https://github.com/ilich/MvcReportViewer

من خلال مظهر المشكلة https://github.com/ilich/MvcReportViewer/issues/121 ، فهم مهتمون بدمجها ولكن دون نجاح حتى الآن.

لا أفهم سبب التزام كل من مبادرات dotnet و ASP.net الأساسية بالصمت بشأن هذه المشكلة في جميع الإعلانات السابقة. إنه يشبه
[لا يمثل إعداد التقارير مصدر قلق كبير للمطورين ويمكنهم التعامل معها باستخدام فئات html و print css]
نقوم حاليًا بترحيل برنامج ERP صغير به الكثير من ملفات ssrs rdlc ولا يعمل نهج css في إعداد التقارير عبر المتصفحات.
من ناحية أخرى ، أصدرت Microsoft الأسبوع الماضي SSR 2016 مع عارض html5 خالص الذي ألغى الحاجة إلى تثبيت Activex [والذي كان الجانب السلبي الوحيد لاستخدام SSR على متصفح غير ie]
عارض ssrs 2016 يتناسب تمامًا مع نظام asp.net البيئي الأساسي
ولكن لم يتم الإعلان عن بيان رسمي بخصوص الدعم الأساسي لـ asp.net.

هل تم حظره بالكامل بواسطة System.Drawing ؟؟ لأنه حتى itextsharp لم يصدر مكتبة حتى الآن.
إذا كان System.Drawing ، فيمكن إكمال تنفيذ windows على الأقل قبل [linux و OSX] من أجل زيادة اعتماد مطور Windows الحالي بدلاً من انتظار التنفيذ الكامل عبر النظام الأساسي لـ System.Drawing

آمل أن يجعل هذا المنشور الفريق يعيد النظر في بعض الأولويات لتمكين SSR داخل asp.net الأساسية

مع احترام MvcReportViewer المذكور في المنشور السابق (وهو عبارة عن غلاف حول عارض نماذج الويب) وقد ساعد الكثير من مطوري mvc في الماضي على التغلب على نقص عارض تقارير mvc في mvc1 إلى mvc5 [شكرًا جزيلاً ilich] ، أتمنى أن أرى حل كامل لأن SSR لم يكن أولوية من الدرجة الأولى وقد احتفظ الناس به تمامًا في mvc قبل النواة.

إرضاء المطورين ،
قم بإحالة هذه المشكلة إلى زملائك للتعليق عليها.
قد يعطي ذلك أولوية لها ويحفز الفريق على فعل شيء ما.

@ ddddddddeee22211 إنها V1.

أنت لا تشحن بدعم SSRS في البداية. من المحتمل أن يأتي الدعم مع SSRS من فريق SSRS وليس فريق .NET. نظرًا لأننا لم نخرج من RC حتى الآن ، لا أرى هذا كميزة مهمة في V1.

إذا كنت بحاجة إلى إعداد التقارير ، فهل يمكنني أن أوصي بتشغيل إصدار نماذج الويب فقط؟ بلى. انها قديمة. لكنها تعمل على الأقل وهي مدعومة.

إذا كنت بحاجة إلى تقارير X-Plat ، فسأوصي بشيء مثل

من وجهة نظرك ، قد لا يكون الأمر حرجًا
لكن بعض المطورين الآخرين يعتبرون ذلك مهمًا جدًا لمشاريعهم لأنه بمجرد تطويرهم لتطبيق ما وبدء العمل به ، يتم تعليق مهام التطوير وتصبح مهام إعداد التقارير مهام روتينية يومية. كما تتعامل بعض المشاريع مع إنشاء التقارير لفريق BI (ذكاء الأعمال) الذي يعرف كيفية استخدام ssrs ولكن ليس لديه فكرة عن asp.net core.

كان الهدف من رسالتي هو فهم موقع SSR داخل النظام البيئي الأساسي asp.net. أو إذا تم تجاهله كما في mvc1 إلى mvc5. فريق ssrs ضمن Microsoft وقد يناقش الفريق الأساسي asp.net المشكلة معهم.
ما دفعني للجنون هو عندما رأيت مذكرة إصدار SSR 2016 الأسبوع الماضي دون ذكر أي شيء حول asp.net core. بينما من ناحية أخرى ترى دعمًا مستمرًا لـ azure داخل asp.net. صدقني إذا لم نرفع طلبًا على SSR ، فسيتم تجاهله كما في mvc 5 السابق.

نصيحتك حول استخدام نماذج الويب هي مثال على إبطاء تبني المبادرة الأساسية ، على الأقل إذا كان لدي بيان حول ما إذا كان سيتم دعمها أم لا ، فسأكون قادرًا على اتخاذ قرارات إستراتيجية بشأنها.

شكرا على نصيحة الدردشة. سوف أتحقق من ذلك وآمل أن تكون قد فهمت وجهة نظري.

@ ddddddddeee22211 آه ... إذن لا أستطيع الإجابة.

في الوقت الحالي ، الطريقة الوحيدة لجعل مكونات SSRS تعمل على ASP.NET هي في WebForms.

إذا كنت تريد موقعهم الاستراتيجي أو إذا كانوا سيدعمونه ، فسنحتاج إلى انتظار رد موظف MS.

ربما يمكننا / cccoolcsh ؟ قد لا يجيب هنا لكن منشور مدونة يوضح الموقف سيكون لطيفًا.

في فريق SSRS ، ندرك القيود المفروضة على ASP.NET WebForms ونعمل بنشاط على التحقيق والعمل في خيارات جديدة للتحكم في عارض التقارير
شكر

تضمين التغريدة

شكرا لرجل الرد!

لقد كنا نريد بديلاً منذ MVC. :اللسان الى الخارج وعين تغمز:

أن أدلى به للتو بلدي اليوم. [~ نهاية سعيدة ~]
شكرا jtarquino ، @ MaximRouiller على كل جهد.

تضمين التغريدة
هذا يبدو رائعًا :-)

هل يمكنك قول أي شيء عن موعد expext لإصدار الإصدار الأول من "الخيار الجديد" للتحكم في عارض التقارير؟
(هل هناك أي خارطة طريق / خطة لهذا؟)

ش.
بو

للأسف ليس لدي جدول زمني لمشاركته في الوقت الحالي

هل حاولت استخدام مكتبة عن طريق تثبيت حزمة على وحدة تحكم مدير الحزمة واكتب الأمر التالي في نافذة الأوامر.

PM> Install-Package ReportViewerForMvc
على الرغم من أنني حاولت استخدام نماذج الويب وأنها تبدو جيدة جدًا.

untitled

تضمين التغريدة
مرة أخرى ، أطلق الخطأ " لا يدعم ReportViewerForMvc التبعية framework .NetCoreapp "
ملاحظات:
العمل على مشروع ASP.NET Core

jtarquino ping على هذا. يبدو أن هناك المزيد من الاهتمام: https://github.com/aspnet/Mvc/issues/5332

jtarquino BTW إذا كنت تريد بدء بعض المناقشات مع فريقي ، يرجى مراسلتي عبر البريد الإلكتروني ويمكننا الدردشة.

أوه ، أنا أحب! الكرة تتدحرج! 😀

مرحبًا بالجميع ، لقد انتهيت للتو من كتابة منفذ مخصص للتحكم في عارض التقارير باستخدام ReportExecutionService.asmx المدمج في SSRS وكنت أستهدف ASP.NET MVC. كان لدي شخص ما يقترح نقله إلى .NetCore & MVC لذلك أكملت ذلك. جربها وأخبرني برأيك يا رفاق: https://github.com/alanjuden/MvcReportViewer

آلان

يبدو أنه قد مضى حوالي ثلاثة أشهر منذ أن تمت مناقشة ReportViewer في ASP Netcore MVC هنا. أنا أعمل مع الإصدار الذي قدمه Alan Juden في مشروع أقوم بالانتقال من WinForms إلى netcore. هل هناك أي مؤشرات على أن Microsoft تتقدم لتقديم دعم SSRS ReportViewer من الدرجة الأولى أم أنها وضعت SSRS في الخزانة نفسها التي وضعوا فيها Visual FoxPro قبل بضع سنوات؟

أي تقدم MS؟ أفضل خيار في الوقت الحالي هو استخدام أداة جهة خارجية مثل Telerik Reports لعرض المتصفح وخلفية SSRS لاشتراكات التقارير. ربما كما كتب ddddddddeee22211 ، فإن SSRS 2016 لديه بالفعل القدرة عبر محرك تقديم HTML5 ولكن لا توجد وثائق؟

يا @ ايلون.

أي أخبار منذ سبتمبر؟ نظرًا لأنك أطلقت الآن الإصدار 1.0 (تهانينا!) ، يجب أن ينخفض ​​الضغط قليلاً.

أي شيء يمكنك مشاركته؟

/ ccjtarquino

لا يمكنني مشاركة أي شيء حتى الآن ، فبمجرد أن أحصل على أخبار لـ .NET core ، ستكون أول من يعرف.
كما ذكرت ، أصدرنا للتو أحدث مجموعة أجزاء لعنصر تحكم ASP.NET Webforms و Winforms

أرغب في إضافة موجهاتي إلى الفريق أيضًا ... هذه مشكلة رئيسية. إنني أقدر حل AlanJuden ، لكننا بحاجة إلى حل "رسمي" ... بالنظر إلى أن النواة الأساسية 1 قد توقفت منذ شهور ، سيكون من المفيد الحصول على بعض الكلمات عن حالة هذا. إذا كان بإمكانك الحصول على معلومات حول الجدول الزمني لحل سيكون شيئًا ما. هذه المشكلة كبيرة بما يكفي بحيث تمنعنا من استخدام mvc core. ملاحظة واحدة. نحتاج حقًا إلى حل يلبي حاجة المستخدمين إلى تسجيل الدخول إلى خادم ssrs. هذا هو السبب في أن مشروعي يجب أن يستخدم عارض التقارير الحالي (باستخدام ReportViewer ، لدينا مشروع mvc يوفر تسجيل دخول قياسي إلى خادم ssrs لجميع المستخدمين)

خادم SQL 2017 هو مجتمع Preview2 الآن
و
اقترب إصدار .net القياسي 2.0 مع الإعلان الأخير
ولا يوجد حتى الآن أي كلمة عن عارض خدمة التقارير الأساسية asp.net الأصلي
يرجى دعوة المطورين الآخرين لهذه المشكلة لتقديم ملاحظات وتوعية الفريق بالحاجة إلى مثل هذا الجهد لإطار عمل تحفة يحلم به كل مطور.

jtarquino : هل يوجد منتدى أو صوت مستخدم لـ SSRS؟
كيف يمكن للمستخدمين الاتصال بفريق SSRS؟

شكرًا ، أود حقًا الحصول على بعض المساعدة في جعل تطبيقي الجديد يعمل مع SSRS.
هل هناك أي طريقة للحصول على الشفرة المستخدمة بواسطة عنصر تحكم نماذج الويب لصفحة aspx لتمزيقها؟
أرغب في معرفة ما إذا كان بإمكاني إنشاء عرض زاوي 2 "يعمل مثل" و "يشبه" عناصر تحكم نماذج الويب.

مرحبا،

نحن نتطلع إلى ترحيل بعض مواقعنا الإلكترونية وما إلى ذلك إلى asp.net الأساسية ولكن بعضها يتضمن عنصر تحكم عارض تقرير SSRS. هل هناك أي تقدم في عنصر تحكم عارض التقارير لـ .net core؟

شكر
تيم

إذا كنت تستهدف Full .NET 4.x وليس .NET Core ، فالرجاء مراعاة هذا # 2022 قبل الانتقال إلى ASP.NET Core.
لن يدعم ASP.NET Core 2 كامل .NET 4.x.

تضمين التغريدة بالأحرى نقطة خلافية في هذه المرحلة ترى أنه لا يوجد مراسل في جوهر asp.net لكسر. مع التغييرات القادمة في Q3 في asp.net core 2 وكذلك. net standard 2 مع حشوات التوافق التي تسمح باستهداف إطار عمل .net ، أعتقد أنه من غير المحتمل أن تكتب Microsoft ReportViewer لـ asp.net الأساسي الحالي 1.1.

لقد حاولت حاليًا الوصول إلى امتدادات المصادقة لـ SSRS ووجدت أنها فوضى حقيقية لمحاولة التغيير ، يمكنك وضع مصادقة / تسجيل دخول جديد ولكن بعد ذلك عندما تحاول تمكين CORS حتى يتمكن تطبيق الويب من الاتصال بـ SSRS لتشغيل تقرير ، لا يمكن للمستعرض الحصول على طلب OPTIONS للاختبار المبدئي للعمل وهذا ينهي الفكرة بأكملها.

لذا ، أقوم الآن بإنشاء تطبيق ويب لنماذج الويب وأضيف إليه دعم OpenId Connect حتى أتمكن من تشغيل SSO بين تطبيقي الزاوي الجديد اللامع وتقاريري

ثم سأرى ما إذا كان بإمكاني جمعهم مع قرصنة إطارات iframes أو بعض الوسائل الأخرى.

أتمنى أن تقوم Microsoft بتحديث SSR لتلعب بشكل أفضل مع تقنية الويب الجديدة.

خط فكري آخر: تقارير SSRS KPI و Mobile: هل هناك أي طريقة لاستخدامها في تطبيق الويب ؟؟

alanjuden هل هناك فرصة لتكوين الحزمة الخاصة بك لتمكين عرض تقارير rdlc؟ يعد تثبيت Reporting Server وإدارته لكل عميل بمثابة ألم حقيقي.

IonRobu ، قد أكون مجنونا ... لكنني لست بهذا الجنون! : ص

السبب الحقيقي لعدم قيامي بذلك هو أنني قمت فقط بعمل عارض الواجهة الأمامية لمشاهد التقرير. أنا أعتمد كليًا على SSRS لتقديم التقرير وإعادتي إلى بيانات التقرير عبر SSRS API. لذلك يتطلب وجود خلفية خادم التقارير. آسف ولكن هذا سيكون عملاً أكثر مما أتطلع إلى القيام به في هذا المشروع. لقد قمت بإنشاء MvcReportViewer الخاص بي كحل سهل للتغلب على متاعب إدخال إصدار ASP.NET WebForms لعنصر التحكم.

خادم التقارير أو RDLC والذي يسمى "تقارير العميل"
خادم التقارير هو المزيد من العمل لإعداد وإدارة نعم هذا صحيح.
لكن لها عدد من الفوائد:

يتم تقديم التقارير على خادم خلفي ، والذي يأخذ حمل العمل من خوادم الويب الأمامية.
يمكن صرف نتائج التقرير ويمكن أن يزيل عبء العمل عن خادم SQL للإنتاج.
يمكن تشغيل التقارير المعقدة وفقًا لجدول زمني والقيام بالعمل في وقت يكون فيه عدد قليل من المستخدمين على النظام و
يمكن بعد ذلك تقديم الطلبات من تلك اللقطة المجمعة مسبقًا.
أيضًا باستخدام SSRS ، تظل سلاسل اتصال خادم SQL على خادم التقارير ولا تحتاج إلى إدارتها في ملف تكوين خادم الويب
كما يصبح خادم SSRS نقطة مركزية يمكن لمؤلفي التقرير النشر إليها ويمكن لجميع المستخدمين الحصول على التقارير من الخادم.
يمكن لـ SSRS إعداد البريد الإلكتروني التلقائي للتقارير للمستخدمين ، ويمكنك إرسال ارتباط بالبريد الإلكتروني إلى خادم التقارير لبعض المستخدمين وملف pdf أو word أو excel للآخرين.

التوسع أيضًا ، إذا كنت بحاجة إلى خدمة المزيد من المستخدمين ، فقد تحتاج إلى إضافة المزيد من خوادم الويب قبل أن تحتاج إلى المزيد من خوادم التقارير ، فلن تحتاج بعد ذلك إلى نسخ أعداد كبيرة من ملفات rdlc إلى جميع خوادم الويب.

لذلك ، إذا كان لديك عدد قليل من التقارير فقط ولا تحتاج إلى أي من الفوائد التي يمكنك الاستفادة منها مع rdlc.
ولكن بالنسبة لنظام أكبر سيحتاج إلى تقديم الكثير من التقارير لكثير من المستخدمين ، فإن خادم SSRS لديه بعض الفوائد الجيدة حقًا.
كما أن SSRS api قوي جدًا للعمل معه ، يمكنك الاتصال بواجهة برمجة التطبيقات لإرجاع تقرير pdf على سبيل المثال دون الحاجة إلى وجود أي نماذج ويب من جانب العميل أو عناصر تحكم عارض mvc.
يمكن لواجهة برمجة التطبيقات أيضًا إدارة التقارير وتحميلها على الخادم وتعيين الأذونات وسرد التقارير.
في العمل ، أنا أستخدم واجهة برمجة التطبيقات للسماح لتطبيق العميل لدينا بسرد التقارير التي يمكن للمستخدم تشغيلها ، للتحقق من المعلمات التي يحتاجها التقرير ثم تشغيل التقرير للمستخدم.

لذا ألق نظرة فاحصة على الفوائد ليس فقط على النفقات العامة للمشرف.

تضمين التغريدة
تتفوق تقارير العملاء في سياق مختلف عن السياق الذي وصفته
لا يستخدم العديد من العملاء خادم التقارير وليس لديهم موظفين مؤهلين لإدارة مشكلاتهم والحفاظ عليها
أيضًا عند شحن منتج بتقارير مخصصة (60+) لكل عميل ، فإنك تواجه عبئًا إضافيًا لنشر التطبيق + نشر التقارير
العديد من المستخدمين ليسوا تقنيين يمكنهم فهم التقارير التي تم إنشاؤها بواسطة الخادم وعرضها وفقًا للاستجابة دون معاينتها أولاً (يمكن التحقق من الفاتورة على سبيل المثال عبر العارض بسهولة بدلاً من تنزيل فواتير متعددة مصححة في علامات تبويب مختلفة)

كما ترى ، من السهل على المستخدم التكيف مع عارض التقرير البسيط أكثر من السيناريوهات المعقدة
بذلت أيضًا جهودًا لا حصر لها لتطوير تقارير العملاء وأصبحت الآن عديمة الفائدة في استخدامها الحقيقي

آمل أن يتفهم فريق Microsoft معاناتنا

لست متأكدًا تمامًا من أنني تلقيت كل ما قلته ولكن نعم تقارير العملاء مفيدة ، كنت فقط أحدد أسباب الخادم ، ولماذا قد يكون الأمر يستحق النظر فيه. قد تختلف الأميال الخاصة بك وكل ذلك.

يتم إصدار معايير net 2 مع المزيد من سطح API لرسم النظام
هل يمكن أن تكون هذه فرصة للحصول على كلمة من فريق srss حول عارض ssrs لـ asp.net core؟

تعتمد شركتي بشكل كبير على تقارير RDLC لتصدير المستندات بتنسيق PDF. عدم القدرة على القيام بذلك في .net core هو في الأساس مانع لنا باستخدام .net core والتشغيل على منصات أخرى مثل docker.

آمل من كل مبرمج أن يشجع زملائه على التعليق على هذه المسألة هنا

لأولئك الذين ما زالوا يبحثون عن حل:
إذا تم تثبيت Java ، فيمكنك بدلاً من ذلك تضمين Eclipse BIRT أو JasperReports.
من بين الاثنين ، فإن JasperReports هو بالتأكيد أفضل بديل لـ SSRS (أكثر تعقيدًا قليلاً ، ولكنه أيضًا أكثر قوة / مثالي بكسل).
يحتوي على خادم تقارير مستقل وقابل للتضمين ، قادر على الوصول إلى أي مصدر بيانات JDBC ، وأيضًا BigData مثل Cassandra أو Apache Spark (SparkSQL).

يوفر التقارير والتحليلات التي يمكن تضمينها في تطبيق الويب أو الهاتف المحمول بالإضافة إلى العمل كمركز معلومات مركزي للمؤسسة من خلال تقديم معلومات مهمة للمهمة على أساس الوقت الفعلي أو المجدول إلى المتصفح أو الجهاز المحمول أو صندوق البريد الإلكتروني بتنسيقات ملفات متنوعة.

يمكنك القيام بنشر مستقل لوقت تشغيل Java عن طريق توفير BIRT / Jasper عبر Launch4j.

jtarquino أي أخبار جيدة

لا أصدق أن هذه لا تزال مشكلة بعد حوالي 15 شهرًا من طرحها. محبط جدا.

نحتاج حقًا إلى هذا للعمل ، حتى لو كانت نقطة بسيطة في SSRS و ReportName و Params ، مفتوحة في DIV أو شيء من هذا القبيل. لقد استثمرنا الكثير من الوقت في إنشاء تقارير SSRS على SQL مباشرة وأحتاج إلى طريقة لعرضها في تطبيق Core2.0 MVC بسيط.

أي نصائح؟

cgountanis ، هذا يناسبني:
https://github.com/aspnet/Home/issues/1528#issuecomment -259169426

تضمين التغريدة
هل تحتاج إلى ملف pdf للتقرير أو تقارير تفاعلية كاملة مثل عروض بوابة الويب ؟؟

يمكنني أن أقدم لك بعض المبتدئين حول كيفية القيام بها من تطبيق زاوية

هذا ما أفعله. يستخدم بيانات اعتماد العميل التي قد لا تعمل في أغلب الأحيان.
تغيير حجم الصفحة يعمل بشكل أكبر ، مما يجعله أصغر لا.


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

شيء واحد هو استخدام خدمات الويب لخادم التقارير ، حيث يمكنك الحصول على قوائم التقارير والمجلدات ومصادر البيانات وما إلى ذلك ... واستخدام هذه البيانات لإنشاء قوائم البوابة الإلكترونية / التقارير الخاصة بك وإدارة التقارير التي يمكن للمستخدمين رؤيتها فيها تطبيقك.
أنشأنا مجموعة من مستخدمي windows على خادم التقارير واستخدمناهم للحد من التقارير التي يحصلون عليها ،
تعيين دور مستخدمي التطبيق لمستخدم خادم التقارير.

عندما نقوم بتشغيل تقرير ، فإننا نمرر مستخدم خادم التقارير باعتباره المستخدم الذي يقوم بتشغيل التقرير ، نوعًا ما سيء لأن هذا يعني أننا نفقد "المستخدم الحقيقي" ما لم نسجل ذلك في التعليمات البرمجية الخاصة بنا.
ولكن هذا يتعامل مع اعتماد خادم التقارير على حسابات مستخدمي windows. إذا قاموا بتحديثه لاستخدام رمز jwt والحصول على أدوار من الرمز المميز ، فسيكون من الأفضل لنا.

نستخدم iframe لوضع عنصر تحكم نماذج الويب في عرض زاوي للتطبيق ، وليس الأفضل أيضًا ولكنه يعمل.
لا يمكن للمستخدم رؤية ما نقوم به من اختراق لما وراء الكواليس.

@ ctrl-brk أواجه هذه المشكلة مع Core 2.0 ، ربما فاتني شيء. https://github.com/alanjuden/MvcReportViewer/issues/43

steelwil شكرًا لكني بحاجة إلى NetworkCredential مخصص.

figuerres نعرض تقارير من SSRS بجدار ناري ، قام تطبيق WebForm بكل العمل الشاق مع SSRS.ReportViewer ، غير قادر على مستخدمي Windows فقط. الاتفاق JWT سيكون لطيفا بالرغم من ذلك. قد تكون الأمثلة رائعة ، في محاولة لمطابقة وظيفة ReportViewer التي كانت لدينا مع WebForms / NUGET.

شكرا لكم جميعا!

في النهاية سيصدرون NUGET رسميًا لهذا الحق؟

cgountanis "هم" هم فريق SQL Server ، وليس فريق ASP.NET Core. في وهنا تكمن المشكلة. إنه فريق مختلف.

giddev السؤال الحقيقي هنا هو ما إذا كان هذا الفريق الآخر الذي تشير إليه لا يزال موجودًا بالفعل في Microsoft ولديه مطورون نشطون لا يزالون يعملون في الفريق وما إذا كان لديهم ما يكفي من الفخر في عملهم لإنتاج ونشر حل من الدرجة الأولى لإدخال SSRS تقارير في تطبيق ويب ASP.Net Core 1 أو 2. هل لديهم خارطة طريق منشورة؟ هل ASP.Net Core جزء من الخطة أم أنه تم التخلي عن SSRS واستبداله بأشياء POWER BI؟ بدأت أرى علامات على أن SSRS يتجه إلى نفس ثقب الجرذ الذي وقع فيه Microsoft Visual FoxPro.

wqwalter شيء من هذا القبيل .....
لدي انطباع بأن Microsoft لديها طريق للعديد من الفرق التي تتبع كل منها خريطتها الخاصة وليس الكثير من الأشخاص الذين يتأكدون من أن لديهم مجموعة مشتركة من التسليم والتواصل فيما بينهم.
إنها مثل رعي القطط ، تنطلق جميعها في اتجاهات مختلفة ....

إذا كان هذا خطأ - حسنًا يبدو بهذه الطريقة.

أجد صعوبة في تصديق أنهم سيتخلون عن SSRS حيث يتم استخدامه بشكل كبير من قبل المطورين الآن بعد أن أصبحت Crystal Reports غير مرغوب فيها.

تضمين التغريدة
وبقدر ما تعجبني بعض الأشياء من Microsoft ، فقد رأيت تاريخًا لمدة 20 عامًا منها توقف المنتجات بشكل متكرر والقيام بأشياء تتحدى فهمي. أحد الأمثلة على ذلك هو Virtual PC ، التي استحوذت عليها Microsoft ، وباعتها Microsoft لبعض الوقت ، ثم جعلوها مجانية ، ثم قتلوها.
هذه مجرد واحدة من حالات كثيرة من هذا القبيل ....

سمعت حديثًا عن power BI وبعض القيل والقال أنه قد يكون SSRS الجديد في الوقت المناسب.
لست متأكدًا مما إذا كان هذا مؤكدًا أم مجرد ثرثرة. سيتبع نموذج دفع الخدمات المستندة إلى Azure.

أحب أن أرى SSRS يدعم المصادقة المستندة إلى الويب - OpenID Connect بشكل مفضل - خارج الصندوق. خطوة أخرى - سيكون الأمر رائعًا إذا كانت SSRS عبارة عن جزء أساسي من ASP.NET Core. جدولة التقارير ومسؤول المستخدم - ربما يقدم نموذجًا للمشروع ، ولكن سأكون بخير لتطوير هذا الجزء المعطى من الوثائق على SSRS API.

تضمين التغريدة
متفق عليه!
سيكون OIDC مناسبًا تمامًا لما أقوم به.
الأدوار التي يتعين القيام بها حتى نتمكن من توفير تعيين لأدوار خادم التقارير لأدوار التطبيق لدينا.

في الوقت الحالي ، لدي تطبيق يستخدم OIDC بواجهة أمامية Angular 4/5 والتي يتعين عليها تحميل صفحة تقرير نماذج الويب في iFrame ويجب أن تستخدم حسابات مستخدمي windows للتحكم في الأذونات ، لذلك إذا قمت بالاستعلام عن قاعدة بيانات خادم التقارير ، يمكنني ذلك لا أرى المستخدمين الذين يقومون بتشغيل التقارير. إنه برنامج كلوج يمكننا استخدامه ولكنه بعيد عن المثالية.

هذه مشكلة كبيرة بالنسبة لنا أيضًا ولا أصدق حقًا أننا لم نسمع أي شيء من Microsoft حول هذا الأمر. إنه يجعلنا بجدية نفكر في خيارات غير Microsoft في هذه المرحلة. إذا كان لدينا على الأقل جدول زمني يمكننا اتخاذ قرار مستنير.

أوافق على ذلك ، لقد سلكت طريق استخدام ReportServer / ReportExecution2005.asmx مباشرةً لمجرد تشغيل التصدير مباشرةً. يعمل بشكل رائع عند استضافته تحت IIS الحصول على أخطاء غريبة.

لقد كان محبطًا.

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

يشير هذا الخطأ إلى أن رأس التفويض مفقود ، يحتاج طلب http إلى تضمين الرأس. هل nust the one call مشكلة؟

يعمل بشكل جيد حتى استضافت تحت IIS. حتى آلة التطوير الخاصة بي تتحدث إلى نفس خادم التقارير وهي تعمل ولكن بمجرد نشرها واستضافتها مع IIs ، تحصل على هذا الخطأ. فكر في ما يقوله هو أن الخادم يستجيب مع وجود نوع من الخطأ فارغ ولكني أرسل كل شيء إليه.

تذكر أن IIS Express يعمل تحت بيانات اعتماد المستخدم الخاصة بك ، لذا من المحتمل أن تكون الخطوة المزدوجة جيدة. ما يحدث على الأرجح هو أنه ليس لديك kerberos تم إعداده على خادم IIS الخاص بك وحتى إذا كان لديك تفويض تم تشغيل التقرير الخاص بك فلن يعمل لأن التقرير يعمل كمجهول.

إجابة مختصرة: لا يمكنك استخدام التفويض بدون إعداد kerberos ، الأمر الذي يتطلب إعدادات على وحدة تحكم المجال الخاصة بك للحساب الذي يتم تشغيل IIS App Pool به.

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

أعلم أن هذا ليس المكان المناسب ولكني أردت المتابعة. استضافة Core على IIS ، لا يهم ما قمت بتعيين إعدادات IIS عليه. فقط لـ S&G ، قمت بتعيين مسؤول مستخدم appPool وقد نجح. انتقل إلى الشكل ... هذا بدون تمكين إعدادات مصادقة IIS بخلاف Anonymous. أي شخص يشرح هذا؟ هل تحتاج إلى الوصول إلى lib لـ WCF على Core التي تحتاج إلى وصول خاص لها؟ ما يعطي؟ أشعر بالارتباك ... والقلق بشأن الأمن.

cgountanis هل يمكنك فتح مشكلة جديدة بسؤالك؟

jtarquino هل لديك أي تحديثات للجدول الزمني عند إصدار عارض التقارير الأساسي .net؟ أنا مستميت للحصول على جدول زمني على الأقل. هل نتحدث 6 شهور؟ 12 شهر؟ نحن نواجه بشكل أساسي قرار التخلي عن جميع تقارير SSRS الحالية الخاصة بنا والذهاب مع حل آخر حيث لا يوجد لدينا بديل ولا يوجد جدول زمني بشأن أي توافر.

ExcaliburVT موجود في التراكم الخاص بنا ولكن ليس لدي جدول زمني يمكنني تقديمه في الوقت الحالي.

jtarquino المصدر المفتوح رائع وكل شيء ولكن في نفس الوقت تحتاج Microsoft إلى أن تكون مسؤولة أمام العملاء ، ويدفع العملاء مقابل المنتجات ، ويحتاج العملاء إلى تسليم المنتجات. نحن عملاء.

هذا هو المجال الوحيد الذي لا يكون فيه ترحيل Microsoft كبيرًا. إذا لم نتمكن كعملاء من الحصول على الإجابات الصحيحة ، فإلى متى سنستمر في العودة؟

يحدث هذا النوع من الأشياء في العديد من المنتجات ، وليس هذا المنتج فقط. لماذا يجب أن أنصح مديري بترخيص الإصدار التالي من SQL Server و SSRS إذا لم نتمكن من الحصول على التحديثات التي نحتاجها لإدارة الأعمال؟

jtarquino ، يجب أن أتفق مع figuerres لأنني حرفيًا انتهيت للتو من خوض معركة لمدة 3 أشهر للحصول على موافقة لاستخدام SQL عبر Oracle والتوصل لمعرفة إحدى نقاط البيع الرئيسية الخاصة بي غير مدعومة أصلاً. كنت أقوم بمهاجمة Oracle لعدم توفر برنامج تشغيل .Net Core وكان لديهم على الأقل تاريخ إصدار معلن. SSRS هو منتجك الخاص وأنت متأخر جيلين بالكامل بدون حتى موعد مقترح للحل.

يتيح لك استخدام خدمة موصل VS2017 WCF الجديدة (Core 2) تصدير التقارير مع المعلمات إلى PDF و Word و Excel و CSV ... من السهل جدًا إذا كنت تريد أي مساعدة قبل إصدار حزمة NUGET الخاصة بالمشاهد. نعم ، عليك استخدام ReportExecution2005.asmx الذي يأتي مع SSRS ولكن أيضًا كل ما يتم إنشاؤه. قررنا فقط تفريغ جانب العارض في الوقت الحالي وإجراء تنزيلات مباشرة للملفات.

تحرير: المشكلة الوحيدة هي التعامل مع أذونات AppPool التي ذكرتها سابقًا.

بالمناسبة ، أحصل على تقارير بتنسيق pdf من واجهة برمجة تطبيقات ويب ولا أستخدم أي بتات wcf.
فقط مكالمات الصابون / ASMX ومكالمات http.
في القيام بها ، أمرر الاعتمادات بدون أي مشاكل.
الكود الخاص بي هو asp.net 4.6 / web api 2
إذا كنت تريد معرفة ما أفعله ، يمكنني وضع بعض التعليمات البرمجية على جيثب الأسبوع المقبل لتتمكن من التحقق منها.
أنا أتصل بخادم التقارير 2016 ولكن معظم ما أقوم به سيعمل مع إصدارات SSR الأقدم.

أي شيء جديد لـ Core 2 مع SSRS (RDLC Designer)؟

figuerres إذا قمت بوضع أي كود في طلب github ، يرجى مشاركة الرابط.

تضمين التغريدة
ستنشر الأسبوع المقبل ، وليس في المكتب حتى ذلك الحين. لم يسأل أحد عن الكود حتى الآن.

أنا أعمل على تطبيق إنترانت Angular5 / .NetCore2 MVC5 (مكدس RC الحالي من MS) ، ونحن نستخدم SSRS 2012 ، وأحتاج إلى إنشاء اشتراكات تقرير قائمة على الوقت للمستخدمين الذين لم يتم تسجيل دخولهم في حساب windows.

figuerres ربما لديك بعض الأفكار؟

يمكنك استخدام SSRS وخدمة تنفيذ التقارير المضمنة لبث ملفات PDF طوال اليوم.

cgountanis شكرًا لك على هذه الاستجابة السريعة ، لقد ساعدتني على إدراك أنني لم أكن وصفيًا / دقيقًا بدرجة كافية عند وصف ما أحتاج إلى القيام به. لقد حدّثت تعليقي الأصلي ليقول "إنشاء اشتراكات في التقارير المستندة إلى الوقت"

حسنًا ، أعتقد أنني فعلت شيئًا من هذا القبيل عن طريق إدراج صفوف جدول الاشتراك مباشرة في قاعدة بيانات التقارير (خمنت كيف عملت خدمة الاشتراك بناءً على الجدول والصفوف الموجودة).

ExcaliburVT لقد استخدمت SOAP API و SP كبير للتفاعل مع DB حتى الآن ، وأود تجنب تعديل قاعدة البيانات مباشرة. يسعدني معرفة أن هناك خيارًا احتياطيًا.

ماذا تقصد بالوقت؟

هل تحتاج إلى تشغيل تقرير في وقت معين؟
هل تحتاج إلى تشغيل تقرير عندما يقوم المستخدم بعمل شيء ما؟

figuerres على أساس الوقت ، وهذا يعني على جدول متكرر مثل كل أربعاء في الساعة 8 صباحًا.

نعم ، لم أتمكن من العثور على طريقة للقيام بذلك دون إدخال سجل يدويًا على الأقل مرة أخرى إلى SQL 2012. إذا كنت أتذكر جيدًا ، فلن تضطر إلى تعديل المخطط أو أي شيء ، فقط أدخل صفًا في جدول الاشتراكات وكنت قادرًا لإرسال تقرير إلى مجموعة توزيع بهذه الطريقة.

حسنًا ، يمكن لبوابة خادم التقارير تشغيل تقرير عن سجل مخطط له ، ويمكنه حفظه في ملف أو إرسال بريد إلكتروني عند حدوث ذلك الوقت.
لا تحتاج إلى تسجيل دخول أي شخص عند تشغيله.

قمت فقط بإنشاء الاشتراك من البوابة.

يمكنك أيضًا القيام بذلك من الصابون API ولكن لست متأكدًا من المجموعة الدقيقة لمكالمات api التي يجب إجراؤها.

اسمح لي بإعطاء المزيد من السياق قبل الحديث عما رأيته من SOAPI.

أنا أكتب تطبيق ويب يستخدم SSRS soapAPI وبيانات اعتماد مثل "ssrsReportWebAdmin". قيد التطوير الآن ، يمتلك "ssrsReportWebAdmin" جميع أدوار الأمان ، ولكن بناءً على الوثائق ، يبدو أن دور مدير المحتوى هو المطلوب. سيستخدم المستخدم تطبيق الويب لإنشاء اشتراكات لأشخاص آخرين وإرسال هذه الطلبات من خلال SOAPI.

ترجع المكالمة CreateSubscriptionAsync خطأً يفيد بأن المستخدم ليس لديه أذونات.

لذا عند استدعاء واجهة برمجة التطبيقات (api) ، فإنك تقوم بتمرير كائن ائتمان للمستخدم "ssrsReportWebAdmin" الذي يحتوي على جميع الأدوار ولكنك تحصل على خطأ أنه ليس لديه إذن؟ مثير للإعجاب....

من ما قرأته SSRS هو الإعداد بحيث يكون الشخص الوحيد الذي يمكنه إنشاء اشتراكات قياسية (متكررة ، قائمة على الوقت) هو المستخدم نفسه. يمكن إعداد الاشتراكات القائمة على البيانات من خلال دور مدير المحتوى.

راجع ContentManagerTasks - إدارة كافة الاشتراكات
https://technet.microsoft.com/en-us/library/ms159693 (v = sql.105) .aspx

انظر الجملة الأولى أسفل العنوان "تدعم خدمات التقارير نوعين من ..."
https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/subscriptions-and-delivery-reporting-services#bkmk_standard_and_datadriven

تضمين التغريدة
لقد تمكنت من إنشاء اشتراكات قياسية لكل من البريد الإلكتروني ومشاركة الملفات باستخدام حساب AD مع دور إدارة المحتوى SSRS. من خلال ما يمكنني رؤيته ، كانت مشكلة الأذونات التي كنت أواجهها يوم الجمعة أحد الآثار الجانبية لمعلمة MatchData الفارغة / المشوهة.

ما يقرب من 2 سنوات. تم إصدار Core 2.0. فريق SSRS ، استيقظ.

@ codehippie1 لا

كانت مجرد مزحة في كهف المطور. لا توجد مخالفات تعني على الإطلاق. بعيدًا عن النكات ، يحتوي ReportViewerForMVC على 72799 تنزيلًا يمتد الآن من أوائل عام 2014 (https://www.nuget.org/packages/ReportViewerForMvc). لقد تجاهل فريق SSRS ASP.NET MVC لسنوات عديدة ، ويتجاهل الآن ASP.NET Core لمدة عامين. الحديث عن الوقاحة ، 72،799 مرة كثير.

أود أن أوافق على تصدير جيد إلى مكتبة PDF مدعومة رسميًا ، ولا حاجة للمشاهد هذه الأيام بمتطلبات استجابة بالطريقة التي هي عليها.

cgountanis : قم بإنشاء قالب HTML (حجم الورق الصحيح - html فقط ، الصور كـ base64 ، الأنماط المضمنة). املأ العناصر النائبة ، ولا تنس ضبط ترميز HTML على utf8. إرسال نص إلى StandardInput من wkhtmltopdf - إحضار الإخراج من StandardOutput من wkhtmltopdf. وبعد ذلك ، لديك شيء أفضل بكثير من SSRS.

cgountanis لقد فكرت في مثل هذا النهج ، لكن إنشاء تقرير مثالي بالبكسل مع رؤوس / تذييلات الصفحات وفواصل الأسطر في الأماكن المنطقية ليس بالأمر السهل.

لجميع أولئك الذين يشاركوني ألمي لعدم وجود عارض التقارير المحلي MS RDLC على aspnet core ؛ لقد جربت طريقة بديلة بمساعدة pdfJs و ViewerJs من mozilla - pdfJs demo مع عارض تقرير MS

في حال كنت مهتمًا ، إليك خلاصة لمساعدتك في كيفية استخدامه داخل تطبيق aspnet الأساسي (مع وجود جانب العميل في الزاوية 2 أو أعلى ، و rxJs و Typescript). بالنسبة لي ، هذا ببساطة هو أفضل ما في العالمين.

كيفية إضافة pdf.js و viewer.html إلى تطبيق angular 2. (مع إنشاء تقرير خلفي اختياري aspnet core / webapi / mvc باستخدام عارض تقارير MS Local RDLC)

أعتقد أنه يمكنك تغيير الزاوية 2 جيدًا باستخدام رد فعل أو أي مكتبة أخرى من جانب العميل ، لكن المبادئ تظل كما هي.

هل يعمل مع SSRS مباشرة؟

cgountanis ،

تحديث مثير للاهتمام من Microsoft ...

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

يسرنا أن نعلن أننا حصلنا على التكنولوجيا من Forerunner Software https://forerunnersw.com/ لتسريع استثماراتنا في خدمات إعداد التقارير. تتضمن هذه التقنية ، من بين أمور أخرى ، العرض من جانب العميل لتقارير Reporting Services (* .rdl) ، وأدوات واجهة المستخدم سريعة الاستجابة لعرض التقارير ، و JavaScript SDK لدمج التقارير في التطبيقات الأخرى - وهي شهادة على ما يمكن لشركائنا تحقيقه بناءً على منصتنا المفتوحة.

هذه أخبار رائعة بالنسبة لك ، حيث نرى فرصًا لتطبيق هذه التقنية على نقاط متعددة من التعليقات التي سمعناها منك:

  • أنت تبحث عن برنامج سحابي كخدمة (SaaS) أو النظام الأساسي كخدمة (PaaS) يمكنه تشغيل تقارير SSRS. كما قد تكون قد رأيت في ملاحظات إصدار ربيع 2018 https://aka.ms/businessappsreleasenotes ، نحن نعمل بنشاط على تقديم تقارير SSRS إلى خدمة Power BI السحابية ، ونبني على تقديم جانب العميل إلى جعل ذلك ممكنا.
  • تريد عرض تقارير SSRS على هاتفك ، ربما باستخدام تطبيق Power BI. نعتقد أن هذه التقنية ستساعدنا على تقديم واجهة مستخدم أفضل وأكثر استجابة لتوفير قيم معلمات التقرير ، والتنقل داخل التقارير ، وربما حتى عرض محتوى التقرير.
  • أنت تحب عنصر تحكم عارض التقرير ... لكنه عنصر تحكم نماذج ويب ASP.NET. أنت بحاجة إلى شيء يمكنك دمجه في تطبيق ASP.NET Core / MVC أو تطبيق غير ASP.NET. باستخدام هذه التقنية ، نأمل في تقديم عارض تقرير من جانب العميل / مستند إلى JavaScript يمكنك دمجه في أي تطبيق حديث.

هذه تعهدات كبيرة وليس لدينا حتى الآن أطر زمنية لمشاركتها ، ولكن ترقبوا الأشهر القادمة حيث نسعى دائمًا لمشاركة تقدمنا ​​معك وسماع ملاحظاتك في أقرب وقت ممكن وفي كثير من الأحيان.

مع تحياتي

بول


من: Denny Figuerres [[email protected]]
تاريخ الإرسال: الجمعة ، 23 مارس 2018 2:19 صباحًا
إلى: aspnet / الصفحة الرئيسية
نسخة إلى: بول شيلدون ؛ تعليق
الموضوع: Re: [aspnet / Home] Asp.Net Core Reporting (SSRS) (# 1528)

cgountanis https://github.com/cgountanis المنشور السابق هو RDLC مما يعني أنه لا يوجد خادم تقارير ، يعرض خادم الويب التقرير.

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرةً ، أو قم بعرضه على GitHub https://github.com/aspnet/Home/issues/1528#issuecomment-375408680 ، أو تجاهل الموضوع https://github.com/notifications/unsubscribe-auth/AEHciZa6- jjUl8kgdHtuCdH6lSwhoCyyks5tg-s6gaJpZM4IsW_Z .

يا إلهي ، ليس هذا هراء مسج مرة أخرى.
تطبيقات مثبته مسبقا.
وليس فقط bloatware ، ولكن أيضا بطيئة wwwwwww ...

إذا كنت بحاجة إلى تعريف bloatware ، فسيكون هذا تعريفًا جيدًا.
من أجل الكمال ، يفتقر بشكل أساسي إلى jQuery UI ، لكنني متأكد تمامًا من أن الأشخاص الذين يقومون بأشياء من هذا القبيل سيظلون يجدون الوقت لإضافته لمنتقي البيانات.

أوه انتظر ، لقد رأيت للتو

jquery-ui-1.10.3.forerunner.js

سيئ ، لا يهم.
إنه بالتأكيد مثال ممتاز.
نحن بالطبع لا نضيف jQuery-UI فحسب ، بل نطرح أيضًا نسختنا المعدلة.

يا إلهي ، هذا يبدو مثل هراء. التقارير على الهاتف - فقط الشيء الذي نحتاجه - مباشرة بعد CrApple iPads وشاشات اللمس على سطح المكتب ...
وما زلت أوافق على عمل SSRS مع خادم وكيل ، أو لأن أكون قادرًا على مشاركة ملفات تعريف الارتباط للمصادقة (استضافة قائمة على اسم افتراضي متعدد المستأجرين - تضمين نطاق واحد متعدد الدلائل الظاهرية iframe دون تجاوز ملف تعريف ارتباط المصادقة من دليل افتراضي آخر). أو إذا كان (في SSRS 2016+) سيعرض حدود الجدول بشكل متساوٍ على IE و Chrome ، وربما Firefox.
أو لمجرد أن تكون قادرًا على تعيين الثقافة يدويًا عبر سلسلة استعلام ، قم بترجمة عناوين المعلمات وقم فقط بعمل منتقي البيانات هذا بنفسي ، لأن MS لن تفهمها بشكل صحيح على أي حال ...

هذا هو تعريف 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>

ماذا عن:

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

أو حتى أفضل

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

نقاط المكافأة إذا تم إلحاق طابع زمني unix لكل نص برمجي وورقة أنماط ، لذلك تصبح التغييرات / الإصلاحات نافذة المفعول بالفعل. نقاط المكافأة الممتدة إذا مرت قيمة التاريخ والوقت كطابع زمني unix بدلاً من سلسلة خاصة بالثقافة ، ولا تفشل في التاريخ> 2030 أو 9999. أو على أحرف UTF8. الآن فيما يتعلق بدعم اللغة من اليمين إلى اليسار - لا نريد أن نوسع الحد الأقصى لمايكروسوفت. لقد فشلوا قبل ذلك بوقت طويل. كانوا سيفوقون توقعاتي بالفعل إذا كان يعمل مع أكثر من لغة أوروبية واحدة في وقت واحد (مثل الإنجليزية والألمانية والفرنسية والإيطالية).

عزيزي Microsoft ، ربما أرغب أيضًا في اختبار ما إذا كان التقرير يحتوي على جميع الحقول مترجمة ، ولهذا ، أود فقط تسجيل الدخول كمستخدم مختلف بلغة مختلفة - دون الحاجة إلى تغيير إعدادات لغة المتصفح في كل مرة (أو إخبار العميل بكيفية القيام بذلك - هذا هو إنجازك النهائي حتى الآن - تجربة لا تُنسى [سلبية للغاية] يمكنني إضافتها - خاصة بعد التبديل إلى Windows 8).
إذا كنت بحاجة إلى شيء يمكنك الارتباط به - ربما يوجد أحيانًا أيضًا مستخدم إنجليزي يعمل على جهاز كمبيوتر تم إعداده للمستخدمين غير الإنجليز. لذلك سيكون من الرائع أن أتمكن كمطور من ضبط لغة العرض من تطبيقي ، وليس فقط تحديدها من خلال إعدادات لغة وكيل المستخدم. ربما يمكنك أن تأخذ هذا في الاعتبار على الأقل هذه المرة.

ولكن إذا نظرت إلى الحماقة أعلاه ، يمكنني القول أنك لن تفعل ذلك.

بالمناسبة ، طريقة ضبط الثقافة في التجسد الحالي لـ SSRS ، عليك القيام بما يلي:

استدعاء تقرير مع & in_language = IETF-language-tag

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


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

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

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

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

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

    base.InitializeCulture();
}
</script>

ثم تحتاج اللغة إلى الكتابة فوقها في طلب http ، (وحدة HTTP مخصصة في SSRS)
(وسياسة P3P هي لذلك يعمل منشور تسجيل الدخول للنموذج عندما يكون على إطار iframe في نطاق مختلف).

هل يمكنك أن ترى أنه من فضلك لا تكسر هذا دون تقديم معلمة لغة (DISPLAY)؟
تؤثر المعلمة rs:ParameterLanguage على المعلمات في عنوان URL فقط ، وليس في عرض التقرير. ولا يجب أن يكون موجودًا في المقام الأول ، على سبيل المثال إذا كنت قد تجاوزت التاريخ والوقت كطابع زمني يونكس (UTC). وبالطبع ، يجب عليك دائمًا استخدام رأس sameorigin أو رأس allow-from (يوجد إطار iframe على مجال مختلف عن ReportServer). بالمناسبة ، إعداد لغة الطلب في وحدة HTTP هو لتعيين منتقي البيانات مع SSRS 2016 إلى اللغة المطلوبة - وإلا فإن JavaScript يفشل إذا كان يحتوي على منتقي بيانات باللغة الإنجليزية. عظيم ، أليس كذلك؟

ماذا عن: & rs: language = علامة لغة IETF / IANA؟


namespace libRequestLanguageChanger
{


    public class RequestLanguageChanger : System.Web.IHttpModule
    {


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


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


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

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


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

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

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

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

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

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

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


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

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

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

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

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


        } // End Sub context_BeginRequest 



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

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


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


    }


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

    } // End Using context_EndRequest


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


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


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

        return false;
    } // End Function Contains 


} // End Class RequestLanguageChanger 


} // End Namespcae libRequestLanguageChanger 

يرجى Microsoft عدم استخدام رمز العداء الأمامي كما هو!
تنتقل تطبيقات الويب الحديثة من جانب العميل من استعلام j إلى وحدات es وما شابه.
لا نحتاج أو نريد سحب مجموعة من كود الاستعلام j.
أفضل إعطاء العميل ملف pdf أو عنصر تحكم asp.net الحالي بدلاً من كومة استعلام j هذه.

قم بإنشاء حزمة npm تعمل بشكل جيد مع Angular 2-6 والعقدة وأطر عمل عميل الويب الأخرى.
استمر أيضًا في العمل مع تقديم SSRS ، فلها العديد من الفوائد. فقط احصل على مجموعة من واجهات برمجة تطبيقات خدمة الويب المحدثة

أي تحديث على هذا؟

حسنًا ، سيكون لدينا بالفعل كل ما نحتاجه بالفعل.
ما نحتاجه هو تطبيق إصدار REST / JSON من
http: //localhost/ReportServer/ReportExecution2005.asmx
(لن يضر إذا كان بإمكاننا / أي شخص تخصيص عنوان url)
كحزمة nuget - حزمة تعمل على Linux / Mac أيضًا.
الشيء الوحيد الذي يجب القيام به هو نقل كود .NET إلى .NET Core / NetStandard ، وإزالة جميع ملفات pinvokes إلى Windows dlls. بعد ذلك ، أضف إمكانية إخراج PAGED html عبر خدمة الويب (التي تفتقر حاليًا - لأنها موجودة في asp.net-render-control) ، بالطبع ، واسمح بتعيين اسم ملف التنزيل.

اختيار المعلمات الذي يمكننا القيام به بأنفسنا - قراءة RDL مع XmlDocument.
(بعض المشاكل مع إيقاف الخيار الصريح ، إيقاف تشغيل الخيار الصارم ، من المحتمل أن يستنتج الخيار باستخدام VB-Code)
نوع يشبه عنصر تحكم ASP.NET الحالي ، فقط بدون كل عناصر ASP.NET-WebForms.

لذلك لا أعتقد أن هناك حتى متطلبًا لسطر واحد من JavaScript - والذي سيكون مختلفًا على أي حال من مشروع إلى آخر ، ومن شركة إلى شركة ، ومن شخص لآخر.
البعض مثل jQuery. البعض مثل الزاوي. البعض مثل Vue. البعض يشبه رد الفعل. البعض مثل NodeJS مع NPM ، والبعض مثل bower ، والبعض الآخر مثل TypeScript ، والبعض الآخر مثل Babel ، والبعض الآخر يتدفق ، والبعض الآخر يستخدم jQuery-UI لمنتقي البيانات.

أنا على سبيل المثال أكره إلى حد كبير كل تلك الأطر (خاصة jquery-ui) مع عمر ذبابة الفاكهة ، وعدم التوافق بين الإصدارات ، والنفخ ، وغير النمطية ، ومنحنى التعلم مهما كان السبب ، مجتمع من الأشخاص الذين لا يعرفون ما هم يفعلون (ملاحظة: أنا هنا لا أريد أن أشير إلى أنني أعرف دائمًا ما أفعله) ، ومدير حزمة معطل مثل npm / bower ، له الخصائص غير السارة المتمثلة في العثور دائمًا على طريقة لخلق أفراح جديدة في كل مرة لو أرادوا استخدامها.

لذلك أنا فقط أستخدم VanillaJS (مع وحدات ECMA وغير متزامنة - تم نسخها باستخدام babel أو الكتابة المطبوعة - ومن يهتم بجهاز التحويل.

الآن بالطبع سيختلف الكثير من الناس - ولك الحق في الاختلاف ، حيث توجد أسباب للاختلاف. في النهاية ، لا يهمني ما تستخدمه - استخدم coffeescript و emacs مع jquery-ui و vue إذا كنت تريد ذلك تمامًا - فقط لا تجبرني على هذا الطريق. لا أحتاج / أريد jquery / angular / vue / رد فعل / bower / npm أو أي من هذا الانتفاخ وعدم الموثوقية.

الآن ، هذا ما قيل ، إذا كنت ترغب في توفير مكتبة JavaScript يمكن لأي شخص وضعها على موقعه لتحديد المعلمات تلقائيًا ، كما هو الحال في ReportServer (على عكس RDLC) ، وعلى عكس عنصر تحكم ReportViewer الحالي ، فأنا جميعًا مع ذلك . فقط إذا قمت بذلك ، اجعله مستقلاً عن "التحكم" في التقرير. واستخدم بنية تشبه العقدة لتكوين وحدات ECMA ، بحيث يمكن للأشخاص الذين يرغبون في استخدام العقدة استخدامها مع العقدة / npm ، وأولئك الذين لا يحتاجون إلى ذلك.

بصفته sidenode ، إذا سمح إصدار REST / JSON بجلب بيانات المرشح من الخدمة مثل json ، تمامًا مثل الملفات التي تم تقديمها ، فلن نحتاج حتى إلى قراءة ملف RDL ، وسيكون لدينا JS معقد جدًا للأمم المتحدة مكتبة. لن يسمح رمز VB المسموح به حاليًا في المعلمات على أي حال بالقيام بذلك من جانب العميل.

أو بمزيد من التفكير ، سيكون من الأفضل إذا سمحت الخدمة بإحضار كل مجموعة بيانات في التقرير كـ JSON. أعتقد أننا سنحتاج إلى أن نكون قادرين على قراءة القيم الافتراضية لكل معلمة أيضًا. ثم يمكننا حتى إجراء اختبار الوحدة لصحة بيانات SQL المستخدمة في التقرير!
(تقارير اختبار الوحدة مستحيلة حاليًا)

ستنهي ورقة أنماط إضافية واحدة للتنسيق الخدعة (من فضلك SASS). وسيؤدي نظام مكون إضافي لعارضين إضافيين / بديلين إلى تقريب ذلك. ¨

ولكن في الأساس ، نحتاج فقط إلى مكتبة عرض تقارير متعددة المنصات.
يمكن فعل أي شيء آخر اليوم من قبل المجتمع.
أعتقد أنه إذا كانت مصادر عناصر التحكم الحالية متاحة ، فيمكن حتى أن يتم تنفيذ كل أو معظم العمل المطلوب بالكامل من قبل المجتمع - ولن يكلف Microsoft عشرة سنتات.

هل يعمل alanjuden MvcReportViewer مع SSRS 2017 و Core 2. هل يمكنني استخدام هذا النهج لـ SSRS 2017 و core 2

لا ، ليس بدون الكثير من الصداع. الحل الأسهل هو تصدير ملفات PDF مباشرة باستخدام reportexecution2005 مباشرة ، imho. تعتبر محاولة الحصول على أي من المشاهدين القدامى بتنسيق سريع الاستجابة خاصة للهواتف والأجهزة اللوحية أمرًا مؤلمًا.

Mahenbisht ، لا بد لي من

أنا أستخدم SQL Server 2017 مع SSRS 2017 و core 2.
إذا لم أتمكن من استخدام alanjuden.MvcReportViewer.NetCore فهل هناك أي نهج آخر

Mahenbisht ، أعلم أنني لم أكن نشطًا جدًا في

Mahenbisht : توجد حزمة NET Core nuget هنا:
https://www.nuget.org/packages/AspNetCore.ReportViewer/
لسوء الحظ ، لا توجد مصادر على الإطلاق ، لذلك لا يمكنك معرفة ما يفعله وكيفية استخدامه.
لذلك قمت بفك تشفيرها هنا (يتم تجميعها).

يبدو أنها الفئات التي تم إنشاؤها من ReportExecution2005 & ReportService2010-WSDL لـ .NET Core.
لذلك لا شيء يمنعك من كتابة العارض الخاص بك ، إذا كان لديك وصول للشبكة إلى مثيل قيد التشغيل من خادم SQL مع SSRS.
إذا كنت أتذكر جيدًا ، فأنت بحاجة إلى تمرير معلومات الجهاز حتى تحصل على إخراج html مقسم إلى صفحات.
يتيح لك ذلك القيام بالمعلمات يدويًا - وهو ما أعمل عليه (نظريًا) حاليًا.

alanjuden : تكمن المشكلة في مثيلاً من SQL-Server مع ReportingServices مثبتة. إذا كان لديك ذلك ، فيمكنك أيضًا وضع إطار iframe على / ReportServer ، وإضافة القليل من المصادقة المخصصة + رأس W3C ومُحدد اللغة DLL إلى خدمات التقارير. فأنت لست بحاجة إلى عملك على الإطلاق.

المشكلة في ذلك
أ) لا يكون لدى N عملاء دائمًا نفس إصدار SSRS المثبت (مع جميع التحديثات التراكمية / حزم الخدمة - في حالتي حاليًا تتراوح من SSRS-2008R1 إلى 2016) ،
و ب) أن تثبيتات SSRS-Express لها حق الوصول فقط إلى قواعد البيانات الموجودة على الجهاز المحلي. والشيء الممتع حقًا هو أنه لا يوجد تحكم في ReportViewer يعمل على أجهزة الكمبيوتر التي لا تعمل بنظام Windows (Linux ، Mac) - لذلك عليك دمج .NET مع Java لـ Birt أو Jasper - الذي يكسر نشر xcopy - ناهيك عن مجموعة النفقات العامة في كل من تنسيقات التقارير 2-3 ، وجافا JVM بالكامل و birt / jasper bloatware بما في ذلك tomcat و / أو حماقة أخرى.
و ج) أن ReportingService تستخدم مصادقة Windows متكاملة. لذلك ، حتى إذا كنت تستخدم Windows ، فأنت بحاجة إلى إضافة مصادقة مخصصة خارج الإنترانت ، مما يعني أنك بحاجة إلى تعديل الوصول إلى ReportingServices ، وقد تؤدي تعديلاتك إلى تعطيل برامج أخرى ، لذلك يجب على أي عميل عاقل تثبيت مثيل جديد من SSRS / SQL-Server (الذي يكلف المال).
أيضًا د) أن معلمات ReportingService غير قابلة للترجمة بدون تعديل ReportViewer.aspx ، راجع ج)
وأيضًا هـ) أن أي إصدار من SSRS <2016 يقدم quirks-html (وعلى الرغم من أن 2016+ أفضل ، إلا أنه بعيد عن الكمال في هذا الصدد ، راجع للشغل)
ومع ذلك ، نظرًا لأن الإصدارات القديمة من عام 2008 لا تزال موجودة في عام 2018 ، فقد يستغرق الأمر من 5 إلى 10 سنوات أخرى حتى يختفي أي شيء أقل من عام 2016. بحلول ذلك الوقت ، سيكون SSRS 2016 قد عفا عليه الزمن بشكل ميؤوس منه على أي حال. إذا كانت Microsoft لا تزال موجودة بحلول ذلك الوقت ، فهذا هو.

عامل الإنقاذ - لحسن الحظ. لكنها لا تزال هراء.

وإضافة القليل من المصادقة المخصصة + رأس W3C ومحول اللغة DLL إلى خدمات التقارير.

ststeiger أي عينة عبر الإنترنت لوضع عارض SSRS في iframe مع تمرير التحقق التلقائي المخصص من الموقع الرئيسي ورؤوس W3C؟

adopilot : إليك طريقة تقريبية:

أضف المصادقة المخصصة إلى SSRS

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

(ستحتاج إلى تعديله قليلاً بحيث يستخدم مستخدمًا واحدًا لكل قاعدة بيانات.
لا تريد أن تبدأ في مزامنة مستخدمي SSRS والأذونات مع مستخدمي النماذج الخاصة بك!
امنح حقوق المستخدم هذه في المجلد لقاعدة البيانات هذه فقط.
)

أضف وحدة http إلى SSRS ، والتي تحدد رأس p3p ، وتكتب على Context.Request.UserLanguages ​​[i] بلغتك التي تختارها (وإلا لن يعمل منتقي البيانات)

قم بتعديل صفحة تسجيل الدخول في ReportServer ، للرد للحصول على المعلمات ونشرها ، وتعيين login_cookie ، ثم إعادة التوجيه إلى التقرير الذي تم نشره.

التعليمات البرمجية في Page_Load في فئة FormsAuthentication_RS2012.LogOn في نماذج التجميعالمصادقة_RS2012

انشر البيانات المشفرة PGP / RSA بطابع زمني unix (بحيث لا يمكن إعادة تشغيله) مشفرًا بالمفتاح العام في النماذج الخاصة بك ، وفك تشفير البيانات اللاحقة في FormsAuthentication_RS2012 على page_load.

(لا يمكن منحك كود FormsAuthentication_RS2012 ، لأنه يحتوي على المفتاح الخاص وكلمة مرور المسؤول المشفرة بشكل ثابت)


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

أضف إلى 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>

أضف وظيفة ترجمة المعلمات إلى reportviewer.aspx:
(
تمت كتابة المعلمة باللغات الألمانية / الفرنسية / الإيطالية / الإنجليزية
)
انقسام على / وافتراضي إلى الألمانية (قد ترغب في استخدام الإنجليزية)
أضف معلمة in_language (in_sprache) إلى عنوان url الخاص بالتقرير ، وقد انتهيت تمامًا ، إذا فهمت الفكرة.


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>

الآن ، لاستخدام هذا في بعض صفحات الويب ، قم بإنشاء إطار ifrme يسمى ifrmSSRS_Login (أو اضبطه حسب رغبتك) وقم بعمل منشور نموذج عند النقر فوق الارتباط:

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

بهذه الطريقة يمكنك ربط المصادقة مع SSRS ، بالإضافة إلى المستخدمين من كل عميل (اسم قاعدة البيانات) يرون فقط تقاريرهم (الأذونات على SSR حسب اسم قاعدة البيانات).

لاحظ أنه يجب تمرير uids بأحرف صغيرة ، لأن SSRS آخر يرفض العمل بشكل صحيح / ينفجر مثل البرنامج السيء الذي هو عليه.

ملحوظة:
هذا الرمز المتراكم على مدى فترة زمنية أطول ، لإصدارات متعددة من SSRS ، وربما لم يعد تجاوز ثقافة تهيئة الصفحة ضروريًا إذا تجاوزت وحدة http لغة وكيل المستخدم (والتي اكتشفتها فقط بعد إدراك تلك الصفحة الرئيسية -initialize-Culture ليست جيدة بما يكفي لمنتقي بيانات SSRS).
أيضًا ، كان استخدام الشرطة المائلة كفاصل للترجمة أمرًا مؤسفًا. حاول استخدام شخصية لا تحتاجها أبدًا ، مثل £ أو ¦.

يعد رأس P3P ضروريًا لذلك لا يرفض IE 11 على أجهزة الكمبيوتر التي لا تعمل بنظام التشغيل Windows-10 ملف تعريف ارتباط المصادقة (نظرًا لأن ssrs يعمل في إطار iframe متعدد المجالات ، فإنه يتم التعامل معه باعتباره ملف تعريف ارتباط جهة خارجية بواسطة IE)

أيضًا ، استخدم SSRS 2016+ ، لأنه بخلاف ذلك ، تحتاج إلى ميزات وضع المراوغات ، مثل عرض الحدود ، والارتفاعات ، والهوامش ، وإخفاء وظيفة الطباعة ، وجميع أنواع الأشياء الأخرى "المثيرة الخاصة بـ IE8" إلخ.

كما يقول اسم التجميع ، تم إجراء ذلك لخادم الإنتاج الخاص بنا (SSRS 2012) وكل ذلك تطور من عمليات اختراق SSRS 2005 القبيحة.

احفظ الروابط في حقل في جدول التنقل ، على سبيل المثال كحقل NA_Link في T_Navigation
"{report} Budget_SNB & in_user = {@ user} & in_sprache = {@ language} & rc: Stylesheet = COR_RS2012_v7"
استخدم العناصر النائبة لـ baseLink والمستخدم واللغة ، وقم بتعيين ورقة الأنماط (إذا كانت لديك خلفية سوداء ، فأنت بحاجة إلى إخبار SSR باستخدام تعديل ورقة الأنماط الخاصة بهم)

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

ولاحظ أن .NET-Framework لديه مشاكل إذا احتاج إلى إعادة توجيه ارتباط بداخله نقطتان.
يمكنك نسخ كود العمل لإعادة توجيه url من المشروع الأحادي.

لاحظ أيضًا أنه لا يمكنك تمرير معرف المستخدم كسلسلة / رقم - يجب تشفيره (خاص / عام) حتى لا يتمكن أي شخص من تخمين معرف المستخدم. ولكن في البداية ، قد تؤدي التجزئة md5 لمعرّف المستخدم الغرض.

تضمين التغريدة
AspNetCore.ReportViewer تم استبدال مع AspNetCore.Reporting
يتضمن هذا LocalReport و ServerReport

@ amh1979 : عمل جيد -
أعتبر من التبعية أنها AspNetCore.ReportingServices.dll تحتاج إلى WindowsBase و pinvoke advapi32.dll / kernel32.dll / ReportingServicesService.exe أن هذا يعمل فقط على Windows مع .NET مع Framwork 4 مثبتة؟

ملاحظة: اللغة الإنجليزية الصحيحة هي "تم استبدال AspNetCore.ReportViewer> بـ <AspNetCore.Reporting" ، وليس "بدلاً من ذلك" ، لكني أحصل على ما تقصده ؛)
أو يمكنك أيضًا أن تقول "تم استبداله بـ" ، والتي قد تكون الكلمة / العبارة التي تبحث عنها ؛)

@ amh1979 : أحسنت القيام ببعض الأعمال لأنه ليس لدي إطار 4.7.1 مثبت.
فهمت ، MainStream هو نتيجة / html و SecondaryStream هو CSS.
لكن حصلت عليه وتشغيله.
من الجيد أيضًا أن يتم ترحيل صفحات HTML.
هل تعلم: هل هناك أي طريقة للتكرار على الرغم من كل النتائج أو الحصول على ملف HTML ضخم واحد دون استدعاء وظيفة التقديم لكل صفحة؟

@ ALL : أثناء تشغيل هذا ضمن .net كامل ، لا يمكنني تشغيل هذا ضمن .NET Core ضمن Windows.
مشاكل مع System.Drawing.Color ToKnownColor و IsSystemColor وعدم وجود KnownColor.
تم إصلاح ذلك ، ولكن الآن يشكو من تعذر تحميل نظام التجميع.الرسم.الرسومات مع التوقيع ...

هل هناك طريقة لتشغيل تجميعات .net كاملة كاملة في مشروع .NET Core على Windows؟

ststeiger سوف أقوم بتحديث هذه الأسئلة

@ amh1979 :

أثناء تواجدك فيه ، إذا بحثت واستبدلت System.Array.Empty<T> بـ ArrayExtension.Empty<T> ، فأنت 90٪ من طريقة جعله يعمل مع .NET 4.0.

    internal static class ArrayExtension
    {

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

    }

@ amh1979 :

يستخدم ما يلي

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

الذي لا يطبقه System.Drawing.Common الخاص بـ .NET Core.
إليك استبدال System.Drawing.KnownColor.cs
(إنه ليس مثاليًا بسبب الغموض ، ولكن في غياب الوصول إلى القيم الداخلية لـ System.Drawing.Color. هذا هو أفضل ما يمكنني فعله - ربما استخدم #ifs لإنشاء إطار عمل شبكي كامل ، قم باستدعاء الخصائص الفعلية إذا كانت كاملة. الإطار الصافي ... )


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 


}

لدي تجميع تحت NetStandard 2.0

كيف:
خذ System.CoreFX.Forms وقم بتحويله إلى NetStandard 2.0. ثم أضف System.Drawing.Common و System.Reflection.Emit.

خذ AspNetCore.ReportingServices وأضف

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

قم بإضافة مرجع إلى System.CoreFX.Forms (NetStandard)

احصل على الملفات التالية من 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")

وأضف فئة غلاف لـ 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;
    }
}

والسماح برمز غير آمن في مشروع netstandard 2.0 الجديد.

أضف الآن AssemblyInfo.cs مع

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

والآن يتم تجميعها على NetStandard 2.0.

مرحبًا @ جميع الأخبار الرائعة:

لدي العمل مع NET Core على Windows!
100٪ NetStandard ، 0٪ NetFramework

عملت Html و Pdf و Excel و Excel2007 + و Word و Word2007 + و tiff جميعها بشكل جيد في تقرير جدولي من 57 صفحة مع varchars و ints و tinyint2 و bits والأعمدة المحسوبة.
تعمل جميع تنسيقات الإخراج ، باستثناء RDL ، وهو أمر مضحك نوعًا ما ، ولكن من يهتم.
سنجد المشكلة في النهاية ، أليس كذلك؟

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 

وهناك المزيد من الأخبار الجيدة:
تم استخدام WindowsBase (المعروف أيضًا باسم WPF) فقط لـ System.IO.Packaging ، والذي يتوفر في .NET Core.
الآن هذا يعني أنه إذا تمكنا من التخلص من pinvokes ، فلا توجد حواجز رئيسية لجعل هذا يعمل على Linux / Mac أيضًا!

الآن شخص ما يبدأ بسرعة في كتابة محرر RDL على شبكة الإنترنت!
ثم يمكن أن يكون لدينا تقارير "ديناميكية" (من إنشاء المستخدم) أيضًا.
PostgreSQL-ReportingServices لنظام التشغيل Linux قادم ؛)
(حسنًا ، هناك سيف مسلط قانوني على شيء من هذا القبيل ، ولكن إذا كان بإمكاننا نشره من الصين ، التي تتمتع بحقوق ملكية فكرية "أكثر استرخاءً" ...) :)

حسنًا ، ربما هذا شرير جدًا.
فكر في Microsoft ReportingServices لـ Oracle / SAP بدلاً من ذلك!
Or ReportingServices لكاساندرا / سبارك: ابتسامة:

@ amh1979 :
ألا يوجد عارض PowerPoint هناك؟
هل قمت ببنائه من أحدث نسخة من ريبورتفيور؟ (SSRS 2017)
أحدث إصدار أعرفه على nuget:
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
(140.1000.523 ، منذ 10 أشهر)
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WinForms
(140.1000.523)
https://www.nuget.org/packages/Microsoft.SqlServer.Types
(14.0.314.76)

إليك تطبيق CoreFX WinForms لـ NetStandard:
https://github.com/ststeiger/System.CoreFX.Forms

ضع في اعتبارك الفجوة ، منذ أن أضفت مشروع NetCore إضافيًا ، وأعدت تسمية System.CoreFX.Forms إلى System.NetStandard.Forms ، فقد تواجه صعوبات في تحميل الموارد المضمنة ، إذا فعلت ذلك.

يمكن العثور على الملفات هنا:

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

@ amh1979 :
آه ، أرى أن هذا ليس موجودًا في Microsoft.ReportViewer.Common.dll.
لكنه موجود في دليل ReportServer:
Microsoft.ReportingServices.PowerPointRendering.dll
و CSV / XML / Atom:
Microsoft.ReportingServices.DataRendering.dll

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

@ ALL : سيداتي ، عارض HTML يعمل على Linux على .NET Core / NetStandard 2.0!
وكذلك WordOpenXML وعارض ExcelOpenXML!
(لم يتم اختباره بالصور / الرسومات - النص والرمز فقط)

يواجه عارض PDF مشاكل في تضمين الخطوط.
(يستخدم عارض Word / Excel-2003 ملفات pinvokes وبالتالي لا يعمل.)
إذا كنت تستخدم إصدار Aspose Cells / Words Eval ، فيمكنك تحويل xlsx إلى xls ، و docx إلى doc.
يمكنك أيضًا إنشاء ملف PDF من ملف Word:
soffice --headless --convert-to pdf filename.docx
(أو مرة أخرى ، مع aspose EVAL)
بالتفكير في الأمر ، يجب أن يكون عارض PPTX سهلًا أيضًا ، لأن كل ما يفعله هو التقاط الصور من ملف TIFF ووضع كل صورة صفحة tiff كـ jpg / png على شريحة pptx.
يبدو أن برنامج عرض الصور هو أصعب شيء يجب القيام به.
أو يمكنك أن تأخذ wkhtmltoX وتحول كل صفحة HTML إلى صورة / pdf.
من المحتمل أن يكون ذلك قليلاً على الجانب البطيء.

رائعة حقا !

HTML for report

@ ALL : يعمل Atom / CSV / XML. هذا هو NULL-Renderer.
على لينكس أيضًا.

يعمل عرض PowerPoint على Windows فقط - pinvokes

حقيقة ممتعة: يبدو أن هناك عارض JSON هناك.
ولكن لسبب ما ، لا تعمل هذه الحماقة إلا في حالة useSharedDataSetTableHandler ، مهما كان ذلك يعني

ParseDeviceInfo(deviceInfo);

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

يعرف أي شخص عن طريق المخاطر كيفية استخدام عارض JSON؟

@ amh1979 حاولت استخدام تقرير الخادم ولكن يبدو أن المعلمات التي أضفتها للتقرير لا تستمر في الخادم في LoadReport. هل هناك أي فرصة لتعيينها بحيث يتم إرسالها إلى الخادم في بنائك التالي؟

مرحبًا ststeiger و @ amh1979 ، عمل رائع على هذا ، هل هناك أي دروس تعليمية حول كيفية استخدام هذه المكتبة هناك؟ أحاول معرفة كيفية / ما إذا كان يدعم حاليًا معلمات القيم المتعددة وما إذا كانت عمليات التنقل مدعومة.
ما زلت أحاول الوصول إلى الموقع المرتبط في وصف حزمة nuget (http://www.amhx.org/) لأرى ، لكنه يستمر في مهلتي.

DavidHayes الترميز :
إليك رمز الاختبار الخاص بي لـ AspNetCore.Reporting.LocalReport ، وهو كل ما يهمني:
ملحوظة:
أنواع العرض Rpl و RGDI و Atom و Xml و Json و Csv و null و pptx
لن تكون متاحة لك، لأنها ليست في التجمع amh1979 ل.
(هم جزء من SSRS ، لكنهم غير موجودين في ReportViewer القابل لإعادة التوزيع)

لاحظ أيضًا أن مصدر البيانات المشترك (* .rds) يجب أن يكون في نفس الدليل مثل * .rdl ، وإلا ستحصل على استثناء مرجعي فارغ في LocalReport.Execute.

لمزيد من الأسئلة:
https://github.com/icsharpcode/ILSpy/releases/tag/v4.0-beta2
(ملاحظة: في الكود المناسب ، تحتاج إلى التخلص من جدول البيانات بعد الانتهاء من استخدامه)

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

namespace NetCoreReporting
{


    public class Program
    {


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

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

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

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



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

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

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

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

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


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

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

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




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

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

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

            System.Console.WriteLine(rr.TotalPages);


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

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

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

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

            BuildWebHost(args).Run();
        }


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


    }


}

@ ALL : أي شخص يريد المساعدة؟
أجب على هذا السؤال:
https://stackoverflow.com/questions/52093440/how-to-call-wine-dll-functions-from-c

هل يمكنني أن أقترح أن نشر أعداد كبيرة من التعليمات البرمجية والتعليقات الطويلة هو حقًا طريقة صعبة الفهم والقراءة لتتبع هذه المشكلة؟

أستطيع أن أرى الكثير من النشاط ، والكثير من التعليمات البرمجية ، لكنني في الحقيقة لست أكثر حكمة فيما يتعلق بالتطورات الأخيرة (التي تبدو ممتازة).

هل يمكنني أن أقترح الحفاظ على الأشياء مرتبة ومرتبة هنا ، واستخدام أدوات أخرى / أدوات مناسبة لمشاركة التعليمات البرمجية؟ هل هناك تحديث بسيط وبسيط للحالة يمكن مشاركته هنا؟

مثل @ kierenj ، أعتقد أن قوائم الرموز

kierenjfiguerres: أود أن يكون على ما يرام مع ذلك، ولكن إذا قمت بنشر كميات أكبر من التعليمات البرمجية مايكروسوفت decompiled دون طلب الإذن أولا، وربما كنت خطر عبور الخط إلى حيث أنها قد تريد أن تفعل شيئا حيال ذلك ...

ثالثا. قيود التوزيع. لا يجوز لك
• توزيع التعليمات البرمجية القابلة للتوزيع ليتم تشغيلها على نظام أساسي بخلاف نظام Windows الأساسي ؛
• الكشف عن الشفرة أو توزيعها في شكل شفرة المصدر ؛ أو
• للآخرين الحق في تعديلها.

تضمين التغريدة
ويمكنك العمل مع الريبو هنا لإنشاء فرع ووضع الكود في هذا الفرع.
ثم يمتلكونها ويعرفون عنها وما إلى ذلك ...

figuerres : لقد قمت بعمل الريبو على gitlab ، حيث يكون المستودع الخاص مجانيًا.

MaximRouiller :
لدي نسخة من ReportViewer (تقارير محلية) تعمل تقريبًا تحت ASP.NET Core.
حوالي 75٪ منه سيعمل حتى مع Linux ، والذي قامت Microsoft بنشر SQL-Server له.
من المرجح أن تعمل الأجزاء التي تعمل في نظام Linux مع نظام MacOS أيضًا.

ومع ذلك ، فإن هذا الإصدار من ReportViewer يعتمد على كود
https://www.nuget.org/packages/AspNetCore
والذي يبدو أنه يعتمد على رمز من
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
الذي يأتي بموجب هذا الترخيص
http://go.microsoft.com/fwlink/؟LinkId=826162

هذا الترخيص لا يسمح ل
• توزيع التعليمات البرمجية القابلة للتوزيع ليتم تشغيلها على نظام أساسي بخلاف نظام Windows الأساسي ؛
• الكشف عن الشفرة أو توزيعها في شكل شفرة المصدر ؛ أو
• للآخرين الحق في تعديلها.
• العمل على التغلب على أي قيود فنية في البرنامج ؛
•> لا يسمح بالهندسة العكسية

أود (علنًا) مشاركة هذا الرمز مع المجتمع هنا على github ، في موقع لم يتم تحديده بعد ، بغرض تحسين الكود والعمل على أي أخطاء متبقية محتملة ، لإحضار ReportViewer إلى .NET Core.
ومع ذلك ، لا أرغب في اتخاذ مثل هذه الخطوة من جانب واحد بالنظر إلى الترخيص الحالي لـ ReportViewerControl.WebForms.

أعتقد أن الكثير قد تغير منذ كتابة هذا الترخيص لأول مرة / آخر تحديث.
على سبيل المثال ، سيكون من غير المنطقي نشر ReportViewer لـ .NET Core عندما تعمل النتيجة فقط على نظام Windows الأساسي - مع الأخذ في الاعتبار أيضًا أن Microsoft قد أصدرت SQL-Server لنظام Linux ، مما يعني أنه في وقت ما ، يجب على SSRS اتبع على أي حال.

وبالنظر إلى أن ASP.NET-Core لا يطبق WebForms ، فإن التغيير من ReportViewer-WebForms إلى ReportViewer-NetCore سيكون بمثابة تغيير جذري على أي حال.

هل يمكنك أن تسأل بشكل متحفظ عن الصلاحيات التي ، بالنظر إلى الظروف ، إذا كانت تعطي الضوء الأخضر لمثل هذا المسعى - والذي سيوفر لهم بالمناسبة الوقت والقوى العاملة أيضًا - ويتوافق بشكل جيد مع طبيعة المصدر المفتوح لـ .NET-Core / NetStandard 2.0.

لقد مضى أكثر من عامين منذ إطلاق NET-Core ، ولا يوجد حتى الآن حل للتقارير على نطاق واسع وبعيد. حان الوقت لتصحيح هذا.
إذا فعلنا ذلك معًا ، فسنكون جميعًا أسرع وأفضل.

http://go.microsoft.com/fwlink/؟LinkId=826162
ما أنا قلق بشأنه.
إذا لم يكن الأمر كذلك ، فسوف أقوم بإلغاء إدراج الحزم من NuGet.

@ ALL : Greate news: تمت إزالة مكالمات COM-InterOP لـ XLS / DOC واستبدالها بـ OpenMcdf.
لذلك يعمل XLS / DOC-Renderer الآن على كل من Linux و Windows.
الآن 85٪ يعملون على لينوكس.

يبدو أننا قد انخفضنا إلى 3 مكالمات WinAPI لـ PDFWriter ، و 13 مكالمات WinAPI لـ ImageRenderer / Graphics.
أعتقد أن ملف PdfWriter نفسه قد يكون سهلًا إلى حد ما.

مرحبًا ststeiger ، لا يمكنني تشغيل AspNetCore. الإبلاغ عن وظيفة Azure مع خطة الاستهلاك لأنها تمنع وظيفة GDI +. هل لديك أي حلول لذلك؟ شكر.

ليس تمامًا بعد - يقوم بإجراء عدة مكالمات إلى GDI + و usp10.dll ، بشكل أساسي للحصول على معلومات الخط.
كما أنه يمر بمؤشرات GDI + ، ولا يوجد بديل بسيط ، لأن mono libgdi + اختار القيام بالأشياء بشكل مختلف (لسبب وجيه).

لقد تمكنت من إعادة كتابة الوظيفة GetFontData في C # من خلال قراءة مصدر C الخاص بـ Wine ، لكنني بحاجة إلى freetype للوصول إلى معلومات خط TrueType (يستخدم النبيذ أيضًا FreeType).
SixLabors.Fonts و LayoutFarm لم يتم العثور عليهما بعد (بهامش كبير).
هنا:
https://gist.github.com/ststeiger/273341aebd29009f2b272b822b69563f

أيضًا ، استبدلت قياسات النص بـ freetype

الآن أنا بحاجة إلى استبدال كل مقبض جهاز GDI بفئة مخصصة.
يجب أن تحتوي هذه الفئة بعد ذلك على معلومات الخط / الرسومات / freetype-face / handle ، وما إلى ذلك ، لذلك لا أحتاج إلى إعادة كتابة العارض.

عندما يتم ذلك ، أحتاج إلى النظر إلى النبيذ مرة أخرى ، من أجل التحولات من ورقة إلى عالم ومن عالم إلى ورقة.
وبعد ذلك يجب أن يتم ذلك.
أعتقد أن التحولات من الورق إلى العالم ومن العالم إلى الورقة قد تكون موجودة بالفعل في System.Drawing.Graphics.
يبدو أن جزءًا من الكود تمت كتابته مرة واحدة باستخدام .NET Framwork 1.0.

أيضًا ، ما زلت بحاجة إلى التعيين بين خط .NET وخط freetype بطريقة ما.

يا رفاقALL و @ ststeiger
بالنسبة ل:

@ ALL : Greate news: تمت إزالة مكالمات COM-InterOP لـ XLS / DOC واستبدالها بـ OpenMcdf.
لذلك يعمل XLS / DOC-Renderer الآن على كل من Linux و Windows.
الآن 85٪ يعملون على لينوكس.

Office Open XML

بصراحة أعتقد أنه سيكون من الأفضل استخدام مواد مستندات XML الأحدث ، ثم لا حاجة إلى أي شكل من أشكال OLE على الإطلاق.
حسنًا ، إذا كان شخص ما لا يزال يستخدم تطبيقات Office القديمة حقًا ، فهذا ليس جيدًا للرجوع إلى المتوافق. لكن Office Open XML كان موجودًا منذ حوالي 2002-2006 ، لذا فإن أي شخص يستخدم Word أو Excel من السنوات العشر الماضية سيكون قادرًا على استخدام تنسيق ملف docx و xlsx على ما يرام.
فقط فكرتي في ذلك ...

فقط حتى لا نسيء فهمنا:
بالطبع يعمل عارض OpenXml Excel أيضًا.

أنا أقول فقط أن XLS / DOC تعمل أيضًا ، إذا كان عليها ذلك.
الآن فيما يتعلق بما إذا كان يجب كشف XLS / DOC أم لا ، أو ما إذا كان يمكن حذفه بأمان هو سؤال آخر. ربما لا تزال هناك بعض البرامج القديمة التي لا يمكنها العمل مع XLSX.

UBS على سبيل المثال لا يزال يستخدم برامج COBOL.
وهناك العديد من الآخرين.
لذلك من الأفضل ترك وظيفة XLS لفترة أطول قليلاً ، فقط في حالة حدوث ذلك.

RaymondHuy :
إذا قام Azure بحظر وظيفة GDI + ، فهل يعمل System.Drawing.Common على الإطلاق؟
أم أن هذا ينطبق فقط على مكالمات DllImport الخاصة بإطار العمل الخارجي؟

حسنًا ، بحثت في Google عن ذلك.
يبدو أن مكتبات الرسم متاحة في Azure Cloud Service (في الأساس مجرد جهاز افتراضي) ، ولكن ليس في تطبيق Azure Web (استضافة مشتركة بشكل أساسي؟).
هذا يمكن أن يكون مشكلة.
لذلك بمجرد أن يتم تشغيل هذا على Linux ، سنحتاج إلى استبدال أي شيء System.Drawing مع SixLabors.ImageSharp لاحقًا لتشغيله على تطبيق Azure Web.

هذا سيكلف الوقت والجهد.
RaymondHuy :
هل يمكنك التحقق مما إذا كان FreeType (غلاف SharpFont) يعمل على Azure؟
https://github.com/Robmaister/SharpFont

ملحوظة:
في x64-Windows ، تحتاج إلى استبدال جملة use لـ FT_Long و FT_UL مع هذا

#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

لأن ملفات freetype dll المصححة لا تعمل على x64-Windows.

إليك كيف فعلت ذلك:
https://gist.github.com/ststeiger/9e2eb98e29a3c987aca739045af1d2ce

(ملاحظة: حدد WINDOWS في خيارات البناء)

مع بعض كود الاختبار:

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 استثناءً إذا لم يتم تطبيق تصحيح WINDOWS.

عندما أحاول مع ملف .rdlc ، أحصل على استثناء
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (من TMemberType ، TCellType). لا يمكن الوصول إلى m_memberTreeHostsRemotable في هذا السياق لأنه "صديق". ". في localreport.Execute ()
ساعدني من فضلك

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

يبدو أن لديك مشكلة مع تعبيرات VB المضمنة.
على أية حال هناك مشاكل متعددة.

في Microsoft.VisualBasic1 \ VBCodeGenerator.cs
يجب تعيين UseShellExecute إلى 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
};

ويجب استبدال FromFileBatch بـ roslyn إذا تم تجميعه من أجل netstandard (لا يمكن لمزود CodeDom التجميع لـ netstandard - استثناءات مضحكة إذا تم استخدام تعبيرات VB ، على سبيل المثال في المعلمات)


        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

هناك RoslynCodeDomProviders في https://github.com/aspnet/RoslynCodeDomProvider ، لكنهم على أي حال يستخدمون Roslyn وراء الكواليس. وتجميع ترميز ثابت نسبيًا باستخدام "C: \ WINDOWS \ Microsoft.NET \ Framework\\ vbc.exe "على أية حال فكرة سيئة.

الآن حصلت على عارض HTML4 و HTML5 و MHTML الكامل يعمل.
ليس فقط المرقم.

مرحبًا ، أنا أستخدم [https://www.nuget.org/packages/AspNetCore.Reporting] وهو يعمل بشكل مثالي في IIS المحلي.
ولكن بمجرد أن أنشره في خادم windows 2012 R2 واجهت مشكلة.

سجلات الأخطاء.

فشل: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]
حدث استثناء غير معالج أثناء تنفيذ الطلب.
AspNetCore.Reporting.LocalProcessingException: حدث خطأ أثناء معالجة التقرير المحلي. ؛ تعريف التقرير "D: \ Apps \ BillingApproval \ ReportFiles \ ReleaseProcess.rdl" غير صالح.
حدث خطأ غير متوقع أثناء تجميع التعبيرات. قيمة إرجاع المترجم الأصلي: -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: حدث خطأ غير متوقع أثناء تجميع التعبيرات. قيمة إرجاع المترجم الأصلي: -1073741819'. at AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat(Stream definitionStream, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat(Byte[] definition, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport(PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String& reportDescription, String& reportLanguage, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat(PublishingContext reportPublishingContext) at AspNetCore.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot) --- End of inner exception stack trace --- at AspNetCore.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot) at AspNetCore.Reporting.LocalService.GetCompiledReport(PreviewItemContext itemContext, Boolean rebuild, ControlSnapshot& snapshot) at AspNetCore.Reporting.LocalService.CompileReport() at AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport() at AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession() --- End of inner exception stack trace --- at AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession() at AspNetCore.Reporting.InternalLocalReport.SetParameters(IEnumerable 1 معلمات)
في AspNetCore.Reporting.Report.SetParameters (معلمة ReportParameter)
في AspNetCore.Reporting.LocalReport.Execute (RenderType renderType، Int32 pageIndex، Dictionary 2 parameters, String findString) at BA.UI.WebV2.Extension.AspNetCoreReportingExtension.ExecuteToMemoryStreamResult(LocalReport localreport, RenderType rendertype, Int32 index, Dictionary 2 parameters، String searchString) في D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Extension \ AspNetCoreReportingExtension.cs: السطر 27
في BA.UI.WebV2.Controllers.ReportsController.ReleaseProcessToPDF (DateTime from، DateTime to) في D: \ Projects \ Approval \ Main \ BA.UI.WebV2 \ Controllers \ ReportsController.cs: سطر 65
في lambda_method (إغلاق ، كائن ، كائن [])
في Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute (IActionResultTypeMapper mapper، ObjectMethodExecutor، Object Controller، Object [] وسيطات)
في Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync ()
في Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync ()
في Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (سياق ActionExecutedContext)
في Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (الحالة والتالية ، النطاق والنطاق ، الكائن والحالة ، القيمة المنطقية & isCompleted)
في Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()
في Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()
في Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (سياق ResourceExecutedContext)
في Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (الحالة والتالي ، النطاق والنطاق ، الكائن والحالة ، القيمة المنطقية & المكتملة)
في Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync ()
في Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
في Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext)
في Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (سياق HttpContext)
في Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (سياق HttpContext)
في Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke (سياق HttpContext)

jfmjason : يحدث هذا عندما يحاول CodeDom Code Compiler (.NET 4.0) تجميع بعض الملفات في مسار مؤقت في ExprHostCompiler. تريد تجميع تجميعات NetStandard / NetCore مع موفر .NET 4.0. هذا لا يعمل. عندما يحاول تجميع هذه الملفات ، يفشل csc.exe بصمت مع قيمة الإرجاع -1073741819.
نظرًا لأنه لا يمكنك ترجمة كود .NET Core باستخدام برنامج التحويل البرمجي .NET 4.0 ، فأنت بحاجة إلى استخدام RoslynCompilers ، التي ليست موجودة في System.CodeDom. يقوم NetStandardFromFileBatch الخاص بي أعلاه بإصلاح هذه المشكلة بالضبط (ويستخدم CodeDom إذا تم تجميعه لـ NetFramework 4).

ومع ذلك ، لاحظ أن وقت تشغيل VB في .NET Core محدود للغاية.
في الأساس ، NET Core لا يدعم VB.NET حقًا ..

إذا نظرت إلى عناصر VB الأساسية ، مثل وظائف سلسلة VB 50 أو نحو ذلك ، مثل Replace و Trim و AscW و ChrW و LCase و Len و Mid في Microsoft.VisualBasic.Strings - يدعم .NET Core 2.0 اثنين منها بالضبط ، AscW و ChrW ...

إذا نظرت إلى المصدر الحالي على جيثب ، فسترى أنه في الوقت الحالي ، إنها موجودة - لكنها كلها بذرة لا تُلقي.
https://github.com/dotnet/corefx/blob/master/src/Microsoft.VisualBasic/ref/Microsoft.VisualBasic.cs

بالإضافة إلى ذلك ، قد تضطر إلى تعديل رمز VB الخاص بك في تقاريرك قليلاً - لدعم كل من .NET Core و NetFramework.

لذا @ ALL : هذه فكرة:
إذا كنت تريد تقريرك مع رمز يعمل على .NET Core بدون تعديلات ، فابدأ في تنفيذ وظائف السلسلة في Microsoft.VisualBasic.cs.
أو قم بإزالة عناصر محددة لوقت تشغيل VB ، وحاول استخدام الفئات ووظائف الأعضاء المتوفرة مع C # ، مثل string.Length بدلاً من Len ، و IndexOf بدلاً من InStr ، و Subtring بدلاً من Mid ، و "BLA" .ToLower () بدلاً من LCase ("BLA") إلخ ..

أيضا ، VB-Code بشكل عام ، وليس فقط في .NET Core ، لديه مشاكل في بناء الجملة nullable؟
لذا استخدم System.Nullable (Of Double) بدلاً من Double؟ ، إذا كنت بحاجة إلى الإعلان عن قيمة إرجاع دالة على سبيل المثال.

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

تحتاج أيضًا إلى تغيير مراجع التجميع في 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 : لم
لأنني عندما أخذت عارض html4 & 5 الكامل من ReportServer ، يبدو أن الصور مفوضة إلى معالج axd أو ashx من ReportingServices. ومع ذلك ، ظهرت في نسخة MHT.

ربما يجب تغييرها إلى عنوان url ("data: image / png؛ base64، SOME_BASE64_IMAGE")؛ بدلاً من ذلك ، بحيث تكون مضمنة في HTML.
وهذا يعني ، إذا كانوا سيذهبون إلى ارتباط غير خارجي.
لم تختبر ما إذا كان ذلك يؤثر على المشاهد أيضًا.

تضمين التغريدة

شكرا لك على الرد. أتساءل لماذا يعمل بشكل مثالي عندما أنشر نسخة إصدار من تطبيق الويب الخاص بي (.net core 2.1) في IIS المحلي.

من المحتمل أنه يعمل محليًا لأن لديك .NET Framework مثبتًا محليًا.
أو لأن خادم الويب المحلي لديك ليس في الوضع المتكامل ، أو يعمل تحت إشراف مستخدم آخر ، أو يضرب مسارًا منطقيًا آخر ، أو إعدادات تجمع التطبيقات ، أو إعدادات الأمان ، أو عمليات إعادة توجيه التجميع ، وما إلى ذلك.
أيضا ، حزم الخدمات ، التحديثات التراكمية وغيرها من "الميزات" المثيرة.

قدم تطبيق اختبار صغير.
بعد إضافة System.Drawing.Common ضمن Win10 ، يعمل بشكل جيد.
يؤدي التشغيل على Ubuntu 16.04 إلى حدوث خطأ.
AspNetCore.Reporting.LocalProcessingException: حدث خطأ أثناء معالجة التقرير المحلي. ؛ تعريف التقرير '/opt/testReportViewer/bin/Debug/netcoreapp2.1/Reports/Report1.rdlc' غير صالح.
حدث خطأ غير متوقع في معالجة التقرير.
تعذر تحميل المكتبة المشتركة "kernel32.dll" أو أحد تبعياتها. للمساعدة في تشخيص مشاكل التحميل ، ضع في اعتبارك تعيين متغير بيئة LD_DEBUG: libkernel32.dll: لا يمكن فتح ملف كائن مشترك: لا يوجد مثل هذا الملف أو الدليل ---> AspNetCore.Reporting.DefinitionInvalidException: تعريف التقرير '/ opt / testReportViewer /bin/Debug/netcoreapp2.1/Reports/Report1.rdlc 'غير صالح.
حدث خطأ غير متوقع في معالجة التقرير.
تعذر تحميل المكتبة المشتركة "kernel32.dll" أو أحد تبعياتها. للمساعدة في تشخيص مشاكل التحميل ، ضع في اعتبارك تعيين متغير بيئة LD_DEBUG: libkernel32.dll: لا يمكن فتح ملف كائن مشترك: لا يوجد مثل هذا الملف أو الدليل ---> AspNetCore.ReportingServices.ReportProcessing.ReportProcessingException: حدث خطأ غير متوقع في معالجة التقارير.
تعذر تحميل المكتبة المشتركة "kernel32.dll" أو أحد تبعياتها. للمساعدة في تشخيص مشاكل التحميل ، ضع في اعتبارك تعيين متغير بيئة LD_DEBUG: libkernel32.dll: لا يمكن فتح ملف كائن مشترك: لا يوجد مثل هذا الملف أو الدليل ---> System.DllNotFoundException: تعذر تحميل المكتبة المشتركة 'kernel32.dll' أو واحدة من تبعياتها. للمساعدة في تشخيص مشاكل التحميل ، ضع في اعتبارك تعيين متغير بيئة LD_DEBUG: libkernel32.dll: لا يمكن فتح ملف كائن مشترك: لا يوجد مثل هذا الملف أو الدليل
في AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat (تيار definitionStream، سلسلة والوصف، سلسلة واللغة، ParameterInfoCollection والمعلمات، DataSourceInfoCollection وdataSources، DataSetInfoCollection وsharedDataSetReferences، UserLocationFlags وuserReferenceLocation، ArrayList وdataSetsName، منطقية وhasExternalImages، منطقية وhasHyperlinks، بايت [] وdataSetsHash)
في AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat (بايت [] تعريف، سلسلة والوصف، سلسلة واللغة، ParameterInfoCollection والمعلمات، DataSourceInfoCollection وdataSources، DataSetInfoCollection وsharedDataSetReferences، UserLocationFlags وuserReferenceLocation، ArrayList وdataSetsName، منطقية وhasExternalImages، منطقية وhasHyperlinks، بايت [] وdataSetsHash)
في AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport (PublishingContext reportPublishingContext، PublishingErrorContext errorContext، سلسلة وreportDescription، سلسلة وreportLanguage، ParameterInfoCollection والمعلمات، DataSourceInfoCollection وdataSources، DataSetInfoCollection وsharedDataSetReferences، UserLocationFlags وuserReferenceLocation، ArrayList وdataSetsName، منطقية وhasExternalImages، منطقية وhasHyperlinks، بايت [] وdataSetsHash)
في AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
--- نهاية تتبع مكدس الاستثناء الداخلي ---
في AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)
في AspNetCore.Reporting.ReportCompiler.CompileReport (سياق ICatalogItemContext ، Byte [] reportDefinition ، إنشاء منطقي ExpressionHostWithRefusedPermissions ، ControlSnapshot & snapshot)
--- نهاية تتبع مكدس الاستثناء الداخلي ---
في AspNetCore.Reporting.ReportCompiler.CompileReport (سياق ICatalogItemContext ، Byte [] reportDefinition ، إنشاء منطقي ExpressionHostWithRefusedPermissions ، ControlSnapshot & snapshot)
في AspNetCore.Reporting.LocalService.GetCompiledReport (PreviewItemContext itemContext ، إعادة بناء منطقي ، ControlSnapshot & snapshot)
في AspNetCore.Reporting.LocalService.CompileReport ()
في AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport ()
في AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession ()
--- نهاية تتبع مكدس الاستثناء الداخلي ---

ststeiger هل من أخبار على مكتبة AspNetCore. لقد كنت أبحث عن حل لإنشاء ملفات PDF من ملف RDL على .NET Core منذ أيام وكان الحل الوحيد الذي وجدته هو AspNetCore. إعداد التقارير ، الذي اكتشفته لاحقًا يعمل فقط على Windows والتعديلات التي أجريتها وأبلغت عنها هنا جذابة للغاية ، أيضًا لأنني أواجه بعض المشكلات في استخدام التقارير الفرعية ولا يمكنني تصحيح أخطاء AspNetCore. إعداد التقارير بدون المصدر الذي لديك :) ... سأكون مهتمًا جدًا بمساعدتك في تلك المكتبة لتحسين البتات المفقودة ( وأخيرًا لتتمكن من تصحيحه ...)

OkunevPY : من المحتمل أن يكون سبب ذلك إحدى وظائف إدارة الذاكرة المستخدمة لتخزين بيانات مصدر البيانات بشكل آمن. في Linux ، قمت للتو بإيقاف تشغيل ذلك - تخزين البيانات غير المشفرة. ثم يعمل ، على الرغم من أنه غير آمن. يجب عليك القيام بذلك في ReportViewer-code ، مع ذلك. سيتعين على رمز درجة الإنتاج تنفيذ طريقة تشفير / فك تشفير ، وهذا ليس بالأمر الصعب - لكنني أفضل تشغيل جميع الميزات أولاً ،

@ zillemarco.
إنشاء PDF لا يعمل ، حتى الآن (يعمل فقط على Windows).
أيضًا ، إذا قمت بإنشاء أي تطبيق قمت بنشره باستخدام ملف dll ذي الهندسة العكسية ، فأنت تقوم من الناحية الفنية بشيء غير قانوني.

إذا كنت بحاجة إلى ملف PDF تم إنشاؤه على Linux ، فإنني أوصي بإنشائه من HTML باستخدام wkHtmlToPdf.
إليك متغير NET-Core:
https://github.com/ststeiger/libWkHtml2X
استخدم فقط المتغير القابل للتنفيذ (wkhtmltopdf.exe ، wkhtmltoimage.exe عبر دفق الإدخال / الإخراج)
libWkHtmlToX.ProcessManager(opts)
لأن wkhtmltox.dll لا يعمل في سيناريوهات خيوط المعالجة المتعددة ، بالإضافة إلى أن واجهة C # ليست خالية تمامًا من الأخطاء حتى الآن.

بعض أمثلة الاستخدام (convert.telerik.com للتحويل إلى C #):

  • SVG إلى 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 إلى 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

بدلاً من ذلك ، يمكنك استخدام PdfSharp لـ .NET-Core
https://github.com/ststeiger/PdfSharpCore

لقد قمت أيضًا بنقل مكتبة PDF الكاملة إلى NetStandard ، والتي يمكن العثور عليها هنا:
https://github.com/ststeiger/PdfSharpNetStandard
(إذا لم تكن بحاجة إلى استضافة Azure ، أوصيك باختيار PdfSharpNetStandard)

بقدر ما يتعلق الأمر بـ ReportViewer-PDF على Linux:
ستحتاج إلى تنفيذ الكثير من ملفات pinvokes أولاً (لا يقوم Linux بتنفيذ Windows-API ، ولا يمكنك فقط إعادة توجيه جميع مكالمات dll إلى النبيذ).

لقد انتهيت فقط من GetFontData حتى الآن ، لأن هذا هو الأهم (تضمين الخطوط).
إذا كان بإمكانك إعطائي اسم حساب gitlab (وليس hub) ، فيمكنني منحك حق الوصول للقراءة إلى المستودع.

ststeiger أعلم أن نشر تطبيق مع تلك المكتبة سيكون غير قانوني ولا أنوي القيام بذلك ، ولكن باستخدام الكود المصدري يمكنني على الأقل تصحيح أخطائه لفهم سبب عدم تمكني من تحميل تقرير فرعي و تمرير البيانات إليها (لقد حاولت مع resharper لكنه كابوس). إذا كنت ترغب في إعطائي حق الوصول للقراءة إلى الريبو ، فأنا أحب ذلك :) اسم مستخدم gitlab الخاص بي هو zillemarco (تمامًا مثل هنا على github)

@ zillemarco : أضافك.
يجب أن تكون قد تلقيت بريدًا إلكترونيًا من gitlab ، ويفترض أنه يحتوي على رابط إلى الريبو.

جرب ILSpy 4.0 Beta 2 بدلاً من Resharper:
https://github.com/icsharpcode/ILSpy/releases

إذا كنت بحاجة إلى تصحيح الأخطاء داخل .NET Framework ، فحاول فك ترجمة مباشر وتصحيح الأخطاء باستخدام Rider ، فإن EAP مجاني:
https://www.jetbrains.com/rider/eap/

@ حصل

ststeiger يمكنك منح حق الوصول إلى مستودع AspNetCore. هل تريد الإبلاغ عن okunevpy؟

OkunevPY : لقد تمت إضافتك. انظر البريد.

تضمين التغريدة

        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: "حدث خطأ أثناء معالجة التقرير المحلي. ؛ لا توجد بيانات متاحة لتشفير 1252. للحصول على معلومات حول تعريف ترميز مخصص ، راجع وثائق طريقة Encoding.RegisterProvider."

Jhonnybmx : يوجد موقع على شبكة الإنترنت يسمى google.com حيث تضع رسالة الخطأ والحل هو الرابط الأول ...

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

مرحبًا ، أنا مهتم بـ LocalReport على .NET Core لتصدير تقرير rdlc إلى PDF.
بالنسبة لي ، إصدار Windows فقط مناسب في الوقت الحالي.

صادفت حزمة AspNetCore.ReportingServices من NuGet بواسطة @ amh1979 وهو بالضبط ما أحتاجه.
تكمن المشكلة في أن فئة InternalLocalReport في هذه الحزمة داخلية وأحتاج إلى الوصول إلى واجهة برمجة التطبيقات بالكامل (كما هو الحال في تطبيق MS LocalReport الأصلي) من أجل eq. لاستخدام الحدث SubreportProcessing ، قم باستدعاء أساليب LoadSubreportDefinition () أو GetParameters ().

لم يتم تنفيذ هذه الأساليب في فئة AspNetCore.Reporting.LocalReport (في AspNetCore.Reporting NuGet) لذلك أحتاج إلى الاتصال بهم مباشرة.

قام التجميع AspNetCore.ReportingServices.dll بتعيين InternalsVisibleTo لتجميع AspNetCore.Reporting.dll.
هل يمكنني استخدام ذلك بطريقة ما كما هو الحال في https://github.com/amh1979/Reporting/tree/master/AspNetCore.Reporting بشهادة Reporting.pfx (التي ليس لدي كلمة مرور لها).

ارجوك، هل يمكنك مساعدتي؟ ما هو الحل لهذا؟

ststeiger يمكنك منحي حق الوصول إلى مستودع GitLab AspNetCore. اسم مستخدم GitLab الخاص بي هو holajan.
شكر

AspNetCore.ReportingServices بموجب هذا الترخيص
http://go.microsoft.com/fwlink/؟LinkId=826162
لقد أغلقته

هل يمكن لشخص ما تقديم وثائق / أدلة أو تلميحات حول كيفية استخدام / تنفيذ هذه الحزمة؟ شكرا جزيلا.

ststeiger هل يمكن أن تعطيني حق الوصول إلى مستودع AspNetCore. أحاول أن أجعله يعمل على Linux باستخدام PDF.

holajan ، skivsoft :
آسف ، كانت في عطلة - كانت رحلة لطيفة إلى سنغافورة وتايلاند.
تم منح حق الوصول ، يجب أن تكون قد تلقيت بريدًا إلكترونيًا على العنوان المقدم إلى gitlab.

azharuddinsayed :

عندما أحاول مع ملف .rdlc ، أحصل على استثناء
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (من TMemberType ، TCellType). لا يمكن الوصول إلى m_memberTreeHostsRemotable في هذا السياق لأنه "صديق". ". في localreport.Execute ()
ساعدني من فضلك

تمكنت من إعادة إنتاج هذا الخطأ.
التغييرات التالية مطلوبة:


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)

و

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

بالإضافة إلى ذلك ، فإن التصحيح التالي في
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 + "\"")

ثم يعمل الرمز المخصص ، على الأقل في حالتي.
تم التحديث في الماجستير.

ststeiger شكرا على الوصول. هل لديك أي فكرة عن كيفية تقديم ملف PDF على نظام Linux؟ هناك الكثير من pinvokes لاستبداله.

skivsoft : لا يوجد أي شيء حتى الآن.
ستحتاج إلى استبدال جميع ملفات pinvokes بمكافئ من النوع freetype ، وهذا يتطلب الكثير من العمل.

إذا كنت تحتاج فقط إلى إنشاء ملف PDF على نظام Linux ، فيمكنك تجربة PdfSharpCore أو PdfSharpNetStandard:
https://github.com/ststeiger/PdfSharpCore
https://github.com/ststeiger/PdfSharpNetStandard
أنا أستخدم كلاهما على Linux.
يعد PdfSharpNetStandard أكثر اكتمالاً ، ولكنه يستخدم أيضًا GDI + / libGDIplus ، بينما يبتعد PdfSharpCore عن System.Drawing.

ststeiger شكرا للوصول إلى الريبو.

تمكنت من تشغيل تقريري (تصدير إلى PDF) في تطبيق windows .NET core 2.2.
لقد صنعته على نسخة من مشروع ReportViewer_NetStandard الخاص بك ، لأنني أزلت LocalReports وقمت بتغيير InternalLocalReport إلى LocalReport وجعلت الفصل عامًا (كنت بحاجة للوصول إلى LocalReport API الأصلي).

في تقريري ، أصلحت مشكلتين:
بعض تعابير Visual Basic:
معهد التمويل الدولي - أضفت استيراد لMicrosoft.VisualBasic.Interaction في _ExprHostBuilder_، تغيرت لnetcoreapp2.2 حيث الطبقة Microsoft.VisualBasic.Interaction في _Microsoft.VisualBasic.dll_ هي الداخلية، وأضاف صفي Microsoft.VisualBasic.Interaction إلى Microsoft.VisualBasic1.

التنسيق - تمت إضافة استيراد إلى Microsoft.VisualBasic.StringsEx في _ExprHostBuilder_ ، تمت إضافة فئة Microsoft.VisualBasic.StringsEx إلى Microsoft.VisualBasic1 (نظرًا لأن الفئة الأصلية Microsoft.VisualBasic.Strings عامة ولكن بدون وظيفة التنسيق)

System.Environment.NewLine - تمت إضافة مرجع إلى System.Runtime.Extensions.dll في _ExprHostCompiler_.

هذه هي التغييرات في الكود:

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)

سلاسل

إصلاح التقارير الفرعية مع التعبيرات:
لقد لاحظت أن عناصر التقرير الفرعي كانت تستخدم ReportExprHost من التقرير الرئيسي وليس ReportExprHost ReportRuntime.LoadExprHostAssembly ، حيث تم تخزين تجميعات ExpressionHost.dll مؤقتًا بالاسم ، لكن اسم كافة التقارير والتقارير الفرعية دائمًا ما يكون هو نفسه "_ExpressionHost_". أزلت هذا التخزين المؤقت.
التغييرات في الكود:

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

يرجى مراجعة هذه التغييرات وإذا كان هذا منطقيًا بالنسبة لك ، فقم بإجراء هذه التغييرات في الريبو أيضًا.

شكرا لك.

holajan : إذا أضفت System.String إلى مساحات الأسماء ،
Ambigous call to Replace - cannot resolve call
وإذا أضفت فئة Microsoft.VisualBasic.Interaction ، فسأحصل على:
ambigous call to Microsoft.VisualBasic.Interaction
عندما أقوم بتشغيله في NetCore أو .NET Framework 4.
ربما يعمل هذا فقط في .NET Core 2.2.

إذا كان التخزين المؤقت غير صحيح ، فمن الأفضل عدم التخزين المؤقت.
أتفق مع هذا التغيير.
لقد وضعت الكود القديم في #ifdef false (بدلاً من إزالته).

@ ststeiger لقد قمت بتحرير تعليقي ، باستخدام System.String كان خاطئًا ، لقد قمت الآن بتطبيق Microsoft.VisualBasic.StringsEx بدلاً من التنسيق والوظائف الأخرى. اسف على ذلك.

نعم يعمل Microsoft.VisualBasic.Interaction فقط في .NET Core 2.2. ، لأن الفئة Microsoft.VisualBasic.Interaction موجودة في Microsoft.VisualBasic.dll لـ .NETCoreApp v2.2 داخليًا ، في Microsoft.VisualBasic.dll لـ .NETCoreApp v2.09 عامة ولكن مع الطريقة الداخلية IIf .
لا أعرف كيفية حل هذا بشكل أفضل ، ولكن مع .NET core 3.0 من المحتمل أن يتغير على أي حال.

holajan : طويلا ، دعنا ننتظر حتى 3.0
لقد جعلت InternalLocalReport عامًا.
اسم غريب الآن يتعلق بالجمهور ؛)

holajan : تمت إضافة Microsoft.VisualBasic.StringsEx ، وهو يعمل الآن
اضطررت إلى إضافة IReadOnlyDictionary لـ .NET 4 ، لكن هذا مجرد ملاحظة بسيطة.
هل يمكنك اختبار ما إذا كان هذا يعمل معك.

@ ststeiger اختبرت ذلك.
يجب أن أقوم بتغيير #if false إلى #if true في Microsoft.VisualBasic1._Interaction.cs لكي يعمل تعبير IIf .
وإلا فإنه يعمل بشكل جيد.
ثانكس

holajan : حسنًا ، هذا ما ينبغي أن يكون. ربما يكون التعريف في الحل أفضل.

يجب على كل فرد في هذا الموضوع التصويت لإضافته هنا: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- النواة

اعتبارًا من 2019/03 ، إنها السابعة من أكثر الميزات المطلوبة: https://feedback.azure.com/forums/908035-sql-server ؟ category_id=325159

تحرير: اعتبارًا من 2019/05 ، الإصدار الخامس من الأعلى

تحرير: اعتبارًا من 2019/07 ، إنها الرابعة من الأعلى

        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: "حدث خطأ أثناء معالجة التقرير المحلي. ؛ لا توجد بيانات متاحة لتشفير 1252. للحصول على معلومات حول تعريف ترميز مخصص ، راجع وثائق طريقة Encoding.RegisterProvider."

أضف الكود أدناه:
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance) ؛
يحل مشكلتي

مرحبا،

لقد حاولت تصدير التقرير في Html باستخدام الكود أدناه ولكن لا يتم عرضه بشكل صحيح.

يحتوي ملف .rdl على مخطط

لقد أرفقت لقطة شاشة لـ Html

نقدر بشدة ما إذا كان بإمكانك مساعدتنا في حل هذه المشكلة.

شكر

النموذج الأساسي: ASP.NET Core

السلسلة العامة _reportPath = @ ".. \ RenderReportAPI \ staffChart.rdl"؛

سلسلة mimtype = "" ؛
تمديد 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 : ماذا يظهر عنوان URL لعنصر "مخطط التقرير"؟
يحتوي عارض html على مسار إخراج ثانوي لـ CSS.
هل تحتوي على صورة بتشفير base64؟ أم أنها مجرد ارتباط لمعالج الصور؟

تضمين التغريدة
مرحبًا ، ابحث عن HTML و CSS أدناه
لغة البرمجة :

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







CSS:

"#rsoReportDiv .A97993c8d452f40d4910a317776d607f616xBc {
الحدود: 1pt بلا أسود ؛
لون الخلفية
}

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;

}

تقرير عنصر المخطط
Report chart
أعتقد أن هذا الخطأ يسبب المشكلة

شكر..

تضمين التغريدة

مرحبا أي تحديث؟

ههههههههه
أعمل حاليًا على CEF-pdf كبديل wkhtml2X ، وعلى تقارير SwissRe.

سيكون لدي الوقت للنظر في هذا المشروع في أكثر من أسبوعين ، على أقرب تقدير.

هل يوجد مستودع (خاص أو غير ذلك) لحزمة AspNetCore.ReportingServices التي يمكن منحني حق الوصول إليها؟

clintb : أحتاج إلى اسم حساب git LAB الخاص بك ، لذا يمكنني منحك حق الوصول.
ستتلقى بعد ذلك رسالة بريد إلكتروني إلى عنوان البريد الإلكتروني لحساب git lab الذي يحتوي على حق الوصول إلى الريبو.

مرحبًا Stefan ، معمل gitLab الخاص بي هو c_l_i_n_t. شكر!

يوم الجمعة 26 أبريل 2019 الساعة 12:18 مساءً Stefan Steiger [email protected]
كتب:

clintb https://github.com/clintb : أحتاج اسم حساب git LAB الخاص بك ، لذا
يمكنني منحك حق الوصول.
ستتلقى بعد ذلك بريدًا إلكترونيًا على عنوان البريد الإلكتروني الخاص بمختبر git
يحتوي على حق الوصول إلى الريبو.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/aspnet/AspNetCore/issues/1528#issuecomment-487133308 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ABURO5ILQUEGMZARNW2HNALPSM2M5ANCNFSM4CFRN7MQ
.

clintb : لقد تمت إضافتك.

مرحبًا ststeiger ، إذا

lotsatrees : لقد تمت إضافتك.

شكرًا لستيفان ، مسرور بشراء بيرة جيدة في أي وقت.

مرحبًا ststeiger ،

تضمين التغريدة
جيت لاب الخاص بي هو ikourfaln
شكرا لك

ikourfaln ، edgardoreyes : أضافك اثنان ؛ من المفترض أن تكون قد تلقيت بريدًا إلكترونيًا على حساب البريد الذي قمت بتسجيله في gitlab.

ststeiger ، هل من الممكن أن أضيف نفسي أيضًا (Mhirji على gitlab)؟

شكر!!

Mhirji : انتهى.

شكر!!!

لماذا لا تقوم فقط بإنشاء مشروع خادم التقرير واستخدامه كخدمة لأي نوع مشروع؟
سيحتاج مشروع ASP.NET Core الخاص بك فقط إلى URL الخاص بخدمة التقارير لعرض التقارير.
أي مشكلة مع هذا النهج؟

@ ststeiger هل يمكنني الوصول أيضًا؟ (ConstantDisaster on gitlab) شكرًا مقدمًا

ConstantDisaster : تمت الإضافة.
mshwf : لا ، هذا بالضبط ما أريد القيام به - حتى نتمكن من تشغيل التقارير في تطبيقنا الخاص ، ولا حاجة إلى خادم تقارير (دائمًا ما تكون هناك مشكلة في مصادقة Windows - لبعض الأسباب التي تجعل أقسام تكنولوجيا المعلومات غير قادرة على إضافة مستخدمين جدد إلى مجموعة - بالإضافة إلى وجود مشكلة دائمًا في حزم الخدمة التي تم إلغاء تثبيتها ، وعدم الرغبة في التحديث إلى أحدث إصدار من خادم SQL لأن العملاء يريدون تخطي إصدار ، مما يجعل التناقضات بين ReportViewer و ReportServer ، فإن مسؤول النظام لدينا كسول جدًا لتثبيت أي شيء ، وما إلى ذلك). فقط قلة الوقت ، كما هو الحال دائما. بالإضافة إلى أنها أول أيام الصيف المشمسة ، هنا في شمال غرب أوروبا ، ولا أريد تفويتها.

ststeiger هل هناك بدائل أفضل؟ (حاولت قراءة هذا الموضوع ، لكنه طويل جدًا!)
هل يمكنك أيضًا منحني حق الوصول إلى GitLab repo (mshwf)؟
شكر

الرجاء دعم هذا الطلب ، ونأمل أن تستمع Microsoft إلينا!

يا ststeiger ، هل
اسم مستخدم gitlab الخاص بي هو k3flo
شكرا جزيلا لك
فيلين دانك 😊

ststeiger شكرًا على الإضافة ، فكيف أبدأ في استخدام هذا مرة أخرى؟ في مشروع أساسي صافي ASP؟ اعتقدت أنه يحتوي على ملف تمهيدي أو شيء من هذا القبيل ، شكرًا مرة أخرى.

ConstantDisaster : يوجد "مثال" في AnyWebReporting\Any_TestCode\TestReport.cs .
يوضح كيفية عرض تقرير بالمعلمات ومجموعات البيانات في ملف PDF.

شيء صغير:
1) إنشاء قاموس لمعلمات التقرير:

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

2) أضف جميع المعلمات التي لديك في تقريرك إلى القاموس ، على سبيل المثال

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

3) أنشئ تقريرًا جديدًا يستند إلى LocalReport وتحميله

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

بعد ذلك ، بالنسبة لجميع مجموعات البيانات المستخدمة في المعلمات فقط ، يمكنك إضافة جدول بيانات فارغ (ليس NULL)
lr.AddDataSource("SEL_Standort", new System.Data.DataTable());

ولكل مجموعة بيانات يتم استخدامها ، تحتاج إلى ملء جدول بيانات بنتيجة الاستعلام لمجموعة البيانات هذه ، وإضافة مجموعة البيانات إلى مصادر البيانات:

lr.AddDataSource("DATA_Schluesselbestandeskontrolle", dt);

بعد ذلك ، يمكنك تنفيذ التقرير وجلب النتيجة وكتابتها في مكان ما ، على سبيل المثال محرك الأقراص d:

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

لقد أضفت نموذجًا لصفحة HTML تحاكي تصميم واجهة تقرير ReportViewer 2014 و 2017 ، التي كانت لدي في نسخة مسودة. إذا جلبت مرة أخرى من git ، فستجدها في:

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

وهذا كل شيء.
إذا كنت بحاجة إلى عرض التقرير في الويب ، فيمكنك تقديمه إلى html بتمرير Enum المعني إلى lr.Execute (RenderType.HTML5_0 أو HTML4_0 أو Mhtml) ، وتمرير رقم الصفحة الصحيح. كانت النتيجة (HTML) في MainStream ، و CSS موجودة في SecondaryStream.

ومع ذلك ، فإن ربط index.htm لـ ReportViewer بـ lr.Execute بواسطة JavaScript ، عليك أن تفعله بنفسك ، في الوقت الحالي. لم أتمكن من القيام بذلك حتى الآن. في الوقت الحالي ، أحتاجه لإنشاء ملفات PDF لإلحاقها برسائل البريد الإلكتروني.

@ k3flomshwf : تمت الإضافة.

mshwf :

ststeiger هل هناك بدائل أفضل؟ (حاولت قراءة هذا الموضوع ، لكنه طويل جدًا!)

ليس على حد علمي ، وإلا كنت سأستخدمه.
ربما سنرى شيئًا في هذا الصدد بعد إصدار .NET Core 3.1 (LTS) ، لأنه بعد ذلك سيكون الطريق مجانيًا لإنشاء ReportViewer لنظام التشغيل windows فقط استنادًا إلى NET Core.

ومع ذلك ، فإن مثل هذا الشيء سيكون بنفس القدر من bricolage مثل هذا المشروع ، لذلك ربما سيستغرقون الوقت لإزالة كل النظام. الرسم (واستدعاء WinAPI إلى GDI +) ، والقيام بذلك بشكل صحيح ، وهذا يعني ، عبر منصة. رغم أنه في رأيي ، هذا غير مرجح. لست مستاءً من أن تتفاجأ بشكل إيجابي (السعال).

الشيء هو أن التقارير يمكن أن تحتوي على رمز VB ، ودعم VB في .NET Core (<3) ، في الوقت الحالي ، مشكوك فيه - في أحسن الأحوال. سيتم تصحيح هذا (= يجب من الناحية النظرية) بواسطة .NET Core 3 ، وإذا قاموا بإنشاء ReportViewer ، فمن المرجح أن ينتظروا حتى إصدار LTS ، على الأقل.

mshwf :
لا تحتاج لقراءة هذا الموضوع بأكمله.
كل ما عليك فعله هو git-clone the project والاطلاع على مثال التقرير (مع ذلك ، لن يكون لديك قاعدة البيانات لتشغيله).

هل يمكنك إضافتي على gitlab من فضلك؟
DCGA

dcga : تمت الإضافة.

مرحبًا ، هل يمكنك إضافتي على gitlab الخاص بك؟ أقوم بتحويل التقرير إلى مشروع ASP.net الأساسي الآن.

@ ericyu67 : أفترض أن اسم حسابك في gitlab هو ericyu؟ في هذه الحالة تمت إضافتك.

هذا صحيح ، شكرا لك.

@ ststeiger هل يمكن أن
رودريغورل

rodrigorrl : مضاف.

@ ststeiger هل يمكن أن

@ myersBR : انتهى.

@ ststeiger هل يمكنك

acofalc : تمت الإضافة @ aco.mit

مرحبًا ، @ ststeiger ، الرجاء إضافتي: oblin228 ، شكرًا.

أي أخبار عن هذا؟ أنا أستخدم ASP.NET Core وأرفض العودة إلى نماذج الويب. لدي مشروع تقارير وأقوم بإدخال عنوان url من خادم التقارير إلى تطبيقي لتنزيل الملف. تكمن المشكلة في أنه يطلب باستمرار مصادقة Windows وأود تجنب ذلك ...

oblin : تمت الإضافة.

jfcaldeira : ما دمت تقوم بتشغيل التطبيق على Windows ، يجب أن يعمل ReportViewer على gitlab ، أكثر أو أقل (مشكلة مفتوحة مع الصور في إخراج HTML ، حتى الآن). قم بتشغيله على Linux ، ويجب أن يعمل طالما أنك لا تستخدم PDF أو TIFF أو PowerPoint كتنسيق إخراج (لا أعرف شيئًا عن كلمة) ، ولكن Excel و html و xml و json يعمل على Linux أيضًا (في اختبار التقرير الأول الخاص بي - لا يمكنني تحديد ما إذا كان أي شيء ينفجر إذا كنت تستخدم مجموعة الميزات الكاملة).

ولكن إذا كانت مشكلتك هي مصادقة Windows على SSRS ، فلماذا لا تستخدم الأمان المخصص (المعروف أيضًا باسم مصادقة نماذج SSRS).

لذلك ، انظر هنا:
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

قد تحتاج إلى تسجيل دخول المستخدم باستخدام Form-Post في JavaScript ، وتعيين سياسة P3P (في SSRS عبر الوحدة النمطية http) لكي يستمر ملف تعريف الارتباط SSRS-auth في IE accross domains ... (ملاحظة: إذا كنت تستخدم أدلة افتراضية ، ولديك تطبيقان على SSRS واحد ، فإن ملف تعريف الارتباط من التطبيق 1 [الموجود في مجال SSRS] سوف يحل محل ملف تعريف الارتباط الخاص بالتطبيق 2 ، والذي يوجد أيضًا على مجال SSRS)

oblin : تمت الإضافة.

jfcaldeira : ما دمت تقوم بتشغيل التطبيق على Windows ، يجب أن يعمل ReportViewer على gitlab ، أكثر أو أقل (مشكلة مفتوحة مع الصور في إخراج HTML ، حتى الآن). قم بتشغيله على Linux ، ويجب أن يعمل طالما أنك لا تستخدم PDF أو TIFF أو PowerPoint كتنسيق إخراج (لا أعرف شيئًا عن كلمة) ، ولكن Excel و html و xml و json يعمل على Linux أيضًا (في اختبار التقرير الأول الخاص بي - لا يمكنني تحديد ما إذا كان أي شيء ينفجر إذا كنت تستخدم مجموعة الميزات الكاملة).

ولكن إذا كانت مشكلتك هي مصادقة Windows على SSRS ، فلماذا لا تستخدم الأمان المخصص (المعروف أيضًا باسم مصادقة نماذج SSRS).

لذلك ، انظر هنا:
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

قد تحتاج إلى تسجيل دخول المستخدم باستخدام Form-Post في JavaScript ، وتعيين سياسة P3P (في SSRS عبر الوحدة النمطية http) لكي يستمر ملف تعريف الارتباط SSRS-auth في IE accross domains ... (ملاحظة: إذا كنت تستخدم أدلة افتراضية ، ولديك تطبيقان على SSRS واحد ، فإن ملف تعريف الارتباط من التطبيق 1 [الموجود في مجال SSRS] سوف يحل محل ملف تعريف الارتباط الخاص بالتطبيق 2 ، والذي يوجد أيضًا على مجال SSRS)

مرحبا ، شكرا لك على الرد على مشكلتي. لم أسمع عن هذا المراسل الصحفي على gitlab ، هل يمكنك أن تريني مذيعًا له؟

وحول مصادقة Windows ، تكمن المشكلة في أن لدي المستخدم مصادقة باستخدام مصادقة ملفات تعريف الارتباط على تطبيقاتي في ASP.NET Core ، والحل البديل لجعل المستخدمين يصلون إلى التقرير هو في الأساس تمرير عنوان URL المباشر مع المعلمات إلى href من المرساة واختر تنسيق PDF عليه أيضًا. كنت أحاول إيجاد طريقة لعدم طلب المصادقة على المستخدم لأنه أمر مزعج لضرورة قيام المستخدم النهائي بالمصادقة مرتين. أنا أستخدم بالفعل حسابًا محددًا فقط للوصول إلى مصدر البيانات ، وهذا واحد معطل.

مرحبًا ، ststeiger - gitlab الخاص بي هو arunputhran. هل يمكنك منحني الوصول من فضلك؟ شكرا جزيلا!

إعادة نشر هذا لأنه تم دفنه في جميع طلبات "أعطني الوصول إلى gitlab".

يجب على كل شخص يأتي عبر هذا الموضوع التصويت لـ .NET Core SSRS لإضافته هنا: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for -asp-net-core

بدأت في المركز السابع من الأعلى ، وارتفعت إلى المرتبة الرابعة من أعلى ميزة SQL Server الأكثر طلبًا (https://feedback.azure.com/forums/908035-sql-server؟category_id=325159)

تحرير: بسبب هذا المنشور حتى المركز الثالث الآن

لست متأكدًا مما إذا كان يساعد على الرغم من ...

arunputhrankyc : تمت الإضافة.

@ k290 : ناه ، كما ترون ، من الواضح أن المظهر الداكن لـ SQL Server Management Studio 2017 أكثر أهمية: الصراخ:: man_facepalming:: woman_facepalming:
على ما يبدو ، لم يسمعوا بعد عن SQL-ops-studio / AzureDataStudio .

أعتقد ، بهذه الروح ، يجب على شخص ما إضافة تصميم مسطح إلى قائمة الرغبات ، على سبيل المزاح.
للأسف ، لم نكن في الأول من أبريل بعد: غمزة:

بالمناسبة ، أحصل على تقارير بتنسيق pdf من واجهة برمجة تطبيقات ويب ولا أستخدم أي بتات wcf.
فقط مكالمات الصابون / ASMX ومكالمات http.
في القيام بها ، أمرر الاعتمادات بدون أي مشاكل.
الكود الخاص بي هو asp.net 4.6 / web api 2
إذا كنت تريد معرفة ما أفعله ، يمكنني وضع بعض التعليمات البرمجية على جيثب الأسبوع المقبل لتتمكن من التحقق منها.
أنا أتصل بخادم التقارير 2016 ولكن معظم ما أقوم به سيعمل مع إصدارات SSR الأقدم.

مرحبًا ، لقد قرأت هذا التعليق الخاص بك كيف تتعامل مع SSRS. أفعل شيئًا مشابهًا أيضًا ، لدي نقطة ارتساء في تطبيق ASP.NET Core يحتوي على عنوان URL مباشرةً للتقرير مع تضمين المعلمات وامتداد التنسيق. ومع ذلك ، فإن المشكلة هي أنه يطلب مصادقة Windows. هل هناك طريقة للتوقف عن طرح هذا السؤال نظرًا لأن المستخدمين قاموا بالفعل بتسجيل الدخول إلى تطبيقي باستخدام مصادقة ملفات تعريف الارتباط؟ لا أهتم حتى بإظهار التقرير طالما تم تنزيله ولكن سيكون من الجيد تخطي المصادقة

arunputhrankyc : تمت الإضافة.

@ k290 : ناه ، كما ترون ، من الواضح أن المظهر المظلم لـ SQL Server Management Studio 2017 أكثر أهمية 😱 🤦‍♂ 🤦‍♀
على ما يبدو ، لم يسمعوا بعد عن SQL-ops-studio / AzureDataStudio .

أعتقد ، بهذه الروح ، يجب على شخص ما إضافة تصميم مسطح إلى قائمة الرغبات ، على سبيل المزاح.
للأسف ، ليس الأول من أبريل بعد 😉

حسنًا ، سأقتل من أجل مظهر مظلم لـ SSMS بالتأكيد ، لكنني سأأكل يدي العارية من أجل SSRS. إن حجم العمل الذي يتم توفيره من خلال عرض البيانات المجمعة عليه مباشرة من SQL أمر مذهل.

حل رائع ، من فضلك أضفني في gitlab: kholossok ، شكرًا

من فضلك أضفني أيضًا في gitlab:EMaderbacher

@ kholossok ، EMaderbacher : تمت الإضافة.

أضفني أيضًا من فضلكjfcaldeira

jfcaldeira : أنت بحاجة إلى إعطائي حساب معمل git.
هذا حساب git hub .
انه مجانا. https://gitlab.com
لم تكن المستودعات الخاصة مجانية على جيثب في ذلك الوقت.

تضمين التغريدة
أصبحت المستودعات الخاصة مجانية الآن على GitHub ، والقيود على عدد المتعاونين.

jfcaldeira : أنت بحاجة إلى إعطائي حساب معمل git.
هذا حساب git hub .
انه مجانا. https://gitlab.com
لم تكن المستودعات الخاصة مجانية على جيثب في ذلك الوقت.

لقد قمت بإنشاء حساب بنفس اسم المستخدم

jfcaldeira : تمت الإضافة. يجب أن تكون قد تلقيت رسالة بريد إلكتروني تحتوي على معلومات الوصول.
ikourfaln : أعرف. لم أكن أعرف أن هناك قيودًا على 3 متعاونين في مستودعات جيثب الخاصة. من الجيد معرفة ذلك ، شكرا .

قيود Gitlab:

للاحتفال بأخبار اليوم السارة ، قمنا برفع حد التخزين الخاص بنا بشكل دائم لكل مستودع على GitLab.com من 5 غيغابايت إلى 10 غيغابايت. كما كان من قبل ، فإن المستودعات العامة والخاصة على GitLab.com غير محدودة ، وليس لها حد نقل وتتضمن متعاونين غير محدودين.

هل لي من فضلك أن أضيف أيضا؟ حسابي على GitLab هو barryjsilver. شكر!

هل يمكنني أن أضيف من فضلك؟ @ jyanosu شكرا لك!

BarryJSilver : تمت الإضافة.

jyanosu : أحتاج إلى حساب git lab .com وليس github.

ststeiger عفوًا ، فقط قم بإعداده .. نفس اسم المستخدم

@ jyanosu : تمت الإضافة.

ststeiger ، هل يمكنك إضافة حساب gitlab الخاص بي @ kanichi123
شكرا لك!

@ kanichi123 : أضيفت.

ststeiger من فضلك حسابي sheryever

sheryever : تمت الإضافة.

ststeiger من فضلك ، هل يمكنك إضافة حسابي على gitlabPentaTech
شكرا لك!

@ ststeiger هل يمكنك
شكرا لك!

@ بينتا تك ، @ جي راد: تمت الإضافة.

@ ststeiger جهد جيد في هذا ، هل يمكنك إضافة حساب gitlab brad0000؟

@ brad0000 : تم.

مرحبًا ststeiger ، هل يمكنك

wyepez : تمت الإضافة.

@ ststeiger هل يمكنك

اسم مستخدم Gitlab: choudeshell

choudeshell : تمت الإضافة.

هل يمكنك إضافتي من فضلك؟ شكر!

هل يعمل الحل الخاص بك مع .rdlc (وكذلك جانب الخادم .rld)؟ شكر

هل يعمل الحل الخاص بك مع .rdlc (وكذلك جانب الخادم .rld)؟ شكر

mpirritano : نعم ، في الواقع ، لا يوجد فرق كبير بين RDL و RDLC.
لكنها الويب فقط. لا نوافذ النماذج.
أحتاج حساب git lab لإضافتك ، وليس github.

ststeiger شكرًا - لقد أنشأت حساب GitLab الآن :mdpirrit

هذا رائع - أحتاجه فقط من أجل ASP .NET Core الذي يستهدف .NET Core. شكر!

mpirritano : تمت الإضافة ، يجب أن تكون قد تلقيت بريدًا إلكترونيًا إلى حساب البريد الإلكتروني الذي استخدمته لتسجيل gitlab.

فهمتك؛ شكر!

ststeiger ، إنه يعمل بشكل رائع إلا أنه لا يمكنه عرض المخططات. - يعرض منطقة المخطط مع الخطأ: " تعذر تحميل الملف أو التجميع" System.Windows.Forms ، الإصدار = 4.0.0.0 "

هل هذا قيد معروف أم أنني أفتقد شيئًا ما؟

شكر

ststeiger أيضًا ، لا يبدو كما لو أن التقارير الفرعية مدعومة. على سبيل المثال ، لا يبدو أن هناك معالج أحداث معالجة تقرير فرعي لإضافة مصادر البيانات إلى طبعة التقرير الفرعي

شكر

هل يمكنك إضافتي من فضلك؟ شكر! تضمين التغريدة

هل يعمل الحل الخاص بك مع .rdlc (وكذلك جانب الخادم .rld)؟ شكرا لك

mpirritano : نعم ، لا يوجد فرق كبير بين RDL و RDLC.
لكن هذه ليست سوى شبكة. لا توجد نماذج Windows.
أحتاج إلى حساب Git Lab لإضافتك ، وليس GitHub.

ممكن تضيفني شكرا لك! تضمين التغريدة

@ azikaa : انتهى. Добавлено؛)

@ mpirritano :

هل هذا قيد معروف أم أنني أفتقد شيئًا ما؟

نعم ، أحد القيود كنت أدرك أنه يمكن أن يوجد.
وأيضًا ، هناك مشكلة في إخراج الصور بتنسيق HTML.
نقاط المفتوحة.
لم أفكر حتى في التقارير الفرعية حتى الآن.
للأسف ، لدينا القليل منهم أيضًا ، لذا ستكون هذه مشكلتي أيضًا.
بالحديث عن ذلك ، لا أعرف حتى كيف يتم التعامل مع التقارير الفرعية في ReportViewer العادي على الإطار الكامل ، خاصةً لأنها يمكن أن تكون متكررة.

ربما توجد مشكلة في مكان ما ، لأن "System.Windows.Forms ، الإصدار = 4.0.0.0" غير موجود في هذا الإصدار في .NET Core ، وأيضًا يسمى التجميع System.NetStandard.Forms بدلاً من ذلك في ReportViewer لـ NET Core. قد يعمل على الإطار الكامل ، لأن هناك System.Windows.Forms ، الإصدار = 4.0.0.0 موجود.

من المحتمل أن يتم تصحيح مشكلة System.Windows.Forms بنفس سهولة وضع اسم التجميع والإصدار (أينما يختبئ في رمز المصدر) في ifdef ، فإن التقارير الفرعية ليست على ما أعتقد.

لا يزال يتعين علي إنهاء خدمة إرسال التقارير هذا الأسبوع ، لذلك قد أتمكن من إلقاء نظرة على إصدار System.Windows.Forms في وقت ما الأسبوع المقبل.

بقدر ما تذهب التقارير الفرعية: إنها فكرة سيئة على أي حال ، تميل إلى خلق مشاكل مع PDF و Excel ، وفي حالة وجود تقرير واحد فقط ، أوصي بمعرفة ما إذا كان من غير الممكن بطريقة ما استبعاد التقرير الفرعي تمامًا بطريقة أو بأخرى ، وجعل كل شيء وارد في تقرير واحد.

обавлено
كيفية الحصول على قاعدة البيانات COR_Basic_SwissLife_UAT؟

: rofl: هههه ، جيد ، أنت لا تفعل ذلك ، إن قاعدة البيانات سرية.
ولكن يمكنك عمل نموذج تقرير خاص بك باستخدام قاعدة البيانات الخاصة بك.
يجب أن ترى من المثال كيفية استخدامه.

تضمين التغريدة في الواقع ، أرى أن هناك حدث SubreportProcessing محددًا في AsNetCore.Reporting.InternalLocalReport. قد أحاول إنشاء واجهة عامة لهذا الأمر ومعرفة ما إذا كان بإمكاني تمرير مصادر البيانات إلى أهداف التقرير الفرعي. قد لا أصل إلى هذا حتى الأسبوع المقبل أيضًا ...

أحاول تجنب التقارير الفرعية أيضًا ، لكنني وجدت أنها ضرورية في الحالات التي تحتاج فيها إلى قسم مكرر داخل قسم مكرر. فيما يتعلق بـ Excel ، من الممكن عرض كل مثيل تقرير فرعي كورقة عمل في Excel باستخدام rdlc / rdl

إعادة نشر هذا للقادمين الجدد.

يجب على كل فرد في هذا الموضوع التصويت لإضافته هنا: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- النواة

في مارس من هذا العام كان السابع من القمة.

الآن ، لقد حصلنا عليه حتى الثاني من أعلى اقتراحات SQL Server: https://feedback.azure.com/forums/908035-sql-server ؟category_id=325159

هل يمكننا التغلب على الوضع المظلم؟

ststeiger لقد

كاختبار سريع لنسختي المحلية - لقد قمت بتغيير معدل الوصول الخاص بخاصية "localReport" لفئة "LocalReport" من "داخلي" إلى "عام". ثم يمكنني كتابة معالج لحدث "SubreportProcessing" كما كنت أفعل دائمًا (حيث أقرأ قيمة المعلمة إلى مثيل التقرير الفرعي وأستخدمها لتصفية مجموعة بيانات يمكنني تمريرها إلى مصدر البيانات لمثيل التقرير الفرعي)

ليس لدي أي فكرة عن كيفية إصلاح مشكلة عرض المخطط باستخدام .NET Core ؛ لذلك إذا تمكنت من الوصول إلى حل سيكون رائعًا. ولكن بخلاف ذلك ، أعتقد أن الحل الذي تقدمه يقوم بكل ما أحتاج إليه (أنا شخصياً لا أقدم التقارير بتنسيق HTML مطلقًا)

شكر

تصدير- كلمة ، التفوق لا استيقظ؟
FormatException: يحتوي الرأس على قيم غير صالحة في الفهرس 0: '"

الخدمة بطيئة للغاية. ماذا يمكن ان يفعل؟ الرجاء المساعدة ....

مرحبًا بالجميع ، لقد انتهيت للتو من كتابة منفذ مخصص للتحكم في عارض التقارير باستخدام ReportExecutionService.asmx المدمج في SSRS وكنت أستهدف ASP.NET MVC. كان لدي شخص ما يقترح نقله إلى .NetCore & MVC لذلك أكملت ذلك. جربها وأخبرني برأيك يا رفاق: https://github.com/alanjuden/MvcReportViewer

آلان

تصدير- كلمة ، التفوق لا استيقظ؟
FormatException: يحتوي الرأس على قيم غير صالحة في الفهرس 0: "

الخدمة بطيئة للغاية. ماذا يمكن ان يفعل؟ الرجاء المساعدة ....

azikaa : هل تستخدم MvcReportViewer أو AspNetCore.ReportViewer؟

نحن نغلق هذه المشكلة لأنها ليست ذات صلة مباشرة بهذا الريبو واستنادًا إلى التعليقات هنا ، فإن فريق SSRS على علم بالفعل بهذه التعليقات. نظرًا لكمية التعليقات التي حصلت عليها ، أصبح الأمر الآن غير قابل للإدارة.

رد @ k290 هو الأكثر هنا :

إعادة نشر هذا للقادمين الجدد.

يجب على كل فرد في هذا الموضوع التصويت لإضافته هنا: https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- النواة

في مارس من هذا العام كان السابع من القمة.

الآن ، لقد حصلنا عليه حتى الثاني من أعلى اقتراحات SQL Server: https://feedback.azure.com/forums/908035-sql-server ؟category_id=325159

هل يمكننا التغلب على الوضع المظلم؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات