1

当托管在运行 asp.net 4 的 IIS 中时,我们遇到以下代码问题:

        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 中托管时才会发生。

我们认为这是由于反射/代码访问权限(在搜索答案之后),但我们还没有找到正确的值集来使该代码能够工作。

有什么想法吗 ??谢谢,弗雷德

4

2 回答 2

2

仅当代码在完全信任下运行时,反映私有成员才有效。默认情况下,ASP .NET 以中等信任运行。

因此,您需要将您的应用程序配置为完全信任地运行才能使其正常工作。

如何执行此操作在这篇ASP .NET 信任级别文章中进行了说明,但基本上您必须将程序集添加到web.config 中元素<fullTrustAssemblies>下的列表中。<securityPolicy>

于 2013-03-26T19:14:35.993 回答
2

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

中等信任摘要

中等信任 Web 应用程序的主要限制是: ... ReflectionPermission 不可用。这意味着您不能使用反射。

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

如果您正在(反)序列化 DataSet,也许更好的主意是“手动”更改序列化 XML 中的“caseSensitiveAmbient”部分。

于 2013-03-26T19:11:37.540 回答