6

我在本地模式下使用 Visual Studio 2008 中的 ReportViewer 控件,并将对象作为数据源。我的类被映射到我的数据库中的数据表。在对象中,它根据需要加载相关对象。因此,在您尝试使用该属性之前,它会保留引用为空,然后它会尝试自动从数据库中加载它。这些类使用 System.Data.SqlClient 命名空间。

当我与 Windows 窗体应用程序中的对象交互时,一切都按预期工作。但是当我传递要用作报表数据源的对象并尝试自动加载相关对象时,它会失败。该代码创建了一个 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

我尝试搜索错误,但显示的所有结果都是针对在 SQL Server 或 ASP.Net 上运行的 CLR 程序集。在创建 SqlConnection 对象之前,我尝试在我的代码中添加以下调用(如搜索结果中所建议的那样),但它显然没有做任何事情:

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

有任何想法吗?

4

5 回答 5

7

除了 CuppM 的回答。该ExecuteReportInCurrentAppDomain方法自 .NET4 以来已弃用,LocalReport.SetBasePermissionsForSandboxAppDomain应改为使用,因为 ReportViewer 现在始终在沙盒域中执行:

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

在此处查看详细信息。

于 2011-05-24T05:19:56.123 回答
4

我找到了解决方案。您指定 System.Security.Policy.Evidence 执行程序集(或具有足够权限的程序集)到 LocalReport 以在执行期间使用。

reportViewer.LocalReport.ExecuteReportInCurrentAppDomain(System.Reflection.Assembly.GetExecutingAssembly().Evidence);
于 2008-11-26T18:25:05.767 回答
1

以防有人像我在搜索此权限错误时那样偶然发现此问题。我在使用Windows-Forms-Application时遇到了这个错误,因为客户在他的机器上使用“\COMPUTERNAME\C$\Application.exe”而不是“C:\Application.exe”将快捷方式链接到我的 Application-Exe。- 这导致了 System.Security.Permission 由于不受信任的 Intranet 使用而失败。

有关更多信息,请参见http://www.duelec.de/blog/?p=236

于 2009-01-26T13:31:36.940 回答
1

上面Artem答案的脚注......

将 Windows 身份验证添加到我的 asp.net 应用程序时遇到了这个问题。以 Framework 4.5 为目标并使用报告组件 11. 当我允许匿名用户(在早期开发中)时,我在使用 ReportViewer 时没有遇到任何问题。一旦启用 Windows 身份验证,我就会在分组表达式上得到“#Error”,或者根本无法运行报告,给出上面列出的异常。

我能够解决这个问题,但对 Artem 发布的内容进行了略微修改。除了一般意义上的允许 CAS 信任沙盒化的 ReportViewer 代码之外,我不完全确定代码的作用。任何带有一点解释的评论将不胜感激。

    Dim permissions As PermissionSet = New PermissionSet(PermissionState.Unrestricted)
    myReportViewer.LocalReport.SetBasePermissionsForSandboxAppDomain(permissions)
于 2014-01-02T15:18:08.530 回答
0

一个快速的想法,虽然这不是我见过的错误,但请确保您的 Assert 与设置资源数据源的代码使用相同的方法:

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

权限断言不会长期存在,它们可能是一个安全问题,因此尽可能靠近需要它们的代码最有可能工作。

于 2008-11-05T14:09:14.627 回答