处理T4模板时访问HttpContext
本文关键字:访问 HttpContext T4 处理 | 更新日期: 2023-09-27 18:24:48
我们有一个web应用程序,它使用T4模板来呈现页面。页面可以包含文本等简单内容,但也可以包含自定义模块。这些模块依赖于HttpContext.Current
。
但是,T4模板是在不同于我的web应用程序的线程/域中处理的。这就是为什么在这个过程中我不能访问HttpContext.Current
。
我尝试将HttpContext的属性添加到模块中,该属性是在模板的预处理中设置的。这带来了一个新问题;T4引擎要求页面使用的所有类都是[Serialized]
。这没有问题,除非System.Web.HttpContext类无法序列化。
System.Runtime.Serialization.Serialization异常:类型程序集System.Web中的System.Web.HttpContext,版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a未标记可序列化。
因此,为了求解SerializationExeption
,我们将[NonSerialized]
属性添加到我们的属性中。
[NonSerialized]
protected HttpContext _context = null;
public HttpContext Context
{
get
{
return _context;
}
set
{
_context = value;
}
}
但当模板被反序列化和处理时,上下文当然是null
,所以我在模块中得到了一个NullReferenceException
。
有没有一种方法可以访问从模板引擎调用的代码中的当前HttpContext
?
我也把这个问题发给了微软,有一个非常简单的解决方案
在自定义EngineHost中,有一个函数ProvideTemplatingAppDomain
。您必须确保您的引擎返回AppDomain.CurrentDomain
。
通过这种方式,模板将在与您的webrequest相同的域中编译和运行。