我在本地模式下使用Visual Studio 2008中的ReportViewer控件,其中对象作为数据源。我的类映射到数据库中的数据表。在对象中,它根据需要加载相关对象。因此,在您尝试使用该属性之前,它会将引用保留为null,然后它会尝试自动从数据库加载它。这些类使用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();

有什么想法吗?

有帮助吗?

解决方案 2

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

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

其他提示

除了CuppM的答案。 自.NET4起,不推荐使用 ExecuteReportInCurrentAppDomain 方法,而应使用 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);

详情请参阅此处

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

请参阅 http://www.duelec.de/blog/?p=236 了解更多信息。

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

将asp身份验证添加到我的asp.net应用程序时出现此问题。 Targeting Framework 4.5和使用报告组件11.当我允许匿名用户(在早期开发中)时,我使用ReportViewer没有任何问题。一旦我启用了Windows身份验证,我就会得到“#Error” on grouping表达式,或者根本不能运行报表,给出上面列出的例外。

我能够解决这个问题,但稍微修改了Artem发布的版本。我不完全确定代码的作用除了一般意义上它允许CAS信任沙盒的ReportViewer代码。任何有一点解释的评论都会受到赞赏。

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

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

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