Web部署项目:不预编译发布

时间:2009-08-07 14:42:35

标签: asp.net web-deployment-project precompiled virtualpathprovider

问题

是否可以使用不带预编译的Web部署项目发布Web应用程序项目?

注释

为了将Web控件和页面拆分为单独的程序集,我使用自定义VirtualPathProvider来加载这些资源。我在cmd行使用Web部署项目和msbuild来部署这些项目。

问题的关键在于预编译应用程序不支持VirtualPathProviders。我找到了常规文件here的解决方法。但是,这不适用于ascxaspx页面等应用程序文件。它引发了一个例外,即“文件尚未预编译,无法请求”。

因此,我决定尝试完全放弃预编译,并且由于我们的网站流量不是特别高,因此初始请求性能受到影响。但是,我无法弄清楚如何使用Web部署项目来实现这一点,这些项目已经非常适合我们的构建过程。

[更新]

我正在研究自定义Microsoft.WebDeployment.targets文件以实现此目的,但到目前为止我还没有运气。

[更新]

在Microsoft.WebDeployment.targets文件中进行挖掘时,我发现没有直接的方法可以将Web部署项目与Web应用程序预编译分离。事实上,我不确定是否有任何需要。我现在使用的是类似于以下代码段的内容。我只是将它放入项目文件中,条件为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 个答案:

答案 0 :(得分:2)

要使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()});
}

根据参考,原始动作过滤预编译的网站。除了普通的RegisterVirtualPathProvider方法之外,您还可以使用反射来实现您想要拦截RegisterVirtualPathProviderInternal。

答案 1 :(得分:1)

也许我错过了一些东西(我对VirtualPathProviders没有任何经验),但如果你只是想要你的aspx&amp; ascx文件未预编译,勾选部署项目属性页面的编译部分中的“允许此预编译站点可更新”框(对于您使用的任何配置)。

来自MSDN

  

允许此预编译网站可更新

     

指定不编译.aspx页面的内容   集会;相反,标记保持原样,允许您更改   预编译网站后的HTML和客户端功能。   选中此复选框相当于将-u选项添加到   aspnet_compiler.exe命令。

答案 2 :(得分:0)

我已成功更新ASPX文件而无需重新编译,只需在Visual Studio中打开单个ASPX文件而无需打开整个项目/解决方案。

希望这有帮助。