代码之家  ›  专栏  ›  技术社区  ›  gg.

使用runat=server对html控件进行性能提升

  •  3
  • gg.  · 技术社区  · 16 年前

    我试着在谷歌上搜索这个,结果有点短,所以也许这里有人可以解释一下这个话题。

    为了在asp.net中重写url,我想使用runat=“server”属性声明应用程序中的所有图像和其他资源,以利用“~/images”服务器路径语法。使用相对路径时(使用url重写时),在locahost上调试尤其困难。我知道我可以修改宿主文件以在某种程度上克服此问题,但由于我们正在处理大量项目,这是不可行的。

    我也意识到asp net运行时引擎需要处理更多的控件,但这真的是一个严重的性能消耗吗。。。?

    以这种方式声明图像是否会带来严重的开销,如果是的话,有人能解释一下性能冲击的主要来源吗。

    提前谢谢。

    2 回复  |  直到 16 年前
        1
  •  5
  •   Gonzalo    16 年前

    假设您询问以下各项之间的差异:

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

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

    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()。

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

    设置一个委托,该委托将在渲染<img>。在u_RenderTree中,编写我们感兴趣的标记的部分是:

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

    .

        2
  •  0
  •   AnthonyWJones    16 年前

    这是一个重要的问题 甚至假设你已经关闭了所有的viewstate marlarky。然而 绝对的

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

    显然,在内存和CPU方面,使用大量runat=“server”会更加昂贵。在个别情况下,这可能不是一个问题,但对于一个具有重大活动的站点来说,这很可能是一个问题。

    如果您正在开发一个应用程序,该应用程序将连接到自己的站点,那么在项目或站点属性中,将Developer Web Server类别中的虚拟路径修改为“/”。这样在调试时,URL中就不会有额外的/myprojectname/部分。这将允许您使用某些资源或图像文件夹的绝对路径。

    推荐文章