天天看點

Flex4中使用WCF

WebService完全可以用"以BasicHttpBinding方式運作的WCF"代替。經過我的實際測試:對于基本類型(比如int,string,datetime以及它們對應的arrry以list),flex調用時能正确識别并“翻譯”成as3中對應的int,String,Date以及Array類型,而複雜類型(比如自己在c#中定義的實體類或DataTable),flex調用時會報錯,這類複雜類型我建議在wcf中用序列化技術處理成String後再傳回。

考慮到xml格式序列化後的資訊量比較大,我傾向于選擇json這種輕量級的格式,而且在.net4.0中新增了System.Runtime.Serialization.Json;能處理大多數的複雜對象序列化(但是DataTable處理不了)

為了友善起見,我把一些序列化/反序列化的操作封裝了一下:

不過,在開始正文之前,先提醒一下System.Runtime.Serialization.Json在序列化中要注意的問題:

比如有一個類Person,定義如下:

對象

序列後的字元串為

{"_age":30,"_name":"jimmy.yang","_salary":5000}

注意:這裡并不是我所期待的{"Age":30,"Name":"jimmy.yang","Salary":5000},其實出現這樣的結果也可以了解,因為屬性的set,get内部就是方法調用,是以最終序列化的隻是私有字段。但是如果把[Serializable]标志去掉,确能得到正确的結果:{"Age":30,"Name":"jimmy.yang","Salary":5000} 不知道這個算不算是System.Runtime.Serialization.Json的一個bug.

實際flex應用中,用于傳輸的實體類99%以上儲存的隻是一些正常的基元類型(即int,string,date之類),是以為了避免上面提到的問題,我建議:

1、實體類定義中隻使用基本類型,去掉[Serializable]

2、或者直接把執行個體成員用類似public string Name;的方式暴露出來,不過估計大數多酷愛OO的同學們要吐血了.

ok,切入正題吧:

1、先建立一個asp.net項目,然後添加一個wcf service,檔案命名為:Sample.svc,對應的後端代碼檔案Sample.svc.cs内容如下:

2、建立flex項目,然後在Data/Services面闆中,添加一個webSerivce的引用

Flex4中使用WCF

點選Next之後,出現下面的界面

Flex4中使用WCF

設定wcf所在的WSDL URI後,一路next,最終Data/WebServices面闆會變成下面這樣

Flex4中使用WCF

注意上圖中右側工具欄上的幾個小按鈕,自己去試試吧,會有意外發現哦

同時flex會生成幾個as類檔案(類似于wcf中svcutil.exe在client端自動生成的cs檔案)

Flex4中使用WCF

剩下的事情,就很容易了,在mxml中測試一番,代碼如下:

後記:在實際開發中發現flex ide環境對于wcf的wsdl解析要比asmx慢不止N倍,但是一旦解析完成,生成相應的as類後,在運作時二耆速度相同。