2010-06-16 14 views
42

Tengo una clase que hereda de Exception. En .NET 4, empecé a recibir un error de ejecución:Se han infringido las reglas de seguridad de herencia mientras se anuló el miembro - SecurityRuleSet.Level2

Inheritance security rules violated while overriding member: MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.

Creo que el problema es causado por el hecho de que estoy preponderantes con GetObjectData.

Yo sé una respuesta para la solución del problema consiste en establecer el SecurityRuleSet:

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

Ésta no es una respuesta aceptable, me gustaría saber cómo solucionar el problema sin tener que relajar la seguridad predeterminado Reglas en .NET 4.

Respuesta

32

Marca GetObjectData con SecurityCriticalAttribute, porque se aplica a Exception.GetObjectData. Un miembro anulado debe tener la misma accesibilidad de seguridad (crítica, segura, crítica o transparente).

Lea Security Changes in the .NET Framework 4 y Security Transparent Code, Level 2 de MSDN para obtener más información.

Para evitar todas las posibles excepciones de tiempo de ejecución de seguridad, habilite el Análisis de código con el conjunto de reglas de seguridad. Obtendrá advertencias de análisis estático que podrían corresponder a errores de tiempo de ejecución.

+3

Genial, eso funcionó! De hecho, lo había intentado, pero apliqué el atributo en el nivel de clase en lugar de en el nivel de miembro. –

+1

Estoy tratando de hacer esto en InitializeLifeTimeService y no quiere funcionar, obtiene el mismo error. – adriaanp

+0

¿Cómo hago eso? ¿Puedes mostrar un código? – brainmurphy1

11

En relación con este error en entornos de alojamiento compartido que permiten aplicaciones de plena confianza. Cuando bin despliega una aplicación, a menudo sobrescribe web.config. Bajo IIS, cuando se cambia la configuración de confianza a algo diferente de la predeterminada, su sección de web.config se modifica con:

<system.web> 
    <trust level="Full" /> 
<system.web> 

Copia de una nueva web.config durante el despliegue menudo sobrescribe esta configuración, sin embargo de administración de IIS seguirá mostrando el sitio como "Confianza total", cuando en realidad el sitio se ejecuta en cualquier nivel de confianza predeterminado para su proveedor de host compartido (generalmente medio).

Verá este error y hará lo que hice: intente averiguar por qué lo verá aunque sepa que el sitio se está ejecutando con plena confianza, cuando en realidad no es así. La solución es modificar su configuración web como se indicó anteriormente antes de la implementación, o usar el Administrador de IIS para configurar el sitio a un nivel de confianza diferente (alto, por ejemplo), aplicarlo y luego volver a configurarlo por completo. Al hacerlo, se reinserta la información de archivo de configuración necesaria y se reinicia el grupo de aplicaciones con plena confianza.

17

tenido este problema cuando yo estaba llamando a una asamblea que tenían atributo AllowPartiallyTrustedCallers:

[assembly: System.Security.AllowPartiallyTrustedCallers] 

Extracción resolvió mi problema sin cambiar a SecurityRuleSet.Level1.

+0

Esta fue una solución rápida y sucia para compilar la fuente de DevExpress. –

+4

Esto se incluirá en AssemblyInfo.cs, al menos fue para mí. Deshacerse de él también lo resolvió para mí. –

1

Para mí, el problema era con la biblioteca log4net. Descargué la fuente y agregué el archivo del proyecto a mi solución para poder acceder a bibliotecas externas. Sin embargo, log4net necesitaba el símbolo NET_4_0 definido para la compilación condicional. Por defecto, tenía NET_1_0 definido. Fui a las propiedades del proyecto log4net y cambié NET_1_0 al NET_4_0, y esto solucionó el problema.

Aparte: Quizás no sigo las mejores prácticas al incluir las bibliotecas en mi proyecto. Si ese es el caso, me gustaría recibir comentarios sobre las diferentes formas de hacerlo, y los pros y contras de cada opción.Mi opinión actual es que, si hay un error, poder ver la fuente de la biblioteca me ayudará a comprender qué espera la biblioteca, lo que me ayudará a aclarar el error. Además, ver cómo otras personas escriben el código fuente no es nada sino una valiosa experiencia de aprendizaje. Básicamente, estoy tratando de seguir el consejo de Jeff Atwood encontrado here. Pero si hay una mejor manera de lograr esto, soy todo oídos.

Cuestiones relacionadas