『随笔』WCF开发那些需要注意的坑

执行如下
批处理:
"C:\Program
Files\Microsoft SDKs\Windows\v6.0A\Bin\svcutil.exe"
http://127.0.0.1:40001/TestService?wsdl /language:C#
/out:"D:\TestProxy.cs" /config:"app.config"
"C:\Program
Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\svcutil.exe"
http://127.0.0.1:40001/TestService?wsdl /language:C#
/out:"D:\TestProxy.cs" /config:"app.config"

就能在
D盘 得到 代理类 & 配置文件片段

——————————————————————————————————————————————————————

关于
WCF的 传统用法 几点忠告:

  >WCF不支持
List 等一切 集合类型 (一切集合 都会被 WCF 转换为 数组)
  >WCF不支持
Hashtable 等大部 哈希类型 (大部哈希 都会被 WCF 转换为
Dictionary<object,object>)
    ——部分特殊情况 WCF
连 Dictionary<object, object> 都不支持
  >注意在
服务端 对 需要的对象 声明特性 : [KnownType(typeof(TestVModel_User))]

  >建议:
WCF穿透对象 尽量不要出现 List 和 Hash —— 可以的话 尽量用 T[] 和 Dictionary<K,
V>
  >警告:
使用 Hashtable 就是一个 不折不扣 的 埋坑行为。

——————————————————————————————————————————————————————

关于
WCF的 另类用法 几个方案:

  PS:
"穿透实体" = "视图实体"
  "数据实体"
指 保存有效数据的 实体对象

  >方案一
: WCF 传统用法 : 写服务端、生成客户端代理类
    >优势
:   代码简单;
         用
穿透实体 保护 数据实体;
    >劣势
:   数据类型 狭隘; 存在 不稳定因素;
         服务端改变,
所有 客户端代理类 需 重新生成 (最难维护 的 环节);

  >方案二
: WCF 穿透对象 只使用 byte[]
    >优势
:  通讯量小,速度快,类型广泛,数据稳定;不需要重新生成 代理类;
    >劣势
:  byte[] 反向解析 问题:
        
 >如果 是 反序列化 :则 要求客户端 存在 实体类程序集 —— 无法保护 数据实体;

  >方案三
: WCF 穿透对象 只使用 string
    >优势
: 通讯量小,速度快,数据稳定,跨Java等平台,不需要重新生成 代理类;
    >劣势
:  >只能兼容 XML 和 JSON 类型 —— 类型依然狭隘;
        >string
明文, 可能存在 安全问题;
        >需要客户端
反解析 JSON 或 XML 字符串 —— 代码多了一点;

  >方案四
:  >系统内网电脑 WCF 使用 byte[] —— 共享 实体类程序集
       >系统外网电脑
另外开辟 Web服务, 另外开辟 穿透实体;
    >优势
: 在 有安全机制 的 内网, 使用 稳定快速的 方式;
    >劣势
: 在 有风险   的 外网, 使用 另外的暴露 方式;

  最后
: 实体类程序集
    >只包含
视图实体类, 字段属性 —— 结构简单;
    >并不包含
逻辑代码, 被外部引用 —— 真的会有 安全风险 么?

  当然,
任何一种方案, 难度都差不多 —— 更多的都是 后期维护的 难度不同;

——————————————————————————————————————————————————————

关于
WCF的 维护测试:

  >如果
没有标记 [DataMember] :
  >如果
部分标记  [DataContract] 和 [DataMember] —— 则未标记 属性 会丢失(不会出现在
代理类中)
  >如果
不标记任何 [DataContract] 和 [DataMember]
    >且
不标记 [Serializable] —— 完全正常
    >若
标记  [Serializable] —— 所有属性名 都会被加上 __BackingField 后缀

  >如果
增加/减少 穿透对象的属性 :
    >减少
穿透对象 属性, 但是 代理类却没有更新 —— 客户端一切正常, 减少属性 无值
    >增加
穿透对象 属性, 但是 代理类却没有跟新 —— 客户端一切正常, (代理类 ExtensionData 有增加值)

  >如果
增加/减少 服务函数 :
    >如果
增加 服务函数 :
      >如果
新函数 返回 新穿透对象, 但是 代理类却没有更新 —— 客户端 在不掉用新函数时(客户端根本就没有新函数)
一切正常
    >如果
减少 服务函数, 但是 代理类却没有更新 —— 客户端 在不调用删除函数时 一切正常

  >如果
函数参数列表 增加/减少 函数参数 :
    >增加服务函数
末尾参数, 但是 代理类却没有更新 —— 客户端一切正常, 新参数 无值 (我已经被 彻底 雷死了)
    >新增服务参数
乱序参数, 但是 代理类却没有更新 —— 客户端一切正常, 新参数 无值 (我已经被 完全 雷死了)
    >减少服务参数
任意参数, 但是 代理类却没有更新 —— 客户端一切正常, 新参数 无值 (我已经被 无语了)
    >打乱服务参数,
但是 代理类却没有更新 —— 客户端传入参数 异常 :
      >如
:
      >最开始
