出站规则不适用于updatepanel内部

本文关键字:updatepanel 内部 适用于 不适用 规则 | 更新日期: 2023-09-27 18:05:58

TLDR:出站规则不适用于updatepanel部分回发


我正在使用IIS 7.5 URL重写器将图像路径映射到cdn。

这里是发生的事情的简化版本

<Repeater Goes Here>
    <img alt="alt text" src="<%#getImageSource(Eval("Filename").ToString() )%>">
<End of Repeater>

假设函数getImageSource返回"/images/someimage.jpg"

这反过来重写为

<img alt="alt text" src="http://img.cdn.com/someimage.jpg">

使此工作的出站规则是:

    <rule name="Out_Rewrite_ServeCookieLessImages" preCondition="ResponseIsHtml" enabled="true">
      <match filterByTags="Img" pattern="^/Images/(.*)$"/>
      <action type="Rewrite" value="http://img.cdn.com/{R:1}"/>
    </rule>
    <preConditions>
      <preCondition name="ResponseIsHtml">
        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html"/>
        <add input="{URL}" pattern="'.axd.*$" negate="true"/>
      </preCondition>
    </preConditions>

问题是当在更新面板

中使用中继器时

异步回发后实际输出的HTML是

<img alt="alt text" src="/Images/someimage.jpg">
不是

<img alt="alt text" src="http://img.cdn.com/someimage.jpg">

如何使updatepanel正确解析输出?

Thanks in advance


编辑:在这一点上,我的猜测是它必须与页面生命周期做一些事情…或者是重写模块被调用的顺序…将保持更新

出站规则不适用于updatepanel内部

当使用UpdatePanel时,服务器返回的响应内容类型是text/plain而不是text/html。

你所列出的ResponseIsHtml前提条件将只匹配文本/html内容,所以这就是为什么UpdatePanel响应没有被重写。

如果你修改输入正则表达式来捕获文本/明文,那么你的内容将被重写为它应该:

<preConditions>
  <preCondition name="ResponseIsHtml">
    <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/[html|plain]"/>
    <add input="{URL}" pattern="'.axd.*$" negate="true"/>
  </preCondition>
</preConditions>

不幸的是,这样做有一个问题,我还没有找到解决方案-重写响应导致UpdatePanel ajax管理器抛出ys.WebForms.PageRequestManagerParserErrorException