移动设备现在紧密的跟互联网结合,开发者应该利用这个优势来开发各种网络服务,今天我们介绍在 Windows Phone 上开发 Web 服务应用。

环境要求:

因为这是一个 Windows Phone 应用,你需要安装 Visual Studio for Windows Phone Express installed 或者 Visual Studio 2010,可通过下面地址下载:
[yellow_box]

[/yellow_box]

关于应用:

这个应用使用微软的 Bing 地图来显示两点之间的路线以及距离,我们更多的在讲述 Web 服务的使用,至于地图接口可参考 Bing Maps 和 Bing Maps v2 ,以及一些入门文章 Bing Maps in Windows Phone
假设你已经将地图控件从工具箱中拖到了主界面,并在 ApplicationBar 处插入如下代码:












接下来使用如下代码来引入地图特性:
using Microsoft.Phone.Controls;
using Microsoft.Phone.Controls.Maps;
using System.Device.Location;

然后编写代码:
//declaring the two Pushpins and the Polyline
Pushpin pin1 = new Pushpin();
Pushpin pin2 = new Pushpin();
MapPolyline poly = new MapPolyline();

在地图上显示折线:
//Initialization for polyline
poly.Locations = new LocationCollection();
poly.Opacity = 1.0;
poly.StrokeThickness = 3;
SolidColorBrush mySolidColorBrush = new SolidColorBrush();
mySolidColorBrush.Color = Colors.Green;
poly.Stroke = mySolidColorBrush;

现在我们要开始使用 Web 服务,首先右击项目并选择 Add Service Reference:
Windows Phone 上的 Web 服务编程
在地址栏中粘贴下面 web 服务地址:
http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/mex
点击 Go 后,该服务将出现在 Services 域中:
Windows Phone 上的 Web 服务编程
当点击 OK 按钮后,你项目里将生成一些文件,因此我们可以通过如下代码来使用这个服务:
private void showRoute_click(object sender, EventArgs e)
{
//creating the reference to the service
ServiceReference1.RouteServiceClient proxy =
new ServiceReference1.RouteServiceClient("BasicHttpBinding_IRouteService");
ServiceReference1.RouteRequest rr = new ServiceReference1.RouteRequest();
//this service requires a key
rr.Credentials = new ServiceReference1.Credentials();
rr.Credentials.ApplicationId =
"Asa2x7ZzhYIHauji6TzIkcf3TIDznTgBaPKQehsyE4taOz19Mx4fP4lyihqbTj7D";
rr.Options = new ServiceReference1.RouteOptions();
rr.Options.RoutePathType = ServiceReference1.RoutePathType.Points;
//declaring the two points
ServiceReference1.Waypoint wp1 = new ServiceReference1.Waypoint();
ServiceReference1.Waypoint wp2 = new ServiceReference1.Waypoint();
//the first location is my location (from)
wp1.Location = new ServiceReference1.Location();
wp1.Location.Latitude = SharedInformation.myLatitude;
wp1.Location.Longitude = SharedInformation.myLongitude;
wp1.Description = "";
//the second location is the destination (to)
wp2.Location = new ServiceReference1.Location();
wp2.Location.Latitude = SharedInformation.pinLat;
wp2.Location.Longitude = SharedInformation.pinLong;
wp2.Description = "";
//setting the parameter to send
rr.Waypoints = new System.Collections.ObjectModel.ObservableCollection();
rr.Waypoints.Add(wp1);
rr.Waypoints.Add(wp2);
//invoking the web service
proxy.CalculateRouteAsync(rr);
proxy.CalculateRouteCompleted +=
new EventHandler
(proxy_CalculateRouteCompleted);
}

这里非常重要的是 Windows Phone 是通过异步的方式来调用 Web 服务,这也是为什么方法名添加了 Async 表达式,这是为了让 UI 被操作堵塞。
IntelliSence 可帮你显示 Web 服务中提供的不同的方法,以及方法的参数:
Windows Phone 上的 Web 服务编程
来自 Web 服务的返回结果是通过第二个参数proxy_CalculateRouteCompleted来返回的,这个参数是一个方法,在调用 Web 服务有返回后这个方法将被调用,结果是一系列的点阵,我们可利用这些点阵来画线:
public void proxy_CalculateRouteCompleted(object obj, ServiceReference1.CalculateRouteCompletedEventArgs e)
{
try
{
foreach (ServiceReference1.Location location in e.Result.Result.RoutePath.Points)
{
poly.Locations.Add(new GeoCoordinate(location.Latitude, location.Longitude));
}
//add the Polyline to the Map
map1.Children.Add(poly);
//display the distance between the two Pushpins
pin2.Content = "It's " + e.Result.Result.Summary.Distance.ToString() + "Km far away!";
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}

使用 try-catch 的原因是调用服务可能发生异常,例如返回的点远离路径之类的。
下图是此 app 最终运行的截图:
Windows Phone 上的 Web 服务编程
绘制的路线图如下:
Windows Phone 上的 Web 服务编程
全文完,希望你喜欢这篇文章。
[dl href=’http://vdisk.weibo.com/s/naVdR’]本教程指南全部代码下载[/dl]