报告查看器 - 请求SqlClientPermission类型的权限失败

时间:2008-11-04 21:46:44

标签: c# winforms visual-studio-2008 reporting-services sqlclient

我在本地模式下使用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();

有什么想法吗?

5 个答案:

答案 0 :(得分:7)

除了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);

详见here

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

有关详细信息,请参阅http://www.duelec.de/blog/?p=236

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)

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

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

权限断言不会长时间停留,它们可能是一个安全问题,因此尽可能接近需要它们的代码最有可能工作。