我们有一个web应用程序,它使用T4模板来呈现页面。页面可以包含简单的东西,比如文本等等,但是它们也可以包含定制的模块。这些模块依赖于HttpContext.Current
。
但是,T4模板是在与我的the应用程序不同的线程/域中处理的。这就是为什么我不能在这个过程中访问HttpContext.Current
的原因。
我尝试将HttpContext的一个属性添加到模块中,这是在模板的预处理中设置的。这带来了一个新的问题: T4引擎要求页面使用的所有类都是[Serialized]
。这是没有问题的,除了不能序列化的System.Web.HttpContext类。
程序集System.Runtime.Serialization.SerializationException:、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b03f5f7f11d50a3a中的System.Web.HttpContext类型未标记为可序列化。
因此,为了解决SerializationExeption
,我们将[NonSerialized]
属性添加到属性中。
[NonSerialized]
protected HttpContext _context = null;
public HttpContext Context
{
get
{
return _context;
}
set
{
_context = value;
}
}
但是当模板被反序列化和处理时,上下文当然是null
,所以我在模块中得到了一个NullReferenceException
。
是否有一种方法可以访问从模板引擎调用的代码中的当前HttpContext
?
发布于 2012-02-23 02:19:54
我也把这个问题发送给微软,有一个非常简单的解决方案。
在自定义EngineHost中有一个函数ProvideTemplatingAppDomain
。您必须确保引擎返回AppDomain.CurrentDomain
。
这样,模板将被编译并在与您的way请求相同的域中运行。
https://stackoverflow.com/questions/9296240
复制