سؤال

أنا أستخدم ControldViewer Control من Visual Studio 2008 في الوضع المحلي مع الكائنات كمصدر للبيانات. يتم تعيين فصولي إلى جداول البيانات في قاعدة البيانات الخاصة بي. في الكائنات ، يقوم بتحميل الكائنات ذات الصلة حسب الحاجة. لذلك يترك المرجع الفارغ حتى تحاول استخدام الخاصية ، ثم يحاول تحميله من قاعدة البيانات تلقائيًا. تستخدم الفئات مساحة اسم System.Data.SqlClient.

عندما أتفاعل مع الكائنات في تطبيق Windows Forms ، يعمل كل شيء كما هو متوقع. ولكن عندما أقوم بتمرير الكائن ليتم استخدامه كمصدر بيانات للتقرير ويحاول تحميل الكائن ذي الصلة تلقائيًا ، فإنه يفشل. يقوم الرمز بإنشاء كائن SQLConnection وعندما أدعو getCommand () عليه ، يتم طرح الاستثناء التالي:

[System.Security.SecurityException] {
"Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."
} System.Security.SecurityException

لقد حاولت البحث عن الخطأ ، ولكن جميع النتائج التي تظهر هي لتجميعات CLR التي تعمل على خادم SQL أو ASP.NET. لقد حاولت إضافة المكالمة التالية في الكود الخاص بي (كما هو مقترح في نتائج البحث) قبل إنشاء كائنات SQLConnection ، لكن من الواضح أنها لم تفعل أي شيء:

System.Data.SqlClient.SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

أيه أفكار؟

هل كانت مفيدة؟

المحلول 2

لقد وجدت الحل. يمكنك تحديد system.security.policy.vidence من تنفيذ التجميع (أو واحد له حقوق كافية) للتمويل المحلي للاستخدام أثناء التنفيذ.

reportViewer.LocalReport.ExecuteReportInCurrentAppDomain(System.Reflection.Assembly.GetExecutingAssembly().Evidence);

نصائح أخرى

بالإضافة إلى إجابة Cuppm. ال ExecuteReportInCurrentAppDomain يتم إهمال الطريقة منذ .NET4 ، و LocalReport.SetBasePermissionsForSandboxAppDomain يجب استخدامه بدلاً من ذلك ، كما هو الآن في ReportViewer دائماً تم تنفيذه في مجال Sandboxed:

PermissionSet permissions = new PermissionSet(PermissionState.None);
permissions.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
ReportViewer1.LocalReport.SetBasePermissionsForSandboxAppDomain(permissions);

انظر التفاصيل هنا.

فقط في حالة تعثر شخص ما على هذا كما فعلت أثناء البحث عن هذا الإذن. حصلت على هذا الخطأ باستخدام أ تطبيقات Windows-Forms نظرًا لأن العميل قد ربط اختصارًا بتطبيقي على جهازه مع " computername c $ application.exe" بدلاً من "c: application.exe." - تسبب هذا في فشل النظام.

نرى http://www.duelec.de/blog/؟p=236 للمزيد من المعلومات.

حاشية على إجابة أرتيم أعلاه ...

واجهت هذه المشكلة عند إضافة مصادقة Windows إلى تطبيق ASP.NET الخاص بي. استهداف Framework 4.5 واستخدام مكونات الإبلاغ 11. عندما كنت أسمح للمستخدمين المجهولين (في Dev Early) ، لم أواجه أي مشاكل في استخدام ReportViewer. بمجرد تمكين Windows Auth ، سأحصل على "#error" على تجميع التعبيرات ، أو لا أكون قادرًا على تشغيل التقرير على الإطلاق ، مع إعطاء الاستثناء المذكور أعلاه.

تمكنت من العمل حول المشكلة ولكن مع إصدار معدّل قليلاً مما نشره أرتيم. لست متأكدًا تمامًا من ما يفعله الرمز بخلاف الإحساس العام بأنه يسمح لـ CAS بالثقة في رمز ReportViewer Sandboxed. أي تعليقات مع القليل من التفسير سيكون موضع تقدير.

    Dim permissions As PermissionSet = New PermissionSet(PermissionState.Unrestricted)
    myReportViewer.LocalReport.SetBasePermissionsForSandboxAppDomain(permissions)

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

System.Data.SqlClient.SqlClientPermission mPermission = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
try
{
    mPermission.Assert();
    //rest of your code
}
//Handle Exceptions

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top