You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Application_BeginRequest的IIS URL重写在IIS Express中异常缓慢问题

ASP.NET自定义URL重写在IIS Express下的诡异性能问题

我在ASP.NET项目中通过实现Application_BeginRequest处理器,完成了无法仅靠web.config正则规则实现的复杂URL重写,具体代码如下:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    //check if rewrite is disabled
    if (ServiceLocator.AppConfigProvider.Instance.IsUrlRewriteEnabled == false)
        return;

    //check if it's an API URL a Data URL (custom, static or data) or Backoffice (only page url have to be rewritten)
    string[] segments = Request?.Url?.Segments ?? new string[0];
    if (segments.Length >= 2)
    {
        string rootSegment = (segments[1] ?? string.Empty).Replace("/", string.Empty).ToLower().Trim();

        if (rootSegment == "api" || rootSegment == "backoffice" || rootSegment == "custom" || rootSegment == "data" || rootSegment == "static")
            return;
    }

    var navigator = SiteNavigator.Instance();

    string absoluteUri = Request?.Url?.AbsoluteUri ?? string.Empty;
    var siteLocation = navigator.RewriteExternalUrl(absoluteUri);

    string internalUrl = siteLocation.ToString();
    HttpContext.Current.RewritePath(internalUrl);
}

测试中发现的异常现象

  • 本地使用IIS Express测试时,每个请求速度异常缓慢,耗时从原0.3-0.4秒增至3-4秒,性能下降约10倍;
  • 开启性能分析器后,性能下降问题基本消失(仍为Debug编译模式);
  • 发布至正式IIS(非Express版本)后,性能下降问题消失;
  • 禁用自定义重写逻辑(IsUrlRewriteEnabled == false)后,性能下降问题消失;
  • 启用自定义逻辑并添加计时器和计数器后,发现代码在重写场景下最多执行两次,每次耗时不超过1ms。

我无法定位本地环境性能下降的原因,同时担忧正式IIS看似无问题,但实际隐患可能在生产环境爆发。

补充说明:项目中的web.config重写规则

项目仍使用少量正则规则,主要用于重写非HTTPS请求,配置如下:

<rewrite>
  <rules>
    <rule name="Redirect to https" stopProcessing="true">
      <match url=".*" />
      <conditions>
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
    </rule>
    <rule name="Login" enabled="false" stopProcessing="true">
      <match url="^login.*" />
      <action type="Rewrite" url="/Pages/login.aspx" appendQueryString="false" />
    </rule>
  </rules>
</rewrite>

排查与解决方案建议

本地IIS Express性能问题排查

  1. 切换编译模式测试:将项目改为Release模式本地运行,排除Debug模式下IIS Express额外的调试检查开销影响。
  2. 追踪请求生命周期:启用IIS Express的请求日志,查看每个请求的完整流程,确认是否存在RewritePath触发的二次请求、资源404重试等隐性开销。
  3. 提前初始化单例对象:在Application_Start中提前初始化SiteNavigator.Instance(),避免首次请求时的懒加载初始化开销在IIS Express调试环境下被放大。
  4. 排查规则冲突:临时禁用web.config中的HTTPS重定向规则,验证是否是IIS重写模块与自定义管道逻辑的交互导致性能异常。
  5. 检查系统资源与环境版本:查看本地IIS Express运行时的CPU、内存占用,确认无其他进程干扰;同时尝试更新IIS Express到最新版本,缩小与正式IIS的版本差异。

生产环境隐患防控

  1. 负载测试验证:在正式IIS上模拟高并发请求,观察负载情况下是否出现性能波动,重点检查RewriteExternalUrl的并发调用是否存在线程阻塞或资源竞争。
  2. 添加轻量监控日志:在Application_BeginRequest中添加轻量级性能日志,记录重写耗时、请求路径等信息,长期监控生产环境是否有偶发异常。
  3. 验证重写逻辑稳定性:确保RewriteExternalUrl方法具备幂等性,避免重复调用产生错误;同时确认RewritePath不会触发无限重循环,可添加重写次数限制逻辑。

内容的提问来源于stack exchange,提问作者Skary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:10:57