Windows Phone 上的 Web 服务编程

红薯 发布于 2012/08/14 08:57
阅读 2K+
收藏 18

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

环境要求:

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

关于应用:

这个应用使用微软的 Bing 地图来显示两点之间的路线以及距离,我们更多的在讲述 Web 服务的使用,至于地图接口可参考 Bing MapsBing Maps v2 ,以及一些入门文章 Bing Maps in Windows Phone

假设你已经将地图控件从工具箱中拖到了主界面,并在 ApplicationBar 处插入如下代码:

<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Opacity="0.9">
        <shell:ApplicationBarIconButton IconUri="/Icons/plus.png" Text="Zoom In" Click="zoomIn_click"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/minus.png" Text="Zoom out" Click="zoomOut_click"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/A.png" Text="Aerial mode" Click="Aerial_click"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/R.png" Text="Road mode" Click="Road_click"/>
        <shell:ApplicationBar.MenuItems>
            <shell:ApplicationBarMenuItem Text="Choose my position" Click="chooseMyPosition_click"/>
            <shell:ApplicationBarMenuItem Text="Locate Me" Click="locateMe_click"/>
            <shell:ApplicationBarMenuItem Text="Set Pushpin" Click="setPin_click"/>
            <shell:ApplicationBarMenuItem Text="Add Pushpin" Click="addPin_click"/>
            <shell:ApplicationBarMenuItem Text="Show Route" Click="showRoute_click"/>
        </shell:ApplicationBar.MenuItems>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.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:

在地址栏中粘贴下面 web 服务地址:

http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/mex

点击 Go 后,该服务将出现在 Services 域中:

当点击 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<ServiceReference1.Waypoint>();
    rr.Waypoints.Add(wp1);
    rr.Waypoints.Add(wp2);

    //invoking the web service
    proxy.CalculateRouteAsync(rr);
    proxy.CalculateRouteCompleted += 
      new EventHandler<ServiceReference1.CalculateRouteCompletedEventArgs>(proxy_CalculateRouteCompleted);  
}

这里非常重要的是 Windows Phone 是通过异步的方式来调用 Web 服务,这也是为什么方法名添加了 Async 表达式,这是为了让 UI 被操作堵塞。

IntelliSence 可帮你显示 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 最终运行的截图:

绘制的路线图如下:

  

全文完,希望你喜欢这篇文章。

本文完整代码下载:http://www.oschina.net/code/snippet_12_12794

英文原文OSCHINA原创翻译

加载中
0
简单代码
简单代码
沙发,看看,学android。。。
0
紫外线
紫外线
前些天装了个WIN8,对windows8有些失望,我不是说WP8
junwong
junwong
回复 @李恒哲 : 没绑定Windows Live ID的话,估计只能本身功能的10%,太多东西因为需要windows live ID而无法使用
李恒哲
李恒哲
回复 @junwong : 准备上Win8 绑LIVEID 和没绑的有什么区别吗
junwong
junwong
我觉得Win8很好的,你是否绑定了 windows live ID
0
任意球
任意球
好东西啊
返回顶部
顶部