我们有一个使用T4模板呈现页面的Web应用程序。
页面可以包含文本等简单的东西,但它们也可以包含自定义模块。
这些模块依赖于HttpContext.Current
。
但是,T4模板是在与我的webapplication不同的线程/域中处理的。这就是我无法在该过程中访问HttpContext.Current
的原因。
我尝试将HttpContext的属性添加到模块中,该模块在模板的预处理中设置。这引入了一个新问题;
T4引擎要求页面使用的所有类都为[Serialized]
。这是没有问题的,除了无法序列化的System.Web.HttpContext类。
System.Runtime.Serialization.SerializationException:类型 程序集System.Web中的System.Web.HttpContext,Version = 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
?
答案 0 :(得分:0)
我也将此问题发送给Microsoft,并且有一个非常简单的解决方案。
在自定义EngineHost中有一个函数ProvideTemplatingAppDomain
。您必须确保您的引擎返回AppDomain.CurrentDomain
。
通过这种方式,模板将被编译并在与webrequest相同的域中运行。