现在我们再次回到ajax调用的地方,大家都会发现我们的参数列表室在太长了,因此大家可能会想用一些方法来改善,比如:连ashx都懒的重复去写了,想直接在url中把弥命名空间、类、方法直接放进去来替代,想到这一步的时候,我们就需要配置web.config了,假设我们想要的规则是SysBLL/SysBLL.CustomerBLL.Search,配置如下:
<httpHandlers> <add path=type=verb=/> </httpHandlers>
有人会问为什么这边要.do,而不直接省略呢?因为如果不加.do,那么就会将其他的请求也都转向我们的ashx,例如:js、css文件等,大家可以自己测试看看.因为我们使用了地址映射,因此我们的js以及ashx代码又要做一些改动了.大致修改如下:
View Code
1 View Code Common 4 { BLLAshx : IHttpHandler 6 { ProcessRequest(HttpContext context) 8 { ], fullName = context.Request.Params[]; 10 var bllType = Assembly.Load(assemblyName).GetType(fullName); methodName = context.Request.Params[]; 13 var method = bllType.GetMethod(methodName); 14 if (null != method) 15 { 16 string[] parameterValues = GetMethodParameterValues(context.Request, method); instance = Activator.CreateInstance(bllType); result = method.ReturnType == : method.Invoke(instance, parameterValues).ToString(); context.Response.Write(result); 24 } { } 29 } [] GetMethodParameterValues(HttpRequest request, MethodInfo method) 32 { 33 string[] parameterValues = null; 34 var methodParameters = method.GetParameters(); 35 if (0 < methodParameters.Length) 36 { 37 parameterValues = new string[methodParameters.Length]; 38 for (int i = 0; i < methodParameters.Length; i++) 39 { 40 parameterValues[i] = request.Params[methodParameters[i].Name]; 41 } 42 } 43 return parameterValues; 44 } 45 } 46 } SysBLL 49 { CustomerBLL 51 { Search(string name) 53 { json; 56 } 57 } 58 }
ashx的调整,我们只要修改ProcessRequest方法,代码大致如下:
View Code
); 2 var groups = reg.Match(context.Request.AppRelativeCurrentExecutionFilePath).Groups; 3 if (4 == groups.Count) 4 { ].Value, fullName = groups[].Value; 6 var bllType = Assembly.Load(assemblyName).GetType(fullName); methodName = groups[].Value; 9 var method = bllType.GetMethod(methodName); 10 if (null != method) 11 { 12 string[] parameterValues = GetMethodParameterValues(context.Request, method); instance = Activator.CreateInstance(bllType); result = method.ReturnType == : method.Invoke(instance, parameterValues).ToString(); context.Response.Write(result); 19 } { } 24 } { }
有人可能会问为什么要重复SysBLL/SysBLL呢?其实可以省略其中的一个,但是条件是程序集必须要跟这个前缀一样才能省略.
如果大家想要省略其中一次SysBLL,那么正则的匹配规则也要相应的调整一下,只要将(?<class>\w+.\w+)中的.\w+去掉即可.