如何在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层面处理,性能更好,也不用维护额外的代码。
最后验证要点
不管用哪种方案,测试时记得:
- 重启应用程序池,确保配置生效
- 用浏览器F12查看网络请求,确认.json地址返回的是.ashx的内容,状态码为200而非跳转类状态码
- 带查询字符串的请求(比如
data.json?id=1)要确认参数能正常传递给.ashx
内容的提问来源于stack exchange,提问作者SP045
相关产品推荐
相关产品推荐

