2010年6月30日 星期三

在Silverlight中透過WCF存取Session資料

有一些程式碼,是屬於『簡單,但是很重要』的部分。像現在我們的這個範例就是。
在上課時不只一個學員(嚴格說起來有很多很多學員),都很關心Silverlight和ASP.NET的整合,不論是資料的交換,或是ASP.NET頁面上的互動和整合,由於Silverlight以透過ActiveX插件的形式崁入網頁中,使得學員以為要進行資料交換很困難或是完全不行。

這真可是誤會大了,對於Silverlight來說,與遠端(伺服器端)溝通的方是最典型的就是透過WCF Services(當然,傳統的Web Services也行),所以只要透過在Silverlight場景中呼叫WCF Services,就可以輕易的存取Session資料。

例如,你可以建立一個底下這樣的WCF Services:

namespace AccessSessionViaWcfServices.Web
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
[OperationContract]
public string GetSession(string SessionName)
{
// Add your operation implementation here
return System.Web.HttpContext.Current.Session[SessionName].ToString() ;
}

[OperationContract]
public bool SetSession(string SessionName,string SessionValue)
{
// Add your operation implementation here
System.Web.HttpContext.Current.Session[SessionName] = SessionValue;
return true;
}
}


關鍵在於這個Wcf services請務必選擇Silverlight-enabled WCF Services:

同時透過 System.Web.HttpContext 即可存取與傳統 HttpContext有關的資訊。

建立好Services之後,即可在Silverlight當中以非同步方式呼叫:

private void button1_Click(object sender, RoutedEventArgs e)
{
ServiceReference1.Service1Client srv = new ServiceReference1.Service1Client();
srv.GetSessionCompleted += (s, para) =>
{
this.textBox2.Text = para.Result;
};
srv.GetSessionAsync(this.textBox1.Text);
}

即可輕易的取得Session的值,進而與ASP.NET交換資料,還可以利用這樣的機制處理帳號登入的問題,讓Silverlight也可以輕易的撰寫出具有與ASP.NET相容的登入與權限機制。

完整的範例程式碼請參考[CodeStorage]

沒有留言: