輕松掌握Silverlight取數(shù)方案
Silverlight的應(yīng)用并不是非常容易的。其中包含了許多技巧供我們在實(shí)際使用中去慢慢的探討。在這里就先為大家介紹一種Silverlight取數(shù)方案的簡便實(shí)現(xiàn)方法,希望能幫助大家提高開發(fā)效率。#t#
最近一直在做Flash交互相關(guān)的東西。主要思想就是在Flash聲明的中放入取數(shù)的URL,Flash控件中自己去請求這個URL。然后我們C#代碼只需在這個URL指定的頁面Response.Write拼好的數(shù)據(jù)XML字符串就行了。
其實(shí)這樣干凈利索的取數(shù)方案一樣也適合在Silverlight中使用。這種方法可以避開使用笨重的WCF服務(wù),但其能夠處理的問題范圍較窄所以我把它稱為Silverlight的輕量級取數(shù)方案。
那么下面我們就來詳細(xì)說說這種Silverlight取數(shù)方案。
首先我們要在使用到這個Silverlight控件的頁面中加入取數(shù)的URL,這個URL往往都是動態(tài)的(根據(jù)部署環(huán)境的不同URL不同)。所以我們要在aspx.cs里處理這個URL,用輸出到aspx前端。
- < param name="InitParams"
value="< %= DataUrl %>" />
需要注意的是InitParams和其后面的value形式(key=value)都是固定的。不熟悉的請參閱SL相關(guān)文檔。后臺代碼很簡單。DataUrl其實(shí)就是這個aspx頁面的一個屬性。
- public string DataUrl
- {
- get
- {
- return GetUrl();
- }
- }
- protected void Page_Load(object
sender, EventArgs e)- {
- }
- private string GetUrl()
- {
- string url = System.Web.HttpContext.
Current.Request.Url.AbsoluteUri;- urlurl = url.Replac("Default.aspx",
"Data/output.aspx");- url = string.Format("data={0}", url);
- return url;
- }
上面Silverlight取數(shù)方案代碼中我們可以看出,我的用來輸出數(shù)據(jù)的頁面其實(shí)就是Data目錄下的output.aspx。
這里的代碼就要根據(jù)業(yè)務(wù)邏輯不同,也就是說數(shù)據(jù)不同來構(gòu)造你的數(shù)據(jù)xml了。作為示例我只是簡單的輸出了一段xml。
- public partial class output :
System.Web.UI.Page- {
- protected void Page_Load(object
sender, EventArgs e)- {
- string data = "yza1yza2";
- Response.ContentType = "text/xml";
- Response.Clear();
- Response.Write(data);
- }
- }
那么下面最關(guān)鍵的就是我們在Silverlight中怎么請求這個頁面并獲得數(shù)據(jù)呢?這里HttpWebResponse,HttpWebRequest類可以幫助我們。
首先在你的App啟動時要把InitParams中的Url取出來放到App的實(shí)例變量中。
- private void Application_Startup
(object sender, StartupEventArgs e)- {
- DataUrl = e.InitParams["data"];
- this.RootVisual = new MainPage();
- }
下面是具體的請求和接受數(shù)據(jù)的Silverlight取數(shù)方案代碼。
- public MainPage()
- {
- InitializeComponent();
- string url = ((App)Application.Current).
DataUrl;- HttpWebRequest request = (HttpWebRequest)
HttpWebRequest.Create(url);- request.BeginGetResponse(new AsyncCallback
(RequestReady), request);- }
- public void RequestReady(IAsyncResult result)
- {
- HttpWebRequest request = (HttpWebRequest)
result.AsyncState;- HttpWebResponse response =(HttpWebResponse)
request.EndGetResponse(result);- Stream stream = response.GetResponseStream();
- using (StreamReader sr =
new StreamReader(stream))- {
- string str = sr.ReadToEnd();
- txt.Dispatcher.BeginInvoke(() =>
{ txt.Text = str; });- }
- }
我們用到HttpWebRequest和HttpWebResponse異步的請求和接受數(shù)據(jù)。并把收到的xml字符串裝進(jìn)TextBox里。Demo就這么簡單。
但如果我們往深了想一想,這種Silverlight取數(shù)方案的方式避免了WCF中的很多麻煩,可以稱得上干凈利索。同時這種方法要想發(fā)揮最大作用就要配合SilverlightDataSet使用了(關(guān)于SilverlightDataSet請見我前面的那片Silverlight傳遞DataTable終極解決方案的Blog)。要說缺點(diǎn)嘛估計(jì)也有,就是如果傳遞實(shí)體類你得自己處理序列化和反序列化得問題,還有就是傳遞的xml很大時要進(jìn)行壓縮或分段。