1

我們正在處理一個問題,當在具有完全信任環境的機器(實際上是我們的開發機器)中使用NHibernate和Remoting時。NHibernate + Remoting = ReflectionPermission異常

當嘗試發送一個先前從服務器檢索到的對象的參數時,會發生問題,該對象包含一個屬性(懶惰的屬性)中的NHibernate代理。

因爲我們在開發機器中,所以對web應用程序的信任級別沒有限制(它設置爲Full),並且我們還配置了NHibernate和Castle的程序集以完全信任CAS(甚至是認爲它不是必需的,因爲IIS中的遠程應用程序具有完全的信任級別)。

有沒有人有任何想法可以導致這種異常?下面的堆棧跟蹤。

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) 

在此先感謝您。

回答

2

實際上,我和佩德羅一起工作,我們發現問題:Remoting服務的序列化程序必須顯式配置爲允許服務器端的完全信任調用。

喜歡的東西(配置文件):

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

或(編程):

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

希望這有助於任何人。

問候。