Pregunta

Tengo una extensión de entrega se ejecuta dentro de Servicio de informe de 2008.

Se ha estado funcionando muy bien desde hace mucho tiempo. Pero ahora quiero hacer una inserción en una base de datos desde la extensión.

En primer error llegué, era la siguiente:

Exception: System.Security.SecurityException Exception Message: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. Stacktrace:    at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   at System.Security.PermissionSet.Demand()
   at System.Data.Common.DbConnectionOptions.DemandPermission()
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()

Luego añadió, antes de que mi código que abre la conexión y hace la inserción:

SqlClientPermission sqlPermission = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
sqlPermission.Assert();

A continuación, el mensaje de error cambia a esto:

Exception: System.Security.SecurityException Exception Message: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. Stacktrace:    at System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 unrestrictedOverride, Int32 create)
   at System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark)
   at System.Security.CodeAccessPermission.Assert()

Entonces añadió la siguiente línea:

SecurityPermission permission = new SecurityPermission(PermissionState.Unrestricted);
permission.Assert();

Y ahora el error que consigo es la siguiente:

Exception: System.Security.SecurityException Exception Message: Stack walk modifier must be reverted before another modification of the same type can be performed. Stacktrace:    at System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark)
   at System.Security.CodeAccessPermission.Assert()

Mi código que contiene el código específico SqlConnection real se encuentra en una referencia de montaje de la extensión de entrega. El código de autorización específica estaba dentro de ese conjunto, pero traté de llevarla a la extensión de entrega de montaje -. Wothout pero un poco de suerte

¿Fue útil?

Solución

En el punto donde se intenta modificar los permisos de acceso es posible que ya lo han heredado de nivel superior, o tal vez lo habría hecho algún lugar antes del punto que se encuentre.

Por ejemplo, tenemos un código como este:

SqlClientPermission sqlClientPermission = new SqlClientPermission(PermissionState.Unrestricted);
sqlClientPermission.Assert();

SecurityPermission securityPermission = new SecurityPermission(PermissionState.Unrestricted);
securityPermission.Assert();

tendrá la excepción como la suya.

Otros consejos

user407428 es correcta, tratando de permitir que dos modificadores diferentes es lo que está causando el problema. La mejor principio es permitir que el permiso para que la parte del código que lo requiera, y luego para desactivar los epílogos de permisos. De manera que cuando se necesita el siguiente permiso puede modificar los derechos de nuevo.

SqlClientPermission sqlClientPermission = new SqlClientPermission(PermissionState.Unrestricted);
sqlClientPermission.Assert();

   //<your code that requires SqlClientPermission here>

CodeAccessPermission.RevertAccess();

SecurityPermission securityPermission = new SecurityPermission(PermissionState.Unrestricted);
securityPermission.Assert();

Algunas más cosas a tener en cuenta es que en su mayoría no se requiere para mantener un objeto a la pila a pie, por lo que la aserción puede ser simplificado a una sola línea, la IE.

System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

Si ha modificado la pila-paseo en un método de encapsulación, la pila interna haría probablemente no podrá modificar los modificadores de nuevo. Ej.

public void UseSecurityPermission()
{
    CodeAccessPermission.RevertAssert();
    new System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

    <Some code that requires the SecurityPermission>
}

static void Main(string[] args)
{
    new System.Security.Permissions.FileIOPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
    //< Some code that requires IOPermission>
    UseSecurityPermission();
}   

A pesar de que UseSecurityPermission () vuelve el permiso pila-paseo, no funcionaría, ya que el compilador no puede obtener el descriptor de seguridad en el contexto.

Algunos lectura adicional: con Stack-Walk Modificadores

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top