2012-02-15 6 views
1

T4テンプレートを使用してページをレンダリングするWebアプリケーションがあります。 ページにはテキストなどのような単純なものを含めることができますが、カスタムメイドのモジュールも含めることができます。 これらのモジュールはHttpContext.Currentに依存しています。T4テンプレートの処理中にHttpContextにアクセスする

しかし、T4テンプレートは、私のWebアプリケーションとは異なるスレッド/ドメインで処理されます。そのため、私はそのプロセスでHttpContext.Currentにアクセスできません。

テンプレートの前処理で設定されたモジュールにHttpContextのプロパティを追加しようとしました。これは新しい問題を引き起こす。 T4エンジンでは、ページで使用されるすべてのクラスが[Serialized]である必要があります。シリアライズできないSystem.Web.HttpContextクラスを除いて、これは問題ありません。

System.Runtime.Serialization.SerializationException:タイプアセンブリのSystem.Web、バージョン= 4.0.0.0で System.Web.HttpContext、 ニュートラル文化=、なPublicKeyToken = b03f5f7f11d50a3aは、シリアライズ をマークされていません。

ので、SerializationExeptionを解決するために、私たちは私たちの財産に[NonSerialized]属性を追加すると思います。

[NonSerialized] 
protected HttpContext _context = null; 
public HttpContext Context 
{ 
    get 
    { 
     return _context; 
    } 
    set 
    { 
     _context = value; 
    } 
} 

しかし、時間によってテンプレートがデシリアライズされ、処理され、コンテキストがofcourseのnullあるので、私は私のモジュールにNullReferenceExceptionを取得します。

テンプレートエンジンから呼び出されたコードで現在のHttpContextにアクセスする方法はありますか?

答えて

0

私もこの質問をマイクロソフトに送ってください。とても簡単な解決方法があります。

カスタムEngineHostには、機能ProvideTemplatingAppDomainがあります。あなたのエンジンはAppDomain.CurrentDomainを返すようにしなければなりません。

このようにして、テンプレートはコンパイルされ、Webレクエストと同じドメインで実行されます。

関連する問題