HttpHandlers 为某些路径触发,但不是全部

HttpHandlers fire for some paths but not all

我想弄清楚为什么某些路径对同一个 httphandler 有效而其他路径无效。我在 IIS10.

我的处理程序如下所示:

<add name="IconStore" preCondition="integratedMode" path="icons/*" verb="*" type="SomePath.Controls.IconStoreHandler, SomePath.Controls"/>

并且此处理程序将针对此路径触发:

<img class="tip" data-tip="redacted" src="icons/interface-question-mark">

在此处添加:

<asp:Image runat="server" CssClass="tip" data-tip="<%$ Resources:Resources, Redacted%>" ImageUrl="icons/interface-question-mark" />

但不会为此实现触发:

<div class="redacted" initialized="true" title="" style="background-image: url("icons/interface-question-mark");"></div>

需要注意的一点是,当我从 chrome 的检查器中复制不起作用的元素时,双引号是 &quot; 但我做了一些研究并且似乎不是问题。

为什么第一个实现会触发,而第二个不会?如果我使用不同的处理程序路径,例如:

      <add name="Icon.axd" preCondition="integratedMode" path="Icon.axd" verb="GET" type="SomePath.Controls.IconStoreHandler, SomePath.Controls"/>

然后我的实现是这样的:

<div class="redacted" initialized="true" title="" style="background-image: url("Icon.axd?name=test");"></div>

处理程序将为两种实现触发。

我更喜欢 运行 针对服务器生成 URL,让 asp.net 确定要使用的路径。为此,您可以使用波浪号 (~) 来表示应用程序路径的根。

例如你会改变

<asp:Image runat="server" ImageUrl="icons/interface-question-mark" />

<asp:Image runat="server" ImageUrl="~/icons/interface-question-mark" />

~ 这是您在 IIS 中的根应用程序,因此如果您在本地 运行 使用波浪号相当于在 url

前面输入
http://localhost/myappname

第一个例子的结果 url 等同于

http://localhost/myappname/icons/interface-question-mark

对于您的 css 链接(或任何其他非网络控件,您可以这样做:

<div class="redacted" style="background-image: url('<%= Page.ResolveUrl("~/icons/interface-question-mark")');"></div>

所以事实证明以上确实有效,我设置了一个重写规则,将这些请求重定向到 http://localhost:80/redacted/user?site=icons

我为图标添加了防重写路径,现在可以使用了。

E:反重写路径如下:

<add input="{URL}" pattern="^/[\w-]+/icons/*" negate="true" />

在rewriteRules.config