在.Net中,访问一个IHttpHandler类, 有三种方式。
a. 直接添加 xx.ashx / xx.ashx.cs 文件,将IHttpHandler类写在 xx.ashx.cs 中。
b.在web.config的handlers节点中配置路由。
c.在.Net编程中修改路由表。
本文主要是测试方法a 与 方法b的性能差别;
1. 我们通过test2.ashx实现ashx文件访问,
2. 通过test3.ashx模拟路由访问。
3. addReport.cs 同时为test2.ashx 与 test3.ashx 提供相同的访问支持,这样保证性能一致。
4. 建立一个test.htm 页面,在此页面中通过ajax同步请求测算时间。
测试代码:
文件: test2.ashx
<%@ WebHandler Language="C#" CodeBehind="addReport.ashx.cs" Class="view.demo.addReport" %>
文件:addReport.cs
using System;
using System.Web;
namespace view.demo
{
public class addReport : IHttpHandler
{
public bool IsReusable { get { return true; } }
public void ProcessRequest(HttpContext context)
{
context.Response.Write(DateTime.Now.ToString());
}
}
}
文件: web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Route1" path="test3.ashx" verb="*" type="view.demo.addReport"/>
</handlers>
</system.webServer>
</configuration>
文件:test.html
<script>
function TryRequest(url)
{
var d1 = new Date();
var t1 = d1.getTime();
for(var i = 0; i<1000; i++)
{
var xhttp = new XMLHttpRequest();
xhttp.open("GET", url + "?t=" + t1 , false );
xhttp.send();
xhttp = null;
}
var d2 = new Date();
return d2.getTime()- d1.getTime() ;
}
function TryGetTimeRange() {
var url1 = "test2.ashx"; //ashx 文件
var url2 = "test3.ashx"; //ashx 路由
var r1 = TryRequest(url1);
var r2 = TryRequest(url2);
document.getElementById("test2").innerHTML = r1;
document.getElementById("test3").innerHTML = r2;
}
</script>
<div id='test2'></div>
<div id='test3'></div>
<button onclick='TryGetTimeRange()'>Start</button>
测试结果(3次):
从三次测试结果来看,差别非常小,1000次的访问只有10-20毫秒的差别,而且各有胜负。原本以为ashx 文件模式下每次请求会有IO消耗,但实际上Net内部应该建立了缓存机制,只读一次。
自己动手,丰衣足食。