2013-03-26 58 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>列表中。