Я работал над проектом, который имеет общие функциональные возможности, в частности, я хотел поделиться мастер-файлом и связанными изображениями / 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?
ОБНОВЛЕНИЕ 11/20/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>
ОБНОВЛЕНИЕ 11/21/2011
Просто чтобы подтвердить мое подозрение, что VirtualPathProvider действительно работал, я закомментировал третью строку (mi.Invoke(....
) и повторно развернул сайт. Как я и подозревал, теперь он ломается из-за невозможности найти файл MasterPage. Эта проблема, по-видимому, связана только со статическими файлами, доставляемыми через VPP.