Silverlight中動(dòng)態(tài)獲取Web Service地址
2024-09-06 20:41:34
供稿:網(wǎng)友
在使用WCF或者WS進(jìn)行數(shù)據(jù)庫(kù)操作的時(shí)候都需要有一個(gè)明確的服務(wù)地址,如果是WCF就是svc文件地址。初學(xué)者通常會(huì)直接使用VS的Add Service Reference來(lái)添加引用。這的確是十分方便的手段,但是這樣會(huì)帶來(lái)什么樣的麻煩呢?
第一,在開發(fā)的階段一旦改變了WS文件的目錄結(jié)構(gòu)就必須改變SL工程中的WS地址,而且這種改變并不是單純的Update Service Reference這么簡(jiǎn)單,因?yàn)榈刂芬呀?jīng)改變了,你必須刪掉舊的Reference來(lái)添加新的Reference,這是其一。
第二, 當(dāng)項(xiàng)目開發(fā)完成要部署上去服務(wù)器時(shí)大問題就來(lái)了。如果在開發(fā)的時(shí)候是用VS的Add Service Reference來(lái)添加引用的話,系統(tǒng)會(huì)自動(dòng)生成一個(gè)ServiceReferences.ClientConfig的配置文件,里面記錄著WS的地址和緩存、連接時(shí)長(zhǎng)之類的信息,要命的是這個(gè)配置文件是連同SL工程一并打包進(jìn)xap文件里面的,也就是說(shuō)一旦項(xiàng)目部署到了服務(wù)器上之后就不能再改WS的地址了。這對(duì)項(xiàng)目的遷移,服務(wù)器IP地址的變動(dòng)都帶來(lái)十分不利的影響。
這里介紹一種動(dòng)態(tài)獲取WS地址的方法,這種方法不依賴于 ServiceReferences.ClientConfig文件。雖然說(shuō)不依賴于配置文件,但是開發(fā)者仍然需要使用VS的Add Service Reference來(lái)添加一次引用,用于生成SL端的操作代碼。好了,進(jìn)入正題,下面是用于生成WSClient的類
代碼如下:
public class ServiceUtil
{
public static string SVCPath { set; get; }
/// <summary>
/// Get Data Service path
/// </summary>
/// <returns>path</returns>
public static WorkflowServiceClient GetDynamicClient()
{
if (SVCPath == null)
throw new Exception("Wrong SVC Path!");
BasicHttpBinding binding = new BasicHttpBinding(Application.Current.Host.Source.Scheme.Equals("https", StringComparison.InvariantCultureIgnoreCase) ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
binding.MaxReceivedMessageSize = int.MaxValue;
binding.MaxBufferSize = int.MaxValue;
return new WorkflowServiceClient(binding, new EndpointAddress(new Uri(Application.Current.Host.Source, SVCPath)));
}
}
上面ServiceUtil類中有一個(gè)靜態(tài)的字符串變量,用來(lái)保存WS文件路徑;然后下面的GetDynamicClient方法就是把SL應(yīng)用的宿主網(wǎng)站uri與WS文件路徑組合起來(lái)形成完整的WS引用URL。這里這個(gè)靜態(tài)變量SVCPath通常是在使用WS操作前賦值,而具體的值可以通過網(wǎng)站W(wǎng)eb.config文件的appsetting中字段中傳過來(lái),至于怎么在SL工程中獲取aspx頁(yè)面的參數(shù)的問題,我在上一篇隨筆中有寫到,大家可以參考一下。