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 的 穩定性&維護性 遠遠超過 我之前的 預期


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM