Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理T4模板时访问HttpContext_C#_C# 4.0_T4_Template Engine_Httpcontext - Fatal编程技术网

C# 处理T4模板时访问HttpContext

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

我们有一个web应用程序,它使用T4模板呈现页面。 页面可以包含文本等简单的内容,但也可以包含定制的模块。 这些模块依赖于
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所在的域中编译和运行