我在本地模式下使用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();
有什么想法吗?
除了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);
请在此处查看详细信息。
我找到了解决方案。您为LocalReport指定了System.Security.Policy.执行程序集(或具有足够权限的程序集)的证据,以便在执行过程中使用。
reportViewer.LocalReport.ExecuteReportInCurrentAppDomain(System.Reflection.Assembly.GetExecutingAssembly().Evidence);
以防有人像我在搜索此权限错误时一样偶然发现此错误。我在使用Windows窗体应用程序时出现此错误,因为客户在其计算机上用"\COMPUTERNAME\C$\Application.Exe"而不是"C:\Application.Exe"链接了一个到我的Application Exe的快捷方式。-由于不受信任的intranet使用,这导致System.Security.Permission失败。
请参阅http://www.duelec.de/blog/?p=236了解更多信息。
上面Artem答案的脚注。。。
在将Windows身份验证添加到我的asp.net应用程序时,我遇到了这个问题。以框架4.5为目标并使用报告组件11。当我允许匿名用户(在早期开发中)时,我使用ReportViewer没有问题。一旦我启用Windows身份验证,我就会在分组表达式上得到"#Error",或者根本无法运行报告,出现上面列出的异常。
我能够解决这个问题,但对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
权限断言不会停留很长时间,它们可能是一个安全问题,因此尽可能靠近需要它们的代码进行操作最有可能奏效。