山寨版WCF
MS大搞WCF,了解过,但是配置起来应用比较费劲。
于是乎,自己写Handler,动态解析方法参数,返回json格式字符串(当然也可以返回XML)。
山寨终究是山寨,只能是跟WCF的某一个应用场合来做比较,请看我是怎么实现的。
应用场合是这样,服务器端通过接受浏览器传递过来的参数,调用某一个函数后并将该函数的返回值转换为json字符串返回。
比如,我有个Bll类Test,它有个方法Do,调用后返回一个字符串,代码如下:
public class Test
{
public string Do(TestMod mod,TestMod2 mod2)
{
return "test-" + mod.FullName.ToString() + " age:" + mod.Age.ToString() + " birthday:" + mod2.Birthday.ToString();
}
}
//实体一
[DataContractAttribute]
public class TestMod
{
public string UserName { get; set; }
public string FullName { get; set; }
public int Age { get; set; }
}
请看我配置后的山寨版WCF是如何调用这个方法的(特别适合ajax),此处我用url传参来测试:
看到这里,或许大家觉得没什么可奇怪的,不就是一个简单的handler将.wcf格式的请求处理调用Test.Do方法,然后Response.write吗?
实际上并不仅仅是如此,我写了个Ecrmi.Wcf.dll的类库,这个类库就是我山寨WCF的核心,它完全封装了Handler的请求参数和返回的json,并且通过动态调用请求的url指定类的方法,其中方法的参数类型的创建和请求参数的赋值都是由Ecrmi.Wcf.dll来完成的。
这个小应用,通过以下几个步骤即可:
1.通过IIS添加对.wcf格式的映射(当然是由asp.net的程序来处理)
2.配置web项目的web.config,增加Handler请求配置<add verb="*" path="*.wcf" type="Ecrmi.Wcf.PageHandlerFactory,Ecrmi.Wcf"/>
3.将你的实体类增加[DataContractAttribute]属性(用于序列化)
4.在Web.config配置好你制定的业务Bll命名空间:<add key="AssemblyDll" value="Ecrmi.Bll"/>
5.按照URL规则请求方法:/类名.方法名.wcf (当然后面可以传递参数,或通过其他方法传递参数)
(DEMO代码稍后提供下载,含Ecrmi.Wcf源码)
本打算应用做到这里就算了,可是人家WCF不是有WSDL方法描述吗?不行,俺也要我来一个,请看图:
看见没?刚才的方法我把参数和参数的具体类型都给输出了,哈哈,URL规则变成了 /类名.方法名.api.wcf。
更多应用,请大家下载后自己测试玩耍。
我将我这个Ecrmi.Wcf.dll的类库介绍一下:
1.首先是Ecrmi.Wcf.PageHandler类,通过分析请求的url,反射该url指定的类,创建其实例,最后由HttpContext.Response.Write输出的。
2.Ecrmi.Wcf.MethodInfoUtility类,通过分析请求的url的参数类型,创建其实例,并将参数赋值为request.param传递的参苏。
3.Ecrmi.Wcf.DynamicMethodExecutor高性能动态调用类,动态调用请求的方法,来自于JeffreyZhao的文章(高性能动态方法调用)。
4.Ecrmi.Wcf.JsonUtility类,JSON序列化与反序列化辅助类,通过反射调用方法的返回值类型与值,将返回值序列化为Json字符串。
5.Ecrmi.Wcf.StaticCache类,将业务逻辑的所有反射出来的属性信息缓存了,为了提高性能,来自于passer的文章(只读缓存辅助)。
好了,这个没有什么难点,只是玩了一把雕虫小技,倒是很实用。
号称山寨WCF,大家拍砖的就拍吧,本人脸皮厚,拍不烂,不信试试~
下载:Demo和Ecrmi.Wcf源码 (注:特别适合用Extjs开发的同仁们)