(15)Visual Studio中使用PCL項目加入WCF WebService參考

原文 Visual Studio中使用PCL項目加入WCF WebService參考git

Visual Studio中使用PCL項目加入WCF WebService參考
做者:Steven Chang 2015/01
 

APP在應用時常常會用到WebService服務,在Xamarin中若同時要讓iOS與Android叫用WebService時, 除了分別在iOS與Android中叫用WebService外, 還可使用PCL項目(portable library class,中文叫可攜式類別庫), 並使用VisualStudio中的加入服務參考的方式快速度創建出WebService服務。github

假設咱們現有一個WCF Service服務,小小修改了一下預設提供的方法以下程序代碼:web

public string GetData(int value)
{
return string.Format("WebService說:你輸入的數值爲: {0}", value);
}架構

而後咱們分別創建Android、iOS以及PCL三個項目,並讓Android與iOS都參考到PCL項目,以下圖:異步

接着咱們在PCL項目中,使用加入服務參考的方式將WebService加入參考中, 若是有成功找到服務就能夠看到先前步驟中所創建的GetData方法,按下肯定後加入參考。async

至此步驟時, 咱們已經能夠在Android或iOS項目中叫用加入服務參考後工具所幫咱們創建出的Proxy Class, 不過咱們都使用了PCL項目了,固然能夠將呼叫WebService的動做也寫在PCL內, 在PCL項目中創建一個叫作MyService的類別, 並創建一個GetData方法讓它的參數與回傳值與Service上的GetData相同,以下程序代碼:工具

namespace WebServiceDemo.Service
{
public class MyService 
{
public string GetData(int value)
{this

}
}
}spa

在PCL的GetData方法內,就能夠開始撰寫呼叫Service的代碼段了, 首先一樣的咱們要創建出Proxy類別爲Service1Client,與在通常C#使用上不一樣的是, 在Xamarin中預設並不支援App.config這類檔案的讀取(意指System.Configuration.*不存在), 因此咱們要在建構子內傳入EndpointAddress和Binding,並在EndpointAddress內定義WebService的位置,以下程序代碼:.net

var binding=new BasicHttpBinding( BasicHttpSecurityMode.None);
var address=new EndpointAddress("http://testmyws.azurewebsites.net/Service1.svc");
Service1Client service = new Service1Client(binding, address);

創建出proxy類別後,就能夠叫用服務中提供的方法了,這時你會發現,只有異步的方法能夠呼叫,以下圖:

沒錯,在PCL中使用創建WebService服務時,只提供異步的方法可使用, 而這種在呼叫方法尾部加上Async以及用來通知結果對應的方法事件名稱尾部加上Completed的方式, 稱爲事件架構異步模式(EAP,全名是Event-based Asynchronous Pattern..不用特別記~知道就好), 所以咱們要在MyService中也創建一個Event供外部呼叫? 不須要這麼麻煩,在C#5.0後多了async和await關鍵詞, 進而衍生出了以工做爲基礎的異步模式(TAP,Task-based Asynchronous Pattern), 所以咱們可使用TaskCompletionSource類別將EAP模式轉換成爲TAP模式,以下代碼段:

var task = new TaskCompletionSource<string>();
service.GetDataCompleted += (sender, e) =>
{
if (e.Cancelled)
task.TrySetCanceled();
else if (e.Error != null)
task.TrySetException(e.Error);
else 
task.TrySetResult(e.Result);
};
service.GetDataAsync(value);
return task.Task;

改成TAP模式後必須將該方法的回傳值改成Task:

public Task<string> GetData(int value)

最後咱們以Android爲例,創建MyService類別而且呼叫GetData方法, 因GetData回傳爲Task類型,咱們會用到await關鍵詞,所以要在呼叫的方法也加上async關鍵詞,以下:

MyService service = new MyService();
button.Click +=async (sender,e)=>
{
var result =await service.GetData(999);
Toast.MakeText(this, result, ToastLength.Long).Show();
};

兩個平臺分別以仿真器執行的結果如圖:

相關文章
相關標籤/搜索