我能够使用HttpHandler
设置一些ASP.NET Image控件来从数据库渲染图像。
// Notice the ImageHandler.ashx
<asp:Image ID="imgSrvcGrp" runat="server" ImageUrl='<%# DataBinder.Eval(Container.DataItem, "ServiceGroupID", "~/ImageHandler.ashx?id={0}") %>' />
效果很好,设置起来非常简单。我的问题是......
我注意到HttpHandler
(ImageHandler.ashx)在某些时候遇到了我不想要的时候。例如,我在页面的Page_Load
事件中有一个断点,其中包含使用HttpHandler
的Image标签和处理程序本身的另一个断点,我发现即使没有回发也是如此(即 - Page_Load
断点未被命中)处理程序有时会被命中(即 - 处理程序中的断点被命中)。
奇怪的是,我发现当我关闭页面上的jQuery对话框时会发生这种情况。我在页面上有一个jQuery对话框弹出窗口,我发现当我关闭jQuery弹出窗口(通过单击X)时,图像处理程序会针对消耗它的页面上的每个图像进行命中,但不会发生回发。
我可以考虑添加的唯一其他细节是我的网页使用的是Telerik的RadTabStrip,它可能会以某种方式对此事产生影响。
我意识到我的解释是相当冗长的,所以更简洁地提出我的问题:为什么我的图像处理程序经常被击中,即使没有回发?
答案 0 :(得分:1)
因为加载页面资源和发布表单是不同的操作。
不要从ASP.NET角度考虑使用回发和Page_Load处理程序以及诸如此类的东西。从浏览器中的实际HTML的角度来考虑它。 “回发”只不过是发布到页面的表单。如果您没有做任何事情来触发表单帖子,页面将不会回发。
但是,页面 在请求其他资源时命中服务器。 CSS文件,JavaScript文件,图像等。 HTML中引用的页面需要加载的资源。因此,当加载页面时,它不会只打一次服务器。它命中服务器以获取HTML文档(这是页面的Page_Load被触发的地方),并且当它呈现HTML时,它会一次又一次地对HTML文档中引用的每个资源点击服务器。
如果页面隐藏/显示具有动态样式调整的资源,则每次显示它们时都不需要重新加载这些资源。但是,如果页面正在执行某些操作,导致它必须重新呈现已加载的内容(并且该内容未在浏览器中缓存),那么它将命中服务器。这将导致ASHX处理程序被击中。
有一个建议是用一些调试工具加载页面(Firefox中的FireBug仍然是我个人的选择),并观察页面上的实际流量(FireBug中的“Net”选项卡,可能与其他工具类似。)这可以帮助您准确确定所请求的内容以及可能的请求。例如,如果RadTabStrip出于任何原因从页面中删除img
个元素并重新添加它们,它每次都会从服务器请求图像。