山寨版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 { getset; }
        
public string FullName { getset; }
        
public int Age { getset; }
    }

请看我配置后的山寨版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开发的同仁们)

原文地址:https://www.cnblogs.com/chf/p/1513529.html