6

オブジェクトをデータ ソースとしてローカル モードで 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();

何か案は?

4

5 に答える 5

7

CuppMの回答に加えて。ReportViewer は常にサンドボックス化されたドメインで実行されるようになったため、このExecuteReportInCurrentAppDomainメソッドは .NET4 以降非推奨であり、代わりに使用する必要があります。LocalReport.SetBasePermissionsForSandboxAppDomain

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

私は解決策を見つけました。実行中に使用する LocalReport に対して、アセンブリを実行している System.Security.Policy.Evidence (または十分な権限を持つもの) を指定します。

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

このパーミッションエラーを検索しているときに私がしたように、誰かがこれに遭遇した場合に備えて。Windows-Forms-Applicationを使用すると、このエラーが発生しました。これは、顧客が自分のマシンのApplication-Exeへのショートカットを「C:\Application.exe」ではなく「\COMPUTERNAME \ C $\Application.exe」でリンクしたためです。-これにより、信頼できないイントラネットの使用が原因でSystem.Security.Permissionが失敗しました。

詳細については、 http://www.duelec.de/blog/?p=236を参照してください。

于 2009-01-26T13:31:36.940 に答える
1

上記のArtemの回答への脚注...

Windows 認証を asp.net アプリに追加するときに、この問題が発生しました。Framework 4.5 を対象とし、Reporting コンポーネントを使用する 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 に答える