Domanda

Sto usando il controllo ReportViewer da Visual Studio 2008 in modalità locale con oggetti come origine dati. Le mie classi sono associate a tabelle di dati nel mio database. Negli oggetti, carica gli oggetti correlati secondo necessità. Quindi lascia il riferimento null fino a quando non si tenta di utilizzare la proprietà, quindi tenta di caricarlo automaticamente dal database. Le classi utilizzano lo spazio dei nomi System.Data.SqlClient.

Quando interagisco con gli oggetti nella mia applicazione Windows Form, tutto funziona come previsto. Ma quando passo l'oggetto da utilizzare come Origine dati report e tenta di caricare automaticamente l'oggetto correlato, non riesce. Il codice crea un oggetto SqlConnection e quando chiamo GetCommand () su di esso, viene generata la seguente eccezione:

[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

Ho provato a cercare l'errore, ma tutti i risultati visualizzati sono per gli assembly CLR in esecuzione su SQL Server o ASP.Net. Ho provato ad aggiungere la seguente chiamata nel mio codice (come suggerito nei risultati della ricerca) prima di creare gli oggetti SqlConnection, ma apparentemente non ha fatto nulla:

System.Data.SqlClient.SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

Qualche idea?

È stato utile?

Soluzione 2

Ho trovato la soluzione. Si specifica System.Security.Policy.Evidence dell'esecuzione dell'assembly (o di uno che dispone di diritti sufficienti) su LocalReport per l'uso durante l'esecuzione.

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

Altri suggerimenti

Oltre alla risposta di CuppM. Il metodo ExecuteReportInCurrentAppDomain è obsoleto dal .NET4 e invece dovrebbe essere utilizzato LocalReport.SetBasePermissionsForSandboxAppDomain , poiché ReportViewer è ora sempre eseguito nel dominio sandbox:

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

Vedi i dettagli qui .

Nel caso in cui qualcuno si imbatta in questo come ho fatto durante la ricerca di questo errore di autorizzazione. Ho riscontrato questo errore utilizzando una Applicazione Windows Form perché il cliente aveva collegato un collegamento al mio Exe applicazione sul suo computer con " \ COMPUTERNAME \ C $ \ Application.exe " anziché " C: \ Application.exe. " - Ciò ha causato l'errore di System.Security.Permission a causa dell'utilizzo non intranet della rete.

Vedi http://www.duelec.de/blog/?p=236 per ulteriori informazioni.

Una nota in calce alla risposta di Artem sopra ...

Ho riscontrato questo problema durante l'aggiunta dell'autenticazione di Windows alla mia app asp.net. Targeting Framework 4.5 e utilizzo dei componenti di reporting 11. Quando stavo consentendo agli utenti anonimi (agli inizi dello sviluppo) non ho avuto problemi con l'utilizzo di ReportViewer. Non appena avessi abilitato l'autenticazione di Windows, avrei ricevuto " # Error " su Raggruppare espressioni o non essere in grado di eseguire il rapporto, dando l'eccezione sopra elencata.

Sono stato in grado di aggirare il problema, ma con una versione leggermente modificata di ciò che Artem ha pubblicato. Non sono del tutto sicuro di cosa faccia il codice oltre a un senso generale che consente a CAS di fidarsi del codice ReportViewer in modalità sandbox. Qualsiasi commento con una piccola spiegazione sarebbe apprezzato.

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

Un breve pensiero, anche se questo non è un errore che ho visto, assicurati che il tuo Assert sia nello stesso metodo del codice che imposta l'origine dati della risorsa:

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

I permessi di autorizzazione non restano in sospeso a lungo, possono essere un problema di sicurezza, quindi è molto probabile che farli il più vicino possibile al codice che li necessita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top