Доступ к HttpContext при обработке шаблона T4 - PullRequest
1 голос
/ 15 февраля 2012

У нас есть веб-приложение, которое использует шаблоны T4 для рендеринга страниц. Страницы могут содержать простые вещи, такие как текст и так далее, но они также могут содержать пользовательские модули. Эти модули полагаются на HttpContext.Current.

Однако шаблон T4 обрабатывается в потоке / домене, отличном от моего веб-приложения. И именно поэтому я не могу получить доступ к HttpContext.Current в этом процессе.

Я попытался добавить свойство для HttpContext для модулей, которое устанавливается при предварительной обработке шаблона. Это вводит новую проблему; Движок T4 требует, чтобы все классы, используемые страницей, были [Serialized]. Это не проблема, за исключением класса System.Web.HttpContext, который нельзя сериализовать.

System.Runtime.Serialization.SerializationException: тип System.Web.HttpContext в сборке System.Web, версия = 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 в коде, вызываемом из механизма шаблонов?

1 Ответ

0 голосов
/ 23 февраля 2012

Я также отправляю этот вопрос в Microsoft, и для него есть очень простое решение.

В кастомном EngineHost есть функция ProvideTemplatingAppDomain. Вы должны убедиться, что ваш двигатель возвращается AppDomain.CurrentDomain.

Таким образом, шаблон будет скомпилирован и запущен в том же домене, что и ваш веб-запрос.

...