執行如下 批處理:
"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 的 穩定性&維護性 遠遠超過 我之前的 預期