VirtualPathProvider не (совсем) работает в IIS 7.5.

Я работаю над проектом, который имеет общие функциональные возможности, в частности, я хотел поделиться мастер-файлом и соответствующими изображениями/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 доставляются только статические файлы.


person Ryan Wersal    schedule 17.11.2011    source источник


Ответы (3)


IIS 7.5 сам будет обрабатывать статические файлы. Вам нужно поместить строку для каждого статического файла, который вы хотите игнорировать, в файле web.config, чтобы они направлялись через ваш VPP. Примеры см. ниже.

<system.webServer>
    <handlers>
        <add name="Images" path="*.png" verb="GET,HEAD,POST" type="System.Web.StaticFileHandler" modules="ManagedPipelineHandler" resourceType="Unspecified" />
        <add name="Stylesheets" path="*.css" verb="GET,HEAD,POST" type="System.Web.StaticFileHandler" modules="ManagedPipelineHandler" resourceType="Unspecified" />
     </handlers>
 </system.webServer>
person Mad Pierre    schedule 22.11.2011
comment
Я попробую, как только выйду с работы. Кажется, это ответ из-за моих последних выводов (по крайней мере, все подходит). Спасибо за твою помощь! - person Ryan Wersal; 22.11.2011
comment
Большое спасибо за помощь. Меня это мучает уже пару недель! Я сталкивался с этим однажды раньше, но не учел, что IIS теперь сам доставляет статические файлы. Наслаждайтесь повторением 225! - person Ryan Wersal; 23.11.2011
comment
Если вы хотите немного расширить свой ответ, вам, вероятно, следует упомянуть, что вам понадобится один обработчик для каждого расширения. Кроме того, я не верю, что вам нужен глагол POST (не то чтобы он обязательно вызывал что-то плохое, но...). - person Ryan Wersal; 23.11.2011

Возможно, проблема в том, что запросы к статическим файлам не проходят через ASP.NET по умолчанию в IIS.

Попробуйте включить runAllManagedModulesForAllRequests в web.config. например

<modules runAllManagedModulesForAllRequests="true" />
person David Ebbo    schedule 19.11.2011
comment
К сожалению, нет кости на этом. Я попробовал и обновил свой вопрос, указав подробности попытки. Хотя спасибо за рекомендацию. - person Ryan Wersal; 21.11.2011

Взгляните на этот сообщение. В нем объясняется, как получить статические файлы через поставщика виртуального пути в IIS 7. Я считаю, что это решит вашу проблему.

person santiagoIT    schedule 22.11.2011