4

在 C# / .NET 4.0 中,我试图通过反射检索字段值:

var bar = foo.GetType()
  .GetField("_myField", BindingFlags.Instance | BindingFlags.NonPublic)
  .GetValue(foo)

我对这种情况感到有些困惑。返回的值为null,但该字段(通过调试器观察时)不为空。更令人费解的是,上面的代码适用于其他对象属性。

唯一奇怪的方面是两个标志,IsSecurityCritical但我什至不确定它是否与情况有关。IsSecuritySafeCriticaltrue

我以一个小的 HttpModule 结束了这种情况。

public class MyModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += BeginRequest;
    }

    void BeginRequest(object sender, EventArgs e)
    {
         var app = (HttpApplication)sender;

         var rawContent = typeof(HttpRequest)
                .GetField("_rawContent", BindingFlags.Instance | BindingFlags.NonPublic)
                .GetValue(app.Request);

         // at this point 'rawContent' is null, while debugger indicates it is not.
    }
}

有什么建议可以解释这种行为吗?

4

1 回答 1

5

这是由 .net 4.0 中的安全模型引起的,因为您正在运行一个可能没有完全信任运行的 asp.net 应用程序。由于该字段对安全性至关重要,因此您无法通过反射访问它。

您可以在 msdn 上阅读一些关于:反射的安全注意事项

于 2010-12-14T18:07:00.130 回答