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

如何在ASP.NET中使用处理程序将.json URL重写为.ashx?

解决ASP.NET中.json请求转.ashx的向后兼容问题

兄弟,我瞅你这情况是想把原来指向.json文件的请求无缝转到.ashx处理程序,但用Server.Transfer没达到预期效果对吧?咱一步步来排查和解决:

先说说你当前代码的问题

你写的处理程序思路没问题,但有几个容易踩的坑:

  • IsReusable设为false:这会导致每次请求都创建新的处理程序实例,完全没必要,改成true更高效。
  • Server.Transfer的适配问题:老版本的Server.Transfer在IIS集成模式下可能出问题,换成TransferRequest更适配现代IIS环境。
  • 处理程序未注册:这是最容易忘的环节!你得先在web.config里把.json请求映射到你的处理程序,不然IIS根本不会把.json请求交给你的代码处理。

修正后的自定义处理程序代码

public class JsonToAshxHandler : IHttpHandler
{
    // 允许复用实例,提升性能
    public bool IsReusable { get { return true; } }

    public void ProcessRequest(HttpContext context)
    {
        var originalUrl = context.Request.RawUrl;
        // 替换后缀,自动保留原请求的查询字符串
        var newUrl = originalUrl.Replace(".json", ".ashx");
        
        // 先校验目标.ashx文件是否存在,避免返回404
        var targetFilePath = context.Server.MapPath(newUrl);
        if (System.IO.File.Exists(targetFilePath))
        {
            // 使用TransferRequest适配IIS集成模式,同时保留请求上下文
            context.Server.TransferRequest(newUrl, true);
        }
        else
        {
            context.Response.StatusCode = 404;
            context.Response.End();
        }
    }
}

必须配置web.config注册处理程序

根据你的IIS版本不同,配置方式略有区别:

IIS 6及以下(经典模式)

在<system.web>节点里添加:

<httpHandlers>
  <add verb="*" path="*.json" type="你的命名空间.JsonToAshxHandler, 你的程序集名称" />
</httpHandlers>

IIS 7+(集成模式)

在<system.webServer>节点里添加:

<handlers>
  <add name="JsonToAshx" verb="*" path="*.json" type="你的命名空间.JsonToAshxHandler, 你的程序集名称" preCondition="integratedMode" />
</handlers>

更推荐的方案:用IIS URL Rewrite模块

如果你的服务器装了IIS URL Rewrite模块,直接在web.config里加重写规则,不用写自定义处理程序,更简洁稳定:

<system.webServer>
  <rewrite>
    <rules>
      <rule name="JsonToAshx" stopProcessing="true">
        <match url="^(.*)\.json$" />
        <action type="Rewrite" url="{R:1}.ashx" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

这个规则会把所有xxx.json的请求静默重写成xxx.ashx,完全在IIS层面处理,性能更好,也不用维护额外的代码。

最后验证要点

不管用哪种方案,测试时记得:

  1. 重启应用程序池,确保配置生效
  2. 用浏览器F12查看网络请求,确认.json地址返回的是.ashx的内容,状态码为200而非跳转类状态码
  3. 带查询字符串的请求(比如data.json?id=1)要确认参数能正常传递给.ashx

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:13:09