我试图用谷歌搜索这个问题,并有点短,所以也许这里有人可以阐明这个话题。

为了在ASP.NET中重写URL,我想用runat =“ server”属性在我的应用程序中声明所有图像和其他资源,以利用“〜/images”服务器路径语法。当使用相对路径(使用URL重写时),对LocAhost进行调试特别困难。我知道我可以将主机文件修改为有些克服这个问题,但是由于我们从事的项目数量,这是不可行的。

将HTML控件声明为runat服务器通常会添加到ViewState以启用数据持久性,但这与图像无关,或者我对此有误解...?

我还意识到,ASP网络运行时引擎还有更多的控制和处理,但这真的是一个严重的性能耗竭吗?

以这种方式宣布图像有严重的开销吗?

提前致谢。

有帮助吗?

解决方案

假设您要求之间存在差异:

1) <img runat="server" EnableViewState="false" src="~/images/img.png" />

2) <img src='<%= ResolveUrl ("~/images/img.png") %>' />

要构建1),生成的实际代码(或多或少)为:

System.Web.UI.HtmlControls.HtmlImage __ctrl;
__ctrl = new System.Web.UI.HtmlControls.HtmlImage();
this._bctrl_1 = __ctrl;
__ctrl.EnableViewState = false;
__ctrl.Src = "~/image.png";

然后将__ctrl添加到控制树中:

__parser.AddParsedSubObject(this._bctrl_1); // _bctrl_1 is __ctrl from above

页面生命周期中的任何事件(init,load ...)都将传播到此控件中,将调用RenderControl以从中获得HTML,resolveUrl()被调用以获取实际的URL,最后,Dispose()也会被称为。

现在,在情况2)中,该控件不会以正常方式添加到其父级,而是您得到这样的东西:

__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.__RenderTree));

这是在渲染时间时设定的代表u003Cimg>。在__rendertree中,写我们感兴趣的标签的部分是:

__output.Write("\n<img src='");
__output.Write( ResolveUrl ("~/image.png") );
__output.Write("' />\n");

因此,是的,1)在2中运行的“很多”代码正在运行。现在,就实际执行时间的影响而言,我认为这并不是一件大事。我测试了一个除了IMG标签/控制的空页面,并且在几个运行中它们之间的差异在-0.5ms/+0.5ms的范围内。 完全可以忽略.

其他提示

有重要的 相对的 甚至假设您已经关闭了所有ViewState Marlarky。但是,那 绝对 成本可能对单个用户不可觉觉。

考虑一个描述一系列HTML元素的标记,它被视为一个简单的文字“控制”,它非常有效地将其全部内容发送到页面渲染中适当点的响应中。

将所有相同的元素作为完整控件与所有对象创建,样式元素的解析,验证等以及本地状态的创建进行比较。然后,代码运行以采用本地状态,并且几乎渲染了与在ASP.NET页面中定义它相同的HTML标记。

在内存和CPU方面,使用大量runat =“服务器”会更昂贵。在个人情况下,这可能不是问题,而是对于具有重大活动的站点而言,可能是一个问题。

如果您正在开发一个应用程序,该应用程序将放置在较大站点中的某些虚拟目录中,请为您的图像使用相对路径。

如果您正在为其自己的站点开发一个应用程序,则在项目或站点属性中,将“开发人员Web服务器类别”中的虚拟路径修改为“/”。这样,在调试时,您就不会在URL中拥有额外的 / myprojectName /零件。这将使您使用某些资产或图像文件夹的绝对路径。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top