适用场景:当前项目有一个接口:http://xxx.com/a.aspx,现在我们在不需要a.aspx这个文件的,直接处理这个地址的请求,我们可以做很多的事情,比如,直接返回一个静态的JSON文件内容。
Global.asax全局配置文件添加路由表的注册
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}");
RouteTable.Routes.RouteExistingFiles = true;
RouteTable.Routes.Add("Stocks", new MyRoute());
}
定制路由MyRoute 继承BouteBase
public class MyRoute : RouteBase
{
public override RouteData GetRouteData(HttpContextBase httpContext)
{
//获取相对路径
var virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath;
virtualPath = virtualPath.Substring(2).Trim('/');
if (virtualPath.ToLower().Contains("a.aspx"))
{
string name = httpContext.Request["name"];
var data = new RouteData(this, new MyRouteHandler());
data.Values.Add("name", name ?? "test");
return data;
}
//返回值为null,跳过此路由,进行下一个匹配
return null;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return null;
}
}
RouteHandler
public class MyRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpHandler(requestContext);
}
}
HttpHandler 这里可以对Request请求做相应的业务处理
public class MyHttpHandler : IHttpHandler
{
public RequestContext RequestContext { get; set; }
public MyHttpHandler(RequestContext context)
{
RequestContext = context;
}
public void ProcessRequest(HttpContext context)
{
string name = RequestContext.RouteData.Values["name"].ToString();
context.Response.ContentType = "application/json";
context.Response.Charset = "utf-8";
context.Server.Transfer("data.json");
context.Response.End();
}
public bool IsReusable => false;
}
也可以直接使用HttpHandler,在web.config文件里配置处理请求,方式多种。