【发布时间】:2018-12-19 11:16:44
【问题描述】:
不确定我所追求的是否可以使用 aspnet_compiler.exe 工具实现,但这里是:
我们有一个网站,我们允许用户通过修改母版页来进行皮肤设置 - 或者更确切地说,我们不允许他们直接修改它们,我们为他们提供了一种他们可以使用的精简“标记”样式语言修改这些页面的 html,因此他们基本上可以“皮肤”网站看起来像他们自己的前端。
我热衷于尝试通过预编译视图和 aspx 页面来优化网站。但我希望这些视图和页面使用的布局和母版页保持可更新。但是,我无法让它工作......
假设我们有以下 aspx 页面:
<%@ Page Title="Hello World" MasterPageFile="~/Skinable/Skin.Master" Language="C#" AutoEventWireup="true" CodeBehind="HelloWorld.aspx.cs" Inherits="Project.HelloWorld" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Content" Runat="server">
Hello World!
</asp:Content>
它引用了Skinable 文件夹中的母版页文件Skin.Master。 Skin.Master 需要可更新。这是我尝试过的:
-
如果我只是使用这个 aspnet_compiler.exe 命令编译站点, 母版页也被编译,并且不可更新:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_compiler.exe -v / -p d:\SourceFolder d:\CompiledSite 如果我排除了可换肤文件夹(将
-x Skinable添加到 命令)在 aspnet_compiler.exe 中然后该文件夹没有得到 复制到输出文件夹,但母版页仍编译为 bin 文件夹(即,skin.master.compiled文件生成到 构建文件夹)。当我们将母版页复制到 部署文件夹,对该文件的更改将被忽略(它只是使用 编译时的母版页)。如果我在运行 aspnet_compiler (
attrib +h d:\SourceFolder\Skinable) 之前隐藏 Skinable 文件夹,那么我会得到与上面相同的结果(即通过 -x 标志排除时)如果我在运行时指定 -u 标志(可更新) aspnet_compiler.exe,好吧,我不确定这样做的好处是什么 老实说,因为在那种情况下似乎没有任何东西被编译,所以 当您请求页面时,编译会即时进行,所以是什么 重点……
最后,如果我允许编译所有内容,然后进入 bin 文件夹和 DELETE skin.master.compiled,然后当你请求一个 使用该母版页的页面,您会收到错误“文件 ‘Skin.master’未预编译,无法请求”
我怀疑对母版页的引用是这里的问题 - 即,如果一个页面引用了一个母版页,那么如果您想编译该页面,则该母版页也必须被编译,但我不确定。我是不是在这里一无所有?
【问题讨论】:
-
您可以使用可更新的用户界面标志 -u:updatable docs.microsoft.com/en-us/aspnet/web-forms/overview/… 重新编译。解决了一半的问题。
-
感谢@DipenShah。使用 -u 标志编译似乎使资产可更新,这很好,但它似乎并没有真正编译资产,因此它们可以在不需要编译的情况下加载到服务器上。或者我在这里错过了什么? -u 似乎只是一个编译检查,以确保没有遇到运行时错误?或者,我错过了什么吗?
-
-u 标志不编译 aspx 文件,它只编译文件后面的所有代码,因此您的 aspx 文件将根据请求进行编译。这就是为什么我说这只是解决您问题的一半
-
如果有一个源网络应用程序,一切都可以更新,但只有整个预编译的网络应用程序被部署。如果管理员更改了皮肤,他会更改源 Web 应用程序中的皮肤,修改后的源 Web 应用程序会被预编译并再次部署......?!像这样的东西可以吗?
-
但是如何防止用户在母版页代码中运行 C# 代码?
标签: asp.net .net webforms aspnet-compiler