处理 T4 模板时访问 HttpContext
我们有一个使用 T4 模板来渲染页面的 Web 应用程序。 页面可以包含简单的内容,例如文本等,但它们也可以包含定制的模块。 这些模块依赖于HttpContext.Current
。
但是,T4 模板是在与我的 Web 应用程序不同的线程/域中处理的。这就是为什么我无法在该过程中访问 HttpContext.Current 的原因。
我尝试向模块添加 HttpContext 的属性,该属性在模板的预处理中设置。这就引入了一个新问题; T4 引擎要求页面使用的所有类都是[Serialized]
。这没有问题,但 System.Web.HttpContext 类无法序列化。
System.Runtime.Serialization.SerializationException:类型 程序集 System.Web 中的 System.Web.HttpContext,版本=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
?
We have a web-application that uses T4 templates to render pages.
Pages can contain simple things like text etcetera, but they can also contain custom made modules.
These modules rely on the HttpContext.Current
.
However, the T4 Template is processed in a thread/domain different than my webapplication. And that’s why I cannot access the HttpContext.Current
in that process.
I tried to add a property for the HttpContext to the modules, which is set in the pre processing of the template. This introduces a new problem;
The T4 engine requires all classes used by the page to be [Serialized]
. This is no problem, except for the System.Web.HttpContext class which cannot be serialized.
System.Runtime.Serialization.SerializationException: The type
System.Web.HttpContext in assembly System.Web, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a is not marked
serializable.
So, in order to solve the SerializationExeption
we’d add [NonSerialized]
attribute to our property.
[NonSerialized]
protected HttpContext _context = null;
public HttpContext Context
{
get
{
return _context;
}
set
{
_context = value;
}
}
But by the time the template is deserialized and processed, the Context is null
ofcourse, so I get a NullReferenceException
in my module.
Is there a way I can access the current HttpContext
in code called from the template engine?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我也把这个问题发给了微软,有一个非常简单的解决方案。
在自定义的EngineHost中有一个函数
ProvideTemplatedAppDomain
。您必须确保您的引擎返回AppDomain.CurrentDomain
。这样,模板将在与您的网络请求相同的域中编译并运行。
I also send this question to Microsoft, and there is a very simple solution for it.
In the custom EngineHost there is a function
ProvideTemplatingAppDomain
. You have to make sure your Engine returnsAppDomain.CurrentDomain
.In this way, the template will be compiled and ran in the same domain as your webrequest.