2013-03-26 59 views
1

托管在IIS运行asp.net 4时,我们正与下面的代码有问题使用反射:异常与IIS ASP.NET 4.0和私人领域

 DataTable dt = new DataTable(); 
     FieldInfo TableCaseSensitiveAmbientFieldInfo = 
      typeof(DataTable).GetField("_caseSensitiveUserSet", BindingFlags.Instance | BindingFlags.NonPublic); 
     TableCaseSensitiveAmbientFieldInfo.SetValue(dt, true); 

的.SetValue()调用失败一个FieldAccessException(这个代码来自公共源代码文件名ADONetHelper.cs,它使用来自一个名为CompactFormatterPlus的公共源DLL)

这似乎只发生在IIS中托管时。

我们认为这是由于反射/代码访问权限(在搜索答案后),但我们没有找到正确的值集合来启用此代码。

任何想法?? 谢谢, 弗雷德

回答

2

默认情况下IIS 7.0中的应用程序运行在“中等信任”。默认情况下,使用Medium Trust禁用ReflectionPermission。

Medium Trust Summary

放在中等信任Web应用程序的主要制约因素有: ... 性ReflectionPermission不可用。 这意味着你不能使用反射。

但似乎DataTable.CaseSensitive Property有一个getter和setter。我会重申,如果可能的话,你尽量避免反思。例如,当您将来升级到另一个.NET框架时,私有方法可能会消失,您的应用程序将会中断。

如果您正在(de)序列化数据集,也许更好的想法是“手动”更改序列化XML中的“caseSensitiveAmbient”部分。

2

反映私人成员只有在代码完全信任下运行时才有效。 ASP .NET默认运行在中等信任。

因此,您需要配置您的应用程序以完全信任的方式运行。

如何做到这一点在ASP .NET Trust Levels文章中有解释,但基本上您必须将您的程序集添加到web.config中的<securityPolicy>元素下的<fullTrustAssemblies>列表中。