Проект веб-развертывания: публикация без предварительной компиляции - PullRequest
6 голосов
/ 07 августа 2009

Вопрос

Можно ли опубликовать проект веб-приложения, используя проект веб-развертывания без предварительной компиляции?

Примечания

Чтобы разделить веб-элементы управления и страницы на отдельную сборку, я использую пользовательский VirtualPathProvider для загрузки этих ресурсов. Я использую проекты веб-развертывания и msbuild в строке cmd для развертывания этих проектов.

Суть в том, что VirtualPathProviders не поддерживаются для скомпилированных приложений. Я нашел обходной путь для обычных файлов здесь . Однако это не работает для файлов приложений, таких как ascx и aspx страниц. Он выдает исключение в духе «файл не был предварительно скомпилирован и не может быть запрошен».

В результате я решил попытаться вообще отказаться от прекомпиляции и принять начальный удар по производительности запросов, поскольку трафик нашего сайта не особенно высок. Однако я не могу понять, как это сделать с помощью проектов веб-развертывания, которые уже очень встроены в наш процесс сборки.

[Обновить]

Я пытаюсь настроить файл Microsoft.WebDeployment.targets для достижения этой цели, но мне пока не повезло.

[Обновить]

Изучая файл Microsoft.WebDeployment.targets, я обнаружил, что не существует простого способа отделения проектов веб-развертывания от предварительной компиляции веб-приложения. На самом деле, я не уверен, что в этом есть необходимость. Вместо этого я использую что-то вроде следующего фрагмента. Я просто поместил его в файл проекта с условием attr, чтобы он не развертывался для сборок Debug.

<Target Name="AfterBuild">
    <!-- clean output dir -->
    <CreateItem Include="$(output)**\*.*">
        <Output TaskParameter="Include" ItemName="OldFiles"/>
    </CreateItem>
    <Delete ContinueOnError="true"
        TreatErrorsAsWarnings="true" Files="@(OldFiles)"/>
    <!-- copy content -->
    <Copy SourceFiles="@(Content)"
        DestinationFolder="$(output)%(Content.RelativeDir)" />
    <CreateItem Include="$(OutputPath)\*">
        <Output TaskParameter="Include" ItemName="Binaries" />
    </CreateItem>
    <Copy SourceFiles="@(Binaries)" DestinationFolder="$(output)bin" />
    <ReplaceConfigSections RootPath="$(output)"
        WebConfigReplacementFiles="@(ConfigFiles)"
        UseExternalConfigSource="true"
        ValidateSectionElements="true"/>
</Target>

Кажется, что это все, что нужно для развертывания проекта без предварительной компиляции. Дайте мне знать, если найдете что-нибудь получше.

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Чтобы заставить VirtualPathProvider работать с предварительно скомпилированным веб-сайтом (или, по большей части, частично скомпилированным), вам нужно сделать то, что Alconja говорит в отношении этого http://sunali.com/2008/01/09/virtualpathprovider-in-precompiled-web-sites/

Вместо обычного «AppInitialize»:

public static void AppInitialize()
{
    HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider())
}

Используйте это:

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[] { (VirtualPathProvider)new MyVirtualPathProvider()});
}

Согласно справке, оригинальный фильтр действий предварительно скомпилировал сайты. Вы можете добиться того, что хотите, перехватывая RegisterVirtualPathProviderInternal, используя отражение, помимо обычного метода RegisterVirtualPathProvider.

1 голос
/ 11 августа 2009

Возможно, я что-то упускаю (у меня нет опыта работы с VirtualPathProviders), но если вы просто хотите, чтобы ваши файлы aspx и ascx не были предварительно скомпилированы, отметьте флажок «Разрешить обновление этого скомпилированного сайта» в Компиляции раздел страниц свойств проекта развертывания (для любой используемой конфигурации).

С MSDN :

Разрешить обновление этого предварительно скомпилированного сайта

Указывает, что содержимое страниц ASPX не компилируется в сборка; вместо этого разметка остается как есть, что позволяет вам изменить HTML и клиентская функциональность после предварительной компиляции веб-сайта. Установка этого флажка эквивалентна добавлению опции -u к Команда aspnet_compiler.exe.

0 голосов
/ 12 августа 2009

Мне удалось обновить файлы ASPX без перекомпиляции, просто открыв отдельные файлы ASPX в Visual Studio, не открывая весь проект / решение.

Надеюсь, это поможет.

...