【问题标题】:Accessing HttpContext while processing a T4 Template在处理 T4 模板时访问 HttpContext
【发布时间】:2012-02-15 15:32:52
【问题描述】:

我们有一个使用 T4 模板来呈现页面的 Web 应用程序。 页面可以包含简单的内容,例如文本等,但它们也可以包含定制的模块。 这些模块依赖于HttpContext.Current

但是,T4 模板是在与我的 web 应用程序不同的线程/域中处理的。这就是为什么我无法在该过程中访问HttpContext.Current

我尝试将 HttpContext 的属性添加到模块中,该属性是在模板的预处理中设置的。这引入了一个新问题; T4 引擎要求页面使用的所有类都是[Serialized]。这个没问题,除了不能序列化的System.Web.HttpContext类。

System.Runtime.Serialization.SerializationException:类型 程序集 System.Web 中的 System.Web.HttpContext,版本=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 未标记 可序列化。

因此,为了解决 SerializationExeption 问题,我们将 [NonSerialized] 属性添加到我们的属性中。

[NonSerialized]
protected HttpContext _context = null;
public HttpContext Context
{
    get
    {
        return _context;
    }
    set
    {
        _context = value;
    }
}

但是当模板被反序列化和处理时,上下文当然是null,所以我在我的模块中得到一个NullReferenceException

有没有办法可以在从模板引擎调用的代码中访问当前的HttpContext

【问题讨论】:

    标签: c# c#-4.0 t4 template-engine httpcontext


    【解决方案1】:

    我也把这个问题发给微软,有一个非常简单的解决方案。

    在自定义EngineHost中有一个函数ProvideTemplatingAppDomain。你必须确保你的引擎返回AppDomain.CurrentDomain

    这样,模板将被编译并运行在与您的 webrequest 相同的域中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      相关资源
      最近更新 更多