asp.net - Web部署项目: Publish without Precompilation

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

问题

是否可以使用 Web 部署项目来发布 Web 应用程序项目,无需预编译?

注释

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

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

因此,我决定尝试完全放弃预编译并承受初始请求性能影响,因为我们的网站流量不是特别高。但是,我不知道如何使用 Web 部署项目来做到这一点,这些项目已经融入我们的构建过程中。

[更新]

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

[更新]

在深入研究 Microsoft.WebDeployment.targets 文件时,我发现没有直接的方法可以将 Web 部署项目与 Web 应用程序预编译解耦。事实上,我不确定是否有必要这样做。我现在使用的是类似于以下代码片段的东西。我只是将其放入项目文件中,并带有一个条件属性,以便不部署调试版本。

<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>

似乎这就是在没有预编译的情况下部署项目所需的全部内容。如果您发现更好的东西,请告诉我。

最佳答案

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

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

关于asp.net - Web部署项目: Publish without Precompilation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1245145/

相关文章:

c# - 方法运行 ASP.NET MVC3 Razor 时的进度条

jquery - 在 vb.net 2.0 中使用 jQuery ajax

asp.net - 通过 Web 部署项目创建虚拟目录时访问被拒绝

ruby-on-rails-3 - 防止 Heroku 在开发模式下使用预编译 Assets

asp.net - 我可以通过通用的 try/catch 优雅地运行 Controller 中的每个 ContentResult 吗?

asp.net - 从 ASP.NET 向另一个 URL 发送请求

asp.net-mvc - Web 部署项目输出中缺少母版页

visual-studio-2008 - 如何使用 msbuild/web 部署项目删除多个文件?

c++ - 使用 CMake 的 C++ 项目(多个库和可执行文件)的单个共享预编译头文件

asp.net - 我可以将单个修改后的页面预编译到已经预编译的 .Net 网站吗?