這一篇將介紹如何讓Silverlight在事件觸發之後傳輸資料給PHP的SOAP web service.

STEP1: 在VS2010的Silverlight專案按右鍵 > Add Service Reference

step3

STEP2: 確認你的wsdl 已經上傳到web server上之後, 將他的路徑輸入在 "Address"的欄位之中. 並按下 "Go", 就可以看到ageService的SOAP出現在Services的欄位中.

此外, 為了方便起見, 我們也將Namespace命名程成 "AgeService" (這名字將會在xaml.cs中再度用到)

step4

Step3 : 按下OK之後就會發現專案檔中出現兩個新的檔案, 一個是AgeService, 另一個是config檔. 雙擊config檔.

step5

Step4: 你會發現剛剛設定的東西已經被記錄到Config檔裡面去了.

step6

STEP5: 接下來是處理XAML.CS中的事件, 其中包含了兩個function的CODE:

namespace SilverlightApplication2
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {

            AgeService.ageServicePortTypeClient client = new AgeService.ageServicePortTypeClient();
            client.getAgeCompleted += new EventHandler(client_getAgeCompleted);
            client.getAgeAsync(txtName.Text);
            HtmlPage.Window.Alert(txtName.Text);
        }

        void client_getAgeCompleted(object sender, SilverlightApplication2.AgeService.getAgeCompletedEventArgs e)
        {
            HtmlPage.Window.Alert(e.Result.ToString());
        }
    }
}

STEP6: 將Silverlight Application再BUILD一次, 並將新的XAP檔上傳到遠端主機上.

STEP7: 再RUN一次index.php, 並輸入關鍵字 "alfie" 則輸出"27″, 這樣就大功告成了!
last

檔案之間的對照表:
comparison

在網路上搜尋關於初學者以PHP處理Silverlight的教學文章不多,

但就以這篇我測試後是OK的,

所以在這裡希望能用中文簡略的來重新記錄一遍.

測試環境:

  • Windows Server 2008 IIS 7.0
  • FastCGI (PHP環境)
  • PHP 5.2.14 (必須開 soap 與 xmlrpc的模組)
  • Silverlight 4 (確認你的CLIENT已經安裝好silverlight, 其實就像裝Flash Player那麼簡單)

使用的Tools:

  • Visual Studio 2010
  • Silverlight 4 tools
  • PHP IDE (都可)

使用到的檔案:

  • index.php: 顯示silverlight的頁面, 其實對silverlight不熟悉的人可以把它想成是Flash的swf檔, 就像把swf用HTML的object 包起來然後指定路徑顯示而已.
  • ageService.php: 使用者自己寫的class檔, 還有開啟SOAP的程式也會記錄在裡面
  • ClientBin/SilverlightApplication2.xap: 當你用Visual Studio 2010編輯完成後Build出來的就是一個放在ClientBin的xap檔, 事實上在PHP的環境裡, 你只要把xap上傳就可以了, 起他的xaml檔都是原始碼, 讓你日後維護修改再Build的時候可以用到.
  • ageService.wsdl: 這是根據W3C制定的一種XML格式, 內容其實就是告訴SOAP可以接受甚麼, 可以傳送甚麼, 格式是甚麼, 將會吃進甚麼CLASS. 這個檔案將會在ageService.php裡面被拿來用.

index.php內容如下:
source的部分指定了xap檔的路徑, 吃進這個檔案基本上就可以顯示Silverlight的內容了.

indexphp

ageService.php內容如下:

ageService這邊顯示了使用者自訂的Class, 以及如何使用PHP來啟動SOAP服務. 這裡的class只是使用了一個簡單的IF範例. 若使用者輸入的字串為"alfie"則回傳"7″給SILVERLIGHT程式; 若使用者輸入"catherine", 則回傳"21″給SILVERLIGHT程式. 一般來說, 這裡的CLASS大部分都是用來處理MYSQL所讀取的資料. 為了簡單示範, 這裡就不用太複雜的範例了.

ageServicephp

ageService.wsdl內容如下:

仔細看這個XML的內容可以發現他REQUEST是吃進一個STRING, 然後回復的時候是回傳一個INT,
getAge是使用者自訂Class的function, 而這篇教學的重點也是圍繞在這個getAge function.
要注意的是wsdl的內容也要指定SOAP Service的路徑, 也就是web伺服器的php位址.

wdsl

ClientBin/SilverlightApplication2.xap :

xap是由一連串步驟所形成的, 步驟如下:

1. 建立基本的silverlight介面, 可透過編輯XAML檔來達成, 內容就是簡單的Textbox與一個按鈕, 我們希望做到當使用者按下按鈕的時候會顯示使用者輸入的內容, 所以要透過event_handler來處理, 也就是在button中加入一個attribute: Click. 方法很簡單, 只要在Design頁面點兩下Button 就會跳到事件處理的頁面, 畫面如步驟2.

xaml

2. 事件處理寫法:

每個xaml底下都會有一個.cs或者.vb檔, 取決於你一開始選擇的語言(所以基本上還是要學會一點VB跟C#的寫法的), 點兩下cs檔一樣可以到達事件的處理頁面.

xamlcs

MainPage.xaml.cs: 底下紅色框框的程式當使用者按下button之後會跳出Javascript的alert視窗, 並顯示txtName的內容. 淺色紅色框框的部分是待會會繼續討論的部分這裡先帶過.

xamlcs2

接下來就把XAML等資料BUILD一次:

step1

這樣一來再ClientBin裡面就有了最新的XAP檔

step2

將這個XAP檔上傳到WEB SERVER上後, 瀏覽index.php看看

result1

Silverlight成功跑起來了!接下來我們要試試用PHP與Silverlight做溝通.

請按此看下篇


範例1:
把所有在Request.QueryString("這裡不管") 取代成 Anti_injection(Request.QueryString("這裡不管"))

尋找:

Request\.QueryString\(\"(.*)\"\)

取代:

Anti_injection(Request.QueryString("$1"))

範例2:
把所有在Request.QueryString("只處理變數名稱") 取代成 Anti_injection(Request.QueryString("只處理變數名稱"))

尋找:

Request\.QueryString\(\"([A-Za-z0-9_]+)\"\)

取代:

Anti_injection(Request.QueryString("$1"))

參考資料:
http://www.adobe.com/devnet/dreamweaver/articles/regular_expressions.html