質問

データソースとしてオブジェクトを使用して、ローカルモードで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の答えに加えて。 ExecuteReportInCurrentAppDomain メソッドは.NET4以降廃止され、代わりにReportViewerがサンドボックス化されたドメインで always 実行されるため、 LocalReport.SetBasePermissionsForSandboxAppDomain を代わりに使用する必要があります:

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

詳細は、こちらをご覧ください。

このPermission-Errorの検索中に私がやったように誰かがこれに出くわした場合に備えて。 Windows-Forms-Application を使用してこのエラーが発生しました。顧客が自分のマシンのApplication-Exeへのショートカットを" \ COMPUTERNAME \ C $ \ Application.exe"にリンクしていたためです。 " C:\ Application.exeの代わりに" -これにより、信頼されていないイントラネットの使用が原因でSystem.Security.Permissionが失敗しました。

http://www.duelec.de/blog/?p=236 <を参照/ a>詳細については。

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

Windows認証をasp.netアプリに追加するときにこの問題が発生しました。 Framework 4.5をターゲットにし、レポートコンポーネントを使用する11.匿名ユーザーを許可していたとき(初期の開発段階)、ReportViewerを使用しても問題はありませんでした。 Windows認証を有効にするとすぐに&quot;#Error&quot;が表示されます式をグループ化する場合、またはレポートをまったく実行できない場合、上記の例外が発生します。

この問題を回避することはできましたが、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

パーミッションアサーションは長く持ちこたえることはなく、セキュリティの問題になる可能性があるため、それらを必要とするコードのできるだけ近くでアサーションを実行することが最も有効です。

scroll top