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.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-10-13 17:21:53

WCF开发那些需要注意的坑 Z的相关文章

『随笔』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.0

iOS开发中遇到过的坑

iOS开发中遇到过的坑 前言 做iOS开发这么长时间以来,遇到过不少难题,也踩过不少坑,本来没想过要写这篇文章,但是鉴于以下三点,笔者决定对遇到过的并且还能回忆起来的问题做个记录. 每次问题解决后,满满的成就感,但是当下一次再遇到时,又是一脸懵逼.这个问题我好像见过,但就是不记得怎么解决,记录下来方便以后查阅. 每次面试的时候,面试官总会问我,你在开发中遇到过哪些问题,怎么解决的?问题嘛,挺多的,但是你要我叙述嘛,我......我......我居然一时想不起来,迷之尴尬????(面试官当时想法:

总结关于iOS室内定位开发踩过的一些坑。。。

直接正题,没得BB 首先说明一下室内定位从架构上严格来讲分为3步: 1.室内地图以及室内地图能相关的一些成熟API 2.以任意方式来获取室内定位的坐标 3.将室内定位的坐标转化成室内地图的API或者一种能兼容两者的转换方式 (可选)4.定位稳定性的滤波处理,试定位坐标点不出现 跳点.卡顿.掉帧.北偏角指向性错误等影响用户体验的处理方案 目前市场中室内定位资源比较散乱,主要分为地图供应商和定位服务商两种,也有将室内定位资源合并的企业,比如 某石科技 所以要是想对室内定位有研究的最好还是需要多方了解

记一次SpringBoot 开发中所遇到的坑和解决方法

记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型包空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Integer便为null,这时候将Interger自动转型为int,则会出现空指针异常 这个时候,我们可以在Service层对Integer的数据进行判断,如果为空,就把它复制为0 // 在pojo中,如果Integer canJoinNun为null 就把值设置为0 if (publishMsg.getC

WCF 开发实战系列 (一)

也许有读者会说,为什么要谈 WCF?近期不是 Web API 比较热门?在这个手机.Devices 当道的现在,究竟有什么地方会需要使用到 WCF 呢? 的确,现在访间你能找到的课程,或者您可能参与某项目的实践 (网页应用程序.手机 APP 也好),你需要的通常也都是提供 Services 层,而这个 Services 层通常也就是 Web API.那么,难道 WCF 就无用武之地?其实也不是,看什么情况用什么技术,有一些地方是 Web API 无法做到的 前言 也许有读者会说,为什么要谈 WC

WCF开发笔记 高版本.Net的坑

高版本.Net的坑 开发环境 .Net 4.5.1Visual Studio 2015RCWindows 8.1SQL Server 2005 sp1 运行环境 .Net 4.0 enWindows Server 2003SQL Server 2005 sp1 现象 WCF客户端,开发环境测试正常.发布到运行环境后,提示Type 'System.Threading.Tasks.Task`1[XMRBI.ERoad.Contracts.ServiceResponse]' cannot be ser

iOS开发:集成支付宝(遇见的坑和便捷撸代码)

开发iOS最重要的就是支付了,天朝之内最常用的就是支付宝了,下面就以自己的经历说明如何集成支付宝+遇见的坑. 首先,集成支付宝最好别使用Cocoapods,很多人都说使用起来很方便,可是我每次只要使用Cocoapods导入支付宝SDK,总是出现各种莫名其妙的错误,并且还每次都不一样,最终,我只能手动导入. 其实可以使用ping++和其他更为方便.如 http://winann.blog.51cto.com/4424329/1601654 https://www.pingxx.com/ 以自己集成

Android 开发中踩过的坑之十一: 团队协作的坑

工作中,android的坑很多,一部分是android源码自身的逻辑陷阱, 但跟多的是自己和同事们由于种种原因埋下的坑. 提高面向对象的能力,并恰当的实现在代码中,能够极大的减少坑人和被坑几率. 面向对象的最大特征是复用, 复用的目的是减少工作量,减少错误几率,提高工作效率. 总结几个自己的体会,以自勉: 1 在编码前明确代码的模块框架, 定义最简单的接口. 有人也许说, 书生造反,十年不成, 在工期紧张或者其他类似敏捷编程的大背景下, 先干起来才是硬道理. 事实上, 工期紧张也许正是因为之前的

讲讲我在Windows10(uwp)开发中遇到的一些坑.

7月29日发布的Windows10正式版,当天安装好以后,在网络不太好的情况下,经过多次尝试终于装上了Visual Studio 2015和Windows 10 10240的SDK.这两周一直在开发UWP,讲讲在其中遇到的一些坑,不定时更新,有兴趣的可以关注下. 1.DataType在UWP中缺失的问题 在WPF中使用过MVVMLight的都知道,我们可以在App.xaml文件中通过DataType将ViewModel和View绑定在一起. 1 <DataTemplate DataType=&quo