再來,Silverlight執行在用戶端的瀏覽器上,ASP.NET則執行在伺服器端,故使用WebService上有很大的不同(權限、安全性)。Silverlight需要將存取機制的程式段放在「資料存取服務層」來遠端呼叫。網路上的應用需要注意到Server在預設是無法跨Domain的,需要透過ClientAccessPolicy.xml或CrossDomain.xml(這兩個檔案,網路上搜尋到之後,直接下載來用就行了)來達成,再者安全性也是需要顧慮的,可以透過SSL來加強。
接下來,可以逐步來實踐出可以實用,可以發佈到IIS上的WCF應用了。
一、在方案內的Web專案加入新項目,加入「有Silverlight功能的WCF服務」,這裡當然也可以加入「WCF服務」,兩者差異大概除了一個是僅建立Interface而已,再者在binding="wsHttpBinding這個設定上,一個是標準的,一個是為了SilverLight而特製修改的,使用標準的,才能讓這個WCF跟一般的WCF相容,但使用上會有問題(可能是讓Silverlight跨Domain會無法呼叫使用此WCF)。
二、WCF建立好之後,將方案重新建置,WCF的設定才會被建立起來,假設建立的WCF名稱是Service_TestAg,那在Web專案當中會看到新增了Service_TestAg.svc跟Service_TestAg.cs,點開.cs檔,就可以看到屆時可以被呼叫的Method,預設叫做 void DoWork(),可以自己修改參數、名稱、回傳型態,也可以增加更多的Method。
三、在方案內的Silverlight專案加入服務參考,選擇「探索」,會列出目前Local所有的WCF服務,還可以再點開確認可作業的Method。底下的命名空間,命名好之後,會在之後的Silverlight的撰寫當中會用到,所以不要亂命名,這裡,我們假設你設定的名稱是ServiceRef_Test。如果設定好之後,在「方案總管」畫面,就會看到一個Service References資料夾,裡面會有剛剛命名好的服務參考。機制上,就是透過代理物件,來呼叫後端的WCF服務,內部詳細書上並沒有講得很清楚,只知道是利用ServiceReferences.ClientConfig來達成,所以暫時是個黑箱。
四、接下來就是WCF的使用了,我們在Silverlight的Page裡面要呼叫使用WCF的地方(比方按鈕事件),產生WCF的物件來用,語法是ServiceRef_Test.Service_TestAgClient Wcf_Test = new ServiceRef_Test.Service_TestAgClient() ;是的,我們並不是用Service_TestAg這個服務名稱,也不是用ServiceRef_Test這個參考代理名稱來產生物件,而是用參考內的xxxxxxxxxClient來產生,為什麼?我不知道,我只知道,這是他內部一些機制作掉之後的結果,只好背下來了。然後因為呼叫服務是透過非同步的方式來達成,所以呼叫之後,網頁不用在那邊等待,遠端回應的時候呼叫Method來做事就好了。怎麼做呢?我們需要綁定一個特定Method讓呼叫完成之後得以藉由事件觸發這個特定Method。
五、如果你要呼叫的Method叫做DoYourWork( ),則這裡要綁定的Method則叫做DoYourWorkCompleted,而Visual Studio提供我們很方便的建立方式,讓我們可以很快速方便的建立出Wcf_Test.DoYourWorkCompleted += new EventHandler<SL_APP_Test.ServiceRef_Test.DoYourWorkCompletedEventArgs>(Wcf_Test_DoYourWorkCompleted);這個長到不行的一行程式。只要輸入Wcf_Test這個物件名稱,按下句點「.」就可以選到DoWorkCompleted這個事件,然後按下 += 然後按下Tab,就會自動產生上述的一行程式,注意,這時候會看到那一行還是顯示錯誤,編譯也不會過,因為這個DoWorkCompleted事件並沒有被宣告出來,我們還得做這個事件。
六、建立Wcf_Test_DoYourWorkCompleted這個Method,需要注意的是,這個Method的第二個參數必須跟第五點那個落落長的那一行程式裡面的<SL_APP_Test.ServiceRef_Test.DoYourWorkCompletedEventArgs>一樣
private void Wcf_Test_DoYourWorkCompleted( object sender, SL_APP_Test.ServiceRef_Test.DoYourWorkCompletedEventArgs e )
{
// 當收到回應並完成之後,你想做什麼?寫在這裡
// 可以控制UI物件 }
七、當上述的關連都建立好之後,最後,呼叫DoWorkAsync( )就能呼叫你撰寫的Method:DoWork( )