处理 T4 模板时访问 HttpContext

发布于 2025-01-06 01:35:05 字数 999 浏览 0 评论 0原文

我们有一个使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

铁憨憨 2025-01-13 01:35:05

我也把这个问题发给了微软,有一个非常简单的解决方案。

在自定义的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 returns AppDomain.CurrentDomain.

In this way, the template will be compiled and ran in the same domain as your webrequest.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文