勇哥注:
此系列文章是梳理一下勇哥认为项目有用的WCF的知识点,读者须有WCF的开发经验。
一. 数据绑定
dataContract在适配CLR类型和WSDL的XLD之间的灵活应用
xsd是描述数据类型的,.net, java的程序最终生成的数据契约都是xsd的
不同的语言都是根据XSD生成各自平台下的强类型。
1. 普通的类
2. 集合类类型
3. 字典类型
4. 枚举
二. 对集合和枚举类型,要解决的坑
对服务引用的重新认识
1。对集合类型进行重新组装
Arrary-->List
只能要求svcutil 进行强制转换,在服务引用中做手脚
2。对字典进行重新组装
同样在服务引用做手脚
三. 最后的方案
1。 如果是.net程序互通,尽量遵守同一份Entity,但现实中,很难这样做,尤其是跨语言互通
可以将类和数据类型封装到Lib中,这样各自平台引用同一份Lib,就没问题了。
这样就不会在服务引用时生成新的类
大家公用同一份lib,就不存在各种问题了。
四. DataContract,DataMember, EnumMember对wsdl中的xsd进行可视化定制
1。 默认全部可以进行DataContractSeriallizer序列化
2。 指定不需要在xsd中显示的字段
(1) 某些字段不显示,需要自己强制指定IgnoreDataMember
(2) 显式进行DataContract, DataMember声明
3。 其它方面的改造
(1)DataMember改名对真实字段保护
通过Name属性改
(2)调整Field顺序【Order】
如何让xsd中的顺序跟程序中的顺序一样
通过Order属性来改
五. 消息契约
<?xml version="1.0" encoding="utf-8“?>
<s:Envelope xmlns:s=""/>
<s:Header>
</s:Header>
<s:Body>
<DoWork xmlns="">
<msg>hello world!</msg>
</Dowork>
</s:Body>
</s:Envelope>
消息契约指的:CLR类型可以直接操控Message, [header(信封), body]
而数据契约,只影响s:Body
六. 操作s:Header有什么好处?
1。 可以单独在header中增加信息,方便第三方组件拦截的时候对header进行独立的处理
(1)保证消息防篡改的token参数 【AppID, Appsecert】 AppID+param + Appsercert
(2)用户登录的用户名和密码的md5验签
就是说可以加一些信息保护机制
client--->负载均衡---->Service
以上处理都放在负载均衡中去做,对于违反规则的请求,由负载均衡直接返回,相当于截流的作用。
七. 如果用代码实现?
[MessageContract] / [MessageHeader] / [MessageBodyMember]
实现soap和CLR的强类型映射
八. 更大的灵活性:直接在参数中使用Message
1. 更大的灵活性,实际使用少,编程麻烦
2. 代码实现

