在处理T4模板时访问HttpContext

时间:2012-02-15 15:32:53

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

我们有一个使用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

1 个答案:

答案 0 :(得分:0)

我也将此问题发送给Microsoft,并且有一个非常简单的解决方案。

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

通过这种方式,模板将被编译并在与webrequest相同的域中运行。