C# 处理T4模板时访问HttpContext
我们有一个web应用程序,它使用T4模板呈现页面。 页面可以包含文本等简单的内容,但也可以包含定制的模块。 这些模块依赖于C# 处理T4模板时访问HttpContext,c#,c#-4.0,t4,template-engine,httpcontext,C#,C# 4.0,T4,Template Engine,Httpcontext,我们有一个web应用程序,它使用T4模板呈现页面。 页面可以包含文本等简单的内容,但也可以包含定制的模块。 这些模块依赖于HttpContext.Current 但是,T4模板是在不同于我的Web应用程序的线程/域中处理的。这就是为什么在这个过程中我无法访问HttpContext.Current 我尝试将HttpContext的属性添加到模块中,该属性是在模板的预处理中设置的。这带来了一个新问题; T4引擎要求页面使用的所有类都[序列化]。这没有问题,除了无法序列化的System.Web.Htt
HttpContext.Current
但是,T4模板是在不同于我的Web应用程序的线程/域中处理的。这就是为什么在这个过程中我无法访问HttpContext.Current
我尝试将HttpContext的属性添加到模块中,该属性是在模板的预处理中设置的。这带来了一个新问题;
T4引擎要求页面使用的所有类都[序列化]
。这没有问题,除了无法序列化的System.Web.HttpContext类之外
System.Runtime.Serialization.SerializationException:类型
程序集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
?我还将此问题发送给Microsoft,并且有一个非常简单的解决方案
在自定义EngineHost中有一个函数providedTemplatengAppDomain
。您必须确保引擎返回AppDomain.CurrentDomain
这样,模板将在webrequest所在的域中编译和运行