Я работаю над проектом, который имеет общие функциональные возможности, в частности, я хотел поделиться мастер-файлом и соответствующими изображениями/js/etc. С этой целью главная страница и ее зависимые файлы помещаются в «глобальную» библиотеку DLL, которая используется всеми «подпроектами». Все это отлично работало при разработке, но развертывание преподнесло сюрприз, который, кажется, застал многих людей врасплох: VirtualPathProvider
не работает в предварительно скомпилированном виде.
Благодаря этой записи в блоге, содержащей обходной путь, я смог дать еще одну попытку заставить его работать. К сожалению, до сих пор нет.
Я решил избавиться от своей реализации Global.asax
и применил подход AppInitialize
, описанный в блоге:
public static class AppStart
{
public static void AppInitialize()
{
HostingEnvironment hostingEnvironmentInstance = (HostingEnvironment)typeof(HostingEnvironment).InvokeMember("_theHostingEnvironment", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null);
MethodInfo mi = typeof(HostingEnvironment).GetMethod("RegisterVirtualPathProviderInternal", BindingFlags.NonPublic | BindingFlags.Static);
mi.Invoke(hostingEnvironmentInstance, new object[] { new MasterPageProvider() });
}
}
Поскольку фактический провайдер работает в режиме отладки, я не буду его включать. Если вы хотите увидеть это, не стесняйтесь спрашивать. Просто хотел, чтобы вопрос был как можно короче.
Интересным аспектом всей этой ситуации является то, что производство не выдает ошибок, связанных с невозможностью найти главную страницу. Для меня это означает, что провайдер работает, но по какой-то причине остальные ресурсы (js/css/etc) не извлекаются из сборки должным образом.
Итак, мой вопрос сводится к следующему: по каким причинам это решение будет отлично работать в разработке, но не в рабочей среде IIS 7.5?
ОБНОВЛЕНИЕ 20.11.2011
Попробовал предложение Дэвида Эббо и, к сожалению, не дал никаких результатов. Моя веб-конфигурация выглядит примерно так:
<configuration>
<connectionStrings>
<clear />
<!-- ... -->
</connectionStrings>
<system.web>
<pages>
<controls>
<!-- ... -->
</controls>
</pages>
<compilation debug="true" targetFramework="4.0" />
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
ОБНОВЛЕНИЕ 21.11.2011
Просто чтобы проверить свое подозрение, что VirtualPathProvider действительно работает, я закомментировал третью строку (mi.Invoke(....
) и повторно развернул сайт. Как я и подозревал, теперь он ломается из-за невозможности найти файл MasterPage. Эта проблема связана с тем, что через VPP доставляются только статические файлы.