6

Tôi đang sử dụng điều khiển ReportViewer từ Visual Studio 2008 trong Chế độ cục bộ với các đối tượng làm nguồn dữ liệu. Các lớp của tôi được ánh xạ tới các bảng dữ liệu trong cơ sở dữ liệu của tôi. Trong các đối tượng, nó tải các đối tượng liên quan khi cần thiết. Vì vậy, nó để lại null tham chiếu cho đến khi bạn cố gắng sử dụng thuộc tính, sau đó nó cố gắng tải nó từ cơ sở dữ liệu tự động. Các lớp sử dụng không gian tên System.Data.SqlClient.Trình xem báo cáo - Yêu cầu cho phép loại SqlClientPermission không thành công

Khi tôi tương tác với các đối tượng trong ứng dụng Windows Forms, mọi thứ hoạt động như mong đợi. Nhưng khi tôi vượt qua các đối tượng được sử dụng như một nguồn dữ liệu báo cáo và nó cố gắng để tự động tải các đối tượng liên quan, nó không thành công. Mã này tạo ra một đối tượng SqlConnection và khi tôi gọi GetCommand() trên đó, các ngoại lệ sau đây được ném:

[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 

tôi đã cố gắng tìm kiếm các lỗi, nhưng tất cả các kết quả mà hiển thị là dành cho hội CLR chạy trên một máy chủ SQL hoặc ASP.Net. Tôi đã thử thêm cuộc gọi sau vào mã của tôi (như được đề xuất trong kết quả tìm kiếm) trước khi tạo đối tượng SqlConnection, nhưng nó không rõ ràng:

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

Bất kỳ ý tưởng nào?

Trả lời

4

Tôi đã tìm thấy giải pháp. Bạn chỉ định System.Security.Policy.Evidence của bạn thực thi assembly (hoặc một cái có đủ quyền) cho LocalReport để sử dụng trong khi thực hiện.

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

Một suy nghĩ nhanh chóng, mặc dù đây không phải là một lỗi tôi đã nhìn thấy, chắc chắn rằng Khẳng định bạn đang ở trong cùng một phương pháp như mã được thiết lập nguồn dữ liệu tài nguyên:

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

Permission Khẳng định không treo xung quanh lâu dài, chúng có thể là vấn đề bảo mật, vì vậy hãy thực hiện chúng càng gần càng tốt với mã cần chúng có nhiều khả năng hoạt động.

1

Chỉ trong trường hợp ai đó tình cờ gặp phải điều này như tôi đã làm khi tìm kiếm Lỗi-Quyền này. Tôi gặp phải lỗi này bằng cách sử dụng Windows-Forms-Application vì khách hàng đã liên kết lối tắt đến ứng dụng-Exe của tôi trên máy tính của mình với "\ COMPUTERNAME \ C $ \ Application.exe" thay vì "C: \ Application.exe . " - Điều này gây ra sự thất bại của System.Security.Permission vì việc sử dụng mạng nội bộ không đáng tin cậy.

Xem http://www.duelec.de/blog/?p=236 để biết thêm thông tin.

7

Ngoài câu trả lời của CuppM. Phương pháp ExecuteReportInCurrentAppDomain bị phản đối từ .NET4, và LocalReport.SetBasePermissionsForSandboxAppDomain nên được sử dụng thay vào đó, như ReportViewer tại là luôn thực hiện trong phạm vi sandboxed:

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

Xem chi tiết here.

+0

Cảm ơn vì điều này. Tôi vừa trải qua 5 giờ xung quanh cố gắng tìm ra lý do tại sao báo cáo của tôi không hiển thị như mong đợi. Điều này đã khắc phục sự cố #Error của tôi. –

+0

điều này không thực hiện bất kỳ sự khác biệt, chỉ có điều đó hoạt động được thêm nó trên web.config, mà tôi không được phép làm. – montelof

1

Một chú thích cho câu trả lời của Artem ở trên ...

Tôi gặp sự cố này khi thêm Xác thực Windows vào ứng dụng asp.net của mình. Nhắm mục tiêu Framework 4.5 và sử dụng các thành phần báo cáo 11. Khi tôi đã cho phép người dùng nặc danh (trong dev đầu) tôi không gặp vấn đề gì khi sử dụng ReportViewer. Ngay sau khi tôi bật Windows auth, tôi sẽ nhận được "#Error" trên biểu thức Nhóm, hoặc không thể chạy báo cáo chút nào, đưa ra ngoại lệ được liệt kê ở trên.

Tôi đã có thể giải quyết được vấn đề nhưng với phiên bản được sửa đổi một chút về những gì Artem đã đăng. Tôi không hoàn toàn chắc chắn những gì các mã không khác với một ý nghĩa chung rằng nó cho phép CAS để tin tưởng mã ReportViewer sandboxed. Bất kỳ ý kiến ​​với một lời giải thích nhỏ sẽ được đánh giá cao.

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

Đây là những gì mã của tôi là thực sự sử dụng bây giờ thay vì cách tiếp cận hạt mịn hơn sử dụng Artem. Ngoại trừ một tuyên bố duy nhất. – CuppM

Các vấn đề liên quan