6

Uso el control ReportViewer de Visual Studio 2008 en modo local con objetos como fuente de datos. Mis clases están mapeadas en tablas de datos en mi base de datos. En los objetos, carga objetos relacionados según sea necesario. Por lo tanto, deja la referencia nula hasta que intente utilizar la propiedad, luego intenta cargarla desde la base de datos automáticamente. Las clases usan el espacio de nombres System.Data.SqlClient.Visor de informes: solicitud del permiso de tipo SqlClientPermission failed

Cuando interactúo con los objetos en mi aplicación Windows Forms, todo funciona como se esperaba. Pero cuando paso el objeto que se utilizará como Fuente de datos de informe e intenta cargar automáticamente el objeto relacionado, falla. El código crea un objeto SqlConnection y cuando llamo GetCommand() sobre ella, la excepción siguiente:

[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 

He intentado buscar el error, pero todos los resultados que se muestran son para conjuntos CLR se ejecutan en un servidor SQL o ASP.Net. He intentado añadir la siguiente llamada en mi código (como se sugiere en los resultados de búsqueda) antes de crear los objetos SqlConnection, pero al parecer no hacer nada:

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

¿Alguna idea?

Respuesta

4

He encontrado la solución. Especifique System.Security.Policy.Evidence del ensamblado que está ejecutando (o uno que tenga suficientes derechos) en el informe local para usarlo durante la ejecución.

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

Un pensamiento rápido, aunque esto no es un error que he visto, asegúrese de que su aserción se encuentra en el mismo método que el código que está estableciendo la fuente de datos de recursos:

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

Permiso Asserts no permanezcan por mucho tiempo, pueden ser un problema de seguridad, por lo que es más probable que funcionen lo más cerca posible del código que los necesita.

1

Solo en caso de que alguien se tropiece con esto como lo hice mientras buscaba este permiso de error. Recibí este error al usar Windows-Forms-Application porque el cliente había vinculado un acceso directo a mi Application-Exe en su máquina con "\ COMPUTERNAME \ C $ \ Application.exe" en lugar de "C: \ Application.exe " - Esto causó la falla de System.Security.Permission debido al uso de la intranet que no es de confianza.

Ver http://www.duelec.de/blog/?p=236 para obtener más información.

7

Además de la respuesta de CuppM. El método ExecuteReportInCurrentAppDomain está obsoleta desde .NET4 y LocalReport.SetBasePermissionsForSandboxAppDomain se debe utilizar en su lugar, como ReportViewer es ahora siempre ejecutado en un recinto de seguridad de dominio:

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

Ver detalles here.

+0

Gracias por esto. Acabo de pasar 5 horas dando vueltas tratando de descubrir por qué mi informe no se mostraba como se esperaba. Esto solucionó mi problema de #Error. –

+0

esto no hace ninguna diferencia, lo único que funciona es agregarlo en el web.config, que no tengo permitido hacer. – montelof

1

Una nota al pie de la respuesta de Artem arriba ...

he tenido este problema al agregar autenticación de Windows para mi aplicación asp.net. Targeting Framework 4.5 y uso de los componentes de Informes 11. Cuando permitía usuarios anónimos (en el primer desarrollador) no tuve problemas para usar ReportViewer. Tan pronto como habilité la autenticación de Windows obtendría "#Error" en expresiones de agrupamiento, o no podría ejecutar el informe en absoluto, con la excepción mencionada anteriormente.

Pude solucionar el problema pero con una versión ligeramente modificada de lo que Artem publicó. No estoy completamente seguro de qué es lo que hace el código, además de la sensación general de que permite que CAS confíe en el código de Sandboxed ReportViewer. Cualquier comentario con una pequeña explicación sería apreciado.

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

Esto es lo que mi código está usando actualmente en lugar del enfoque de grano más fino que usa Artem. Excepto como una sola declaración. – CuppM

Cuestiones relacionadas