Sử dụng WCF Service trên Windows Phone 8.1
Trong bài viết trước các bạn đã biết cách viết và cấu hình các WCF REST Service để có thể sử dụng được trên các ứng dụng Mobile. Nếu bạn chưa biết cách sử dụng WCF REST Service hãy cùng xem lại bài viết này:
Cách tạo WCF Service trả về JSON dùng cho Mobile App
Trong bài viết này chúng ta sẽ cùng tìm hiểu phần còn lại đó là cách thức sử dụng WCF REST Service trong Windows Phone 8.1
Mở đầu
Trước đây trên Windows Phone 7, Windows Phone 8, Windows 8.1 cách thức sử dụng các WCF Service tương đối dễ dàng chỉ cần Add Service Reference là có thể gọi được luôn các hàm đã được định nghĩa trong WCF Service này. Lên phiên bản Windows Phone 8.1 mọi thứ có vẻ hơi khác lạ một chút vì sẽ có 2 cách thức khác nhau để xây dựng ứng dụng cho Windows Phone đó là sử dụng core Silverlight hoặc Windows Runtime. Các bạn có thể xem qua bài viết sau để hiểu rõ hơn về 2 cách thức này: Phát triển ứng dụng Windows Phone 8.1 có gì mới?
Chúng ta sẽ cùng đi tìm hiểu chi tiết cách sử dụng WCF Service với source code chính là ví dụ demo trong bài trước có 2 hàm là GetMessage và PostMessage.
Sử dụng WCF Service trên Windows Phone 8.1 Silverlight
Đầu tiên chúng ta sẽ nói về cách sử dụng WCF Service trên Windows Phone 8.1 Silverlight. Cách thức này đều có thể áp dụng được trên Windows Phone 7, Windows Phone 8, Windows 8.1 App hoặc từ Desktop App (WinForm), Web App (ASP.NET, ASP.NET MVC…)
Đầu tiên chúng ta sẽ nói về cách sử dụng WCF Service trên Windows Phone 8.1 Silverlight. Cách thức này đều có thể áp dụng được trên Windows Phone 7, Windows Phone 8, Windows 8.1 App hoặc từ Desktop App (WinForm), Web App (ASP.NET, ASP.NET MVC…)
Bước 1: Trong solution WCFRESTDemo ta tạo Project Windows Phone 8.1 Silverlight như hình dưới:
Bước 2: Ctrl-F5 để chạy WCF Service lên, mục đích của bước này là để tìm được service khi Add Reference ở bước tiếp theo
Bước 3: Right-click vào References và chọn Add Service Reference. Sau đó ta nhấn Discover để tìm các service trong cùng Solution. Ta sẽ thấy WCFRestDemo service xuất hiện, ta tiến hành đặt tên Namespace service là WCFDemo và nhấn OK
Bước 4: Qua 3 bước trên ta đã chuẩn bị xong được kết nối đến WCF Service. Tiếp theo ta cần thiết kế giao diện ứng dụng Windows Phone để gọi các hàm trong service này. WCF Service này chỉ có 2 hàm đơn giản nên ta sẽ thiết kế thêm 2 button trên giao diện MainPage.xaml và đổi tên App và tên Page như sau:
<StackPanel x:Name="TitlePanel"
Grid.Row="0"
Margin="12,17,0,28">
<TextBlock Text="Tungnt.net WP8.1 Siverlight App"
Style="{StaticResource PhoneTextNormalStyle}"
Margin="12,0" />
<TextBlock Text="WCF Demo"
Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}" />
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel"
Grid.Row="1"
Margin="12,0,12,0">
<StackPanel Orientation="Vertical">
<Button Name="btnGetMessage"
Content="GetMessage"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
/>
<Button Name="btnPostMessage"
Content="PostMessage"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
/>
</StackPanel>
</Grid>Bước 5: Trên Designer Double-Click vào 2 button để xử lý click event của 2 button này. Ta gọi đến 2 hàm GetMessage và PostMessage của WCF Service như bên dưới
<Grid x:Name="ContentPanel"
Grid.Row="1"
Margin="12,0,12,0">
<StackPanel Orientation="Vertical">
<Button Name="btnGetMessage"
Content="GetMessage"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Click="btnGetMessage_Click" />
<Button Name="btnPostMessage"
Content="PostMessage"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Click="btnPostMessage_Click" />
</StackPanel>
</Grid>private void btnGetMessage_Click(object sender, RoutedEventArgs e)
{
WCFRestDemoClient client = new WCFRestDemoClient();
client.GetMessageCompleted += client_GetMessageCompleted;
client.GetMessageAsync();
}
void client_GetMessageCompleted(object sender, GetMessageCompletedEventArgs e)
{
if (e.Error == null)
{
MessageBox.Show(e.Result);
}
}
private void btnPostMessage_Click(object sender, RoutedEventArgs e)
{
WCFRestDemoClient client = new WCFRestDemoClient();
client.PostMessageCompleted += client_PostMessageCompleted;
client.PostMessageAsync("Nguyen Thanh Tung");
}
void client_PostMessageCompleted(object sender, PostMessageCompletedEventArgs e)
{
if (e.Error == null)
{
MessageBox.Show(e.Result);
}
}Đến đây mọi thứ đã xong xuôi, right-click Set Startup Project là ứng dụng Windows Phone rồi nhấn F5 để hưởng thụ thành quả.
Click thử vào button GetMessage chúng ta sẽ thấy thay vì hiển thị message trả về từ WCF Service thì sẽ có lỗi xảy ra như hình dưới
Lỗi này là do ở trong ví dụ bài trước chúng ta mới chỉ cấu hình WCFRestDemo service có 1 Endpoint binding webHttpBinding trả về JSON nên không thể sử dụng được với cách Add Service Reference này. Muốn sử dụng được ta phải bổ sung 1 Endpoint nữa với binding là basicHttpBinding trả về dữ liệu kiểu SOAP/XML vào trong file web.config ở project Tungnt.NET.WCFRestDemo như sau:
<service name="Tungnt.NET.WCFRestDemo.WCFRestDemo">
<endpoint name ="RESTEndPoint" contract ="Tungnt.NET.WCFRestDemo.IWCFRestDemo" binding ="webHttpBinding" address ="rest" behaviorConfiguration ="restBehavior"/>
<endpoint name ="SOAPEndPoint" contract ="Tungnt.NET.WCFRestDemo.IWCFRestDemo" binding ="basicHttpBinding" address =""/>
</service>Sau khi bổ sung xong ta right-click WCFDemo và update lại service.
Cuối cùng F5 để chạy và giờ thì mọi thứ đã hoạt động trơn tru.
Rất đơn giản và dễ dàng phải không các bạn :)
Sử dụng WCF Service trên Windows Phone 8.1 Store App/Universal App
Ở phần trên chúng ta đã kết nối và sử dụng được WCF Service với ứng dụng Windows Phone 8.1 Silverlight tương đối dễ dàng vì Visual Studio đã hỗ trợ sẵn hết. Thế nhưng với Windows Phone 8.1 Store App/Universal App với core Windows Runtime mọi thứ trở nên phức tạp hơn vì nó không còn hỗ trợ cách sử dụng Add Service Reference và gọi trực tiếp hàm nữa. Chúng ta buộc phải sử dụng cách thức xây dựng các WCF REST Service và gọi thủ công bằng việc xây dựng các HTTP GET/POST message.
Cách thức này tương đối lạ với những ai lâu nay vẫn sử dụng cách thức Add Service Reference ở trên. Cá nhân mình cũng thấy dường như Microsoft chưa hoàn thiện API này lắm vì rõ ràng là Windows 8.1 vẫn hỗ trợ cách Add Service Reference nhưng Windows Phone 8.1 thì không. Mọi thứ rất có thể sẽ thay đổi khi Windows 10 phát hành nhưng trước mắt chúng ta không còn cách nào khác là sử dụng cách thức đã nói ở trên. Nào hãy cùng bắt đầu tạo ứng dụng Windows Phone 8.1
Bước 1: Trong solution WCFRESTDemo ta tạo Project Windows Phone 8.1 Store App như hình dưới
Bước 2: Thiết kế giao diện ứng dụng Windows Phone tương tự ứng dụng ở trên. Thay tên App thành “Tungnt.net WP8.1 Store App”
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel"
Grid.Row="0"
Margin="12,17,0,28">
<TextBlock Text="Tungnt.net WP8.1 Store App"
Style="{StaticResource TitleTextBlockStyle}"
Margin="12,0" />
<TextBlock Text="WCF Demo"
Margin="9,-7,0,0"
Style="{StaticResource HeaderTextBlockStyle}" />
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel"
Grid.Row="1"
Margin="12,0,12,0">
<StackPanel Orientation="Vertical">
<Button Name="btnGetMessage"
Content="GetMessage"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Click="btnGetMessage_Click" />
<Button Name="btnPostMessage"
Content="PostMessage"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Click="btnPostMessage_Click" />
</StackPanel>
</Grid>Bước 3: Tương tự chúng ta xử lý click event của 2 button trên ứng dụng. Để gọi được các hàm REST chúng ta sẽ sử dụng API HttpClient, HttpRequestMessage và HttpResponseMessage (thuộc namespace System.Net.Http) để gửi và nhận dữ liệu.
Ta sẽ xây dựng 1 hàm chung để gọi 2 hàm REST GetMessage và PostMessage đặt tên là WCFRESTServiceCall. Lưu ý: URI của hàm chính là URL của WCFRestDemo service ở trên + tên phương thức GetMessage hoặc PostMessage.
private async void btnGetMessage_Click(object sender, RoutedEventArgs e)
{
string result = await WCFRESTServiceCall("GET", "GetMessage");
var dialog = new MessageDialog(result);
await dialog.ShowAsync();
}
private async void btnPostMessage_Click(object sender, RoutedEventArgs e)
{
string result = await WCFRESTServiceCall("POST", "PostMessage","\"Nguyen Thanh Tung\"");
var dialog = new MessageDialog(result);
await dialog.ShowAsync();
}
/// <summary>
/// Utility function to get/post WCFRESTService
/// </summary>
/// <param name="methodRequestType">RequestType:GET/POST</param>
/// <param name="methodName">WCFREST Method Name To GET/POST</param>
/// <param name="bodyParam">Parameter of POST Method (Need serialize to JSON before passed in)</param>
/// <returns>Created by tungnt.net - 1/2015</returns>
private async Task<string> WCFRESTServiceCall(string methodRequestType, string methodName, string bodyParam = "")
{
string ServiceURI = "http://localhost:34826/WCFRestDemo.svc/rest/" + methodName;
HttpClient httpClient = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(methodRequestType == "GET" ? HttpMethod.Get : HttpMethod.Post, ServiceURI);
if (!string.IsNullOrEmpty(bodyParam))
{
request.Content = new StringContent(bodyParam, Encoding.UTF8, "application/json");
}
HttpResponseMessage response = await httpClient.SendAsync(request);
string returnString = await response.Content.ReadAsStringAsync();
return returnString;
}Vậy là chúng ta đã xây dựng xong ứng dụng Windows Phone 8.1 kết nối đến WCF REST Service, hãy F5 để chạy thử.
Kết luận
Trong bài viết này chúng ta đã cùng tìm hiểu cách thức sử dụng WCF Service trên ứng dụng Windows Phone. Bài viết hướng dẫn chi tiết cách làm từng bước cho cả 2 loại ứng dụng Windows Phone 8.1 Silverlight và Windows Phone 8.1 Store App. Mỗi loại đều có ưu và nhược điểm khác nhau vì vậy bạn cần cân nhắc khi sử dụng chúng trong ứng dụng của mình.
Add Service Reference đơn giản dễ làm hơn vì Visual Studio đã hỗ trợ tối đa nhưng lại không sử dụng được trên Windows Phone 8.1 Store App và performance không tốt bằng cách sử dụng WCF REST Service trả về JSON
Create GET/POST message thủ công và sử dụng HttpClient, HttpRequestMessage, HttpResponseMessage để gửi nhận khó làm hơn, phải viết nhiều code hơn nhưng bù lại hỗ trợ trên Windows Phone 8.1 Store App và performance tốt hơn do sử dụng JSON
Hy vọng bài viết đã giải đáp được phần nào thắc mắc của các bạn khi xây dựng các ứng dụng Windows Phone cần sử dụng server cloud để lưu trữ dữ liệu.
Nếu bạn có bất kì câu hỏi hay kinh nghiệm nào hãy chia sẻ bằng comment bên dưới bài viết và nếu thấy nó hữu ích hãy chia sẻ cho bạn bè của bạn nữa. Nếu bạn muốn nhận được thông báo bài viết mới từ blog của tôi vui lòng subscribe blog nhé. Xin cảm ơn.
Happy coding. Stay tuned.
P/s: Source code example các bạn có thể download tại đây: WCFRESTDemoFinal
















