1

Nous avons un problème lors de l'utilisation de NHibernate avec Remoting dans une machine avec un environnement de confiance totale (en fait, c'est notre machine dev). Le problème se produit lorsque vous essayez d'envoyer en tant que paramètre un objet précédemment récupéré du serveur, qui contient un proxy NHibernate dans l'une des propriétés (une paresseuse). Comme nous sommes dans la machine dev, il n'y a aucune restriction dans le niveau de confiance de l'application web (elle est définie sur Full) et, en plus, nous avons configuré les assemblages de NHibernate et de Castle pour avoir une confiance totale dans CAS (même penser qu'il ne serait pas nécessaire que l'application à distance dans IIS a le niveau de confiance complet).NHibernate + Remoting = Exception ReflectionPermission

Est-ce que quelqu'un a une idée de ce qui peut causer cette exception? Stack trace ci-dessous.

InnerException: System.Security.SecurityException 
    Message="Falha na solicitação da permissão de tipo 'System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'." 
    Source="mscorlib" 
    GrantedSet="" 
    PermissionState="<IPermission class=\"System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nFlags=\"ReflectionEmit\"/>\r\n" 
    RefusedSet="" 
    Url="" 
    StackTrace: 
     em System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) 
     em System.Security.CodeAccessPermission.Demand() 
     em System.Reflection.Emit.AssemblyBuilder.DefineDynamicModuleInternalNoLock(String name, Boolean emitSymbolInfo, StackCrawlMark& stackMark) 
     em System.Reflection.Emit.AssemblyBuilder.DefineDynamicModuleInternal(String name, Boolean emitSymbolInfo, StackCrawlMark& stackMark) 
     em System.Reflection.Emit.AssemblyBuilder.DefineDynamicModule(String name, Boolean emitSymbolInfo) 
     em Castle.DynamicProxy.ModuleScope.CreateModule(Boolean signStrongName) 
     em Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithWeakName() 
     em Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(Boolean isStrongNamed) 
     em Castle.DynamicProxy.Generators.Emitters.ClassEmitter.CreateTypeBuilder(ModuleScope modulescope, String name, Type baseType, Type[] interfaces, TypeAttributes flags, Boolean forceUnsigned) 
     em Castle.DynamicProxy.Generators.Emitters.ClassEmitter..ctor(ModuleScope modulescope, String name, Type baseType, Type[] interfaces, TypeAttributes flags, Boolean forceUnsigned) 
     em Castle.DynamicProxy.Generators.Emitters.ClassEmitter..ctor(ModuleScope modulescope, String name, Type baseType, Type[] interfaces, TypeAttributes flags) 
     em Castle.DynamicProxy.Generators.Emitters.ClassEmitter..ctor(ModuleScope modulescope, String name, Type baseType, Type[] interfaces) 
     em Castle.DynamicProxy.Generators.BaseProxyGenerator.BuildClassEmitter(String typeName, Type parentType, Type[] interfaces) 
     em Castle.DynamicProxy.Generators.BaseProxyGenerator.BuildClassEmitter(String typeName, Type parentType, IList interfaceList) 
     em Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode(Type[] interfaces, ProxyGenerationOptions options) 
     em Castle.DynamicProxy.Serialization.ProxyObjectReference.RecreateClassProxy() 
     em Castle.DynamicProxy.Serialization.ProxyObjectReference.RecreateProxy() 
     em Castle.DynamicProxy.Serialization.ProxyObjectReference..ctor(SerializationInfo info, StreamingContext context) 

Merci d'avance.

Répondre

2

En fait, je travaille avec Pedro, nous avons trouvé le problème: le sérialiseur du service Remoting doit être explicitement configuré pour permettre des appels de confiance complets du côté serveur.

Quelque chose comme (fichier de configuration):

<channels> 
<channel ref="http"> 
<serverProviders> 
<provider ref="wsdl" /> 
<formatter ref="soap" typeFilterLevel=Low /> 
<formatter ref="binary" typeFilterLevel=Low /> 
</serverProviders> 
</channel> 
</channels> 

Or (programatically):

BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider(); 
provider.TypeFilterLevel = TypeFilterLevel.Full; 

Hope this helps quelqu'un d'autre.

Cordialement.