服务端、客户端 参数表: testArg, testArg2, testArg3
      >服务端
修改为 testArg2, testArg, testArg3 —— 则 服务端 仅有 testArg testArg3
有值
      >服务端
修改为 testArg, testArg3, testArg2 —— 则 服务端 仅有 testArg testArg2 有值

  >结论
: WCF 的 稳定性&维护性 远远超过 我之前的 预期

——————————————————————————————————————————————————————

时间: 2024-11-14 06:48:10

『随笔』WCF开发那些需要注意的坑的相关文章

『随笔』Socket 链接 必须 上下行 同时使用

结论: > Socket 理论上 支持 只上行,或者 只下行. > 心跳包 必须是 上下行的 —— 心跳包请求(上行) - 心跳包响应(下行). > 如果 长时间 只有单向链接(只发送不接受,或者 只接受不发送) —— 路由器 就会 丢弃 Socket数据. > 心跳包 不是 必须的 —— 任意 上下行组合 都能 维持 Socket 所需的 软件(操作系统.程序).硬件(电脑.路由器,手机基站)的 有效性. 相关链接: http://www.cnblogs.com/lcw/p/35

WCF开发那些需要注意的坑 Z

执行如下 批处理:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\svcutil.exe" http://127.0.0.1:40001/TestService?wsdl /language:C# /out:"D:\TestProxy.cs" /config:"app.config""C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0

eclipse的安卓开发插件『ADT』在线安装不成功的解决方案

eclipse的安卓开发插件『ADT』在线安装不成功的解决方案:http://tieba.baidu.com/p/1887052563 android ADT下载地址:http://tools.android-studio.org http://www.ddooo.com/softdown/61744.htm

『电子书』分享一波码农必备编程开发类书籍[转]

layout: default title: 『电子书』分享一波码农必备编程开发类书籍[转] category: [技术, C/C++] comments: true --- 分享一些书籍 看到书籍很多,感觉很不错,就收藏下来了,是百度盘的连接,失效的可以评论一下以此更新一下连接. 书籍清单 Python编程快速上手 细说PHP(第2版) Python核心编程(第3版) Linux命令行与shell脚本编程大全(第3版) python高手之路 iOS编程(第4版) Python编程:从入门到实践

『腾讯后台开发』实习生技能要求

如题,应届生除了要良好地掌握算法和数据结构以外,以下一些技能点列表希望对大家有帮助,有兴趣的朋友可以参考这个针对性地补缺补差.文章列出的技能点有的要求熟悉,有的了解即可,注意技能点前面的修饰词.如果没有明确给出"熟悉""了解"等字眼,要求均为熟悉. 一.操作系统方面 多线程相关与线程之间同步技术 熟练使用(但不局限于)以下linux API linux下的线程创建.等待.获取线程id 1int pthread_create(pthread_t *thread, co

『数据库』随手写了一个 跨数据库 数据迁移工具

随手写了一个 跨数据库 的 数据迁移工具:>目前支持 SQLServer,MySql,SQLite: >迁移工具 可以自动建表,且 保留 主键,自增列: >迁移工具 基于 Laura.Source  ORM框架 开发: >迁移工具 支持 崩溃恢复(重启迁移工具,将会继续 未完成的 数据迁移): >每张表一个事务(即使  表中有 >100W 的数据,也是一个事务完成): >迁移后 的 自增列 和 原数据库 保持一致: 只是展示一下,直接上图片: 操作工具: 迁移工具

谈谈前端『新』技术

技术这个行当,永远会有新东西出来,不进则退.更关键的是,前端比起整个软件工程乃至计算机科学体系来说,是个相对新生草莽的领域,近年来前端生态的发展其实都是在向其他领域吸收和学习,不论是开发理念.工程实践还是平台本身(规范.浏览器).所谓的『根正苗红』的前端,不过是整个发展进程中探索的一个阶段而已,那个时代的最佳实践,很多到今天都已经不再适用.过往的经验固然有价值,但这些经验如果不结合对新事物本身的了解,就很难产生正确的判断.这里需要强调的是,学习新事物并不是为了不考虑实际需求的滥用,而是为了获取足

【转载】虫师『性能测试』文章大汇总

虫师『性能测试』文章大汇总 为了方便阅读,我重新整理本文,将包含本博客所有与性能测试有关的内容. ------------------------------------------- 近两年市面上的性能测试书籍很多了,但大部分书都在讲loadrunner的操作技巧项目与项目实践.我不认为有什么问题,因为loadrunner性能测试工具已经占据很大市场.loadrunner是非常的强大,但我们在做性能测试时,往往都以“loadrunner的模式”在思考如何进行性能测试.loadrunner只是一

『转』★嗨聊

前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前后端之间代码敲得飞起,从此由前端晋升为'前后端'. 图片来自G+ 本文将使用Node.js加web socket协议打造一个网页即时聊天程序,取名为HiChat,中文翻过来就是'嗨聊',听中文名有点像是专为寂寞单身男女打造的~ 其中将会使用到express和socket.io两个包模块,下面会有介绍