眾所周知(除了沒用過VS的),在VS裡面調用Web Service是一件很愉快的事情,不解釋,相信很多朋友在以前的項目中肯定也用過WEB服務。同樣,在WP中調用Web Service也是非常簡單的,你可以不信,反正我絕對信了。
有例子有真相,我們就以http://webservice.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx
為例,這個Web服務可以根據IP地址查詢相關的地區/城市資訊,我們就通過調用這WEB服務,來比較一下,在WP項目調用Web Service與我們以前做過的其它類型到底有沒有區別。
1、啟動VS,建立一個WP應用程式項目(此處省略46個字)。
2、頁面配置就參考下面XAML吧。
<phone:PhoneApplicationPage x:Class="MyApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True"> <!--LayoutRoot 是包含所有頁面內容的根網格--> <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel 包含應用程式的名稱和網頁標題--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="我的應用程式" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="頁面名稱" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - 在此處放置其他內容--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid Grid.Row="0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="auto"/> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" VerticalAlignment="Center" Text="IP地址:"/> <TextBox Name="txtIP" Grid.Column="1"/> <Button Grid.Column="2" Click="onQuery"> <Button.Content> <Path Data="M0,10 L20,10 M5,0 L20,10 M5,20 L20,10" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Stroke="White" StrokeThickness="3"/> </Button.Content> </Button> </Grid> <StackPanel Grid.Row="1"> <TextBlock Name="txbTip"/> <TextBlock Name="txbResult" Margin="2,12,2,0" FontSize="32"/> </StackPanel> </Grid> </Grid> </phone:PhoneApplicationPage>
3、開啟“方案總管”,右擊“引用”節點,從彈出的菜單中選擇“加入服務參考”。
4、在彈出的對話方塊中,“地址”處輸入上文中提到的Web服務的地址,並點擊“前往”按鈕,待發現WEB服務完成後,在“命名空間”處輸入一個有效命名空間名字,隨你喜歡。最後別忘了單擊“確定”。
5、切換到後台代碼,完成查詢按鈕的單擊事件處理。
private void onQuery(object sender, RoutedEventArgs e) { // 第一步,執行個體化用戶端代理類 IPQueryWebService.IpAddressSearchWebServiceSoapClient MyClient = new IPQueryWebService.IpAddressSearchWebServiceSoapClient(); // 第二步,綁定回調事件 MyClient.getCountryCityByIpCompleted += (s, arg) => { // 取得結果 txbTip.Text = "請求完成。"; if (arg.Error != null) { txtIP.Text = string.Format("錯誤:{0}", arg.Error.Message); return; } string[] res = arg.Result; if (res != null) { if (res.Length > 1) { txbResult.Text = string.Format("查詢結果:{0}", res[1]); } } }; // 第三步,調用非同步方法呼叫 txbTip.Text = "正在請求,請等候……"; MyClient.getCountryCityByIpAsync(txtIP.Text); }
好了,完成,記住WEB服務一般是非同步呼叫,所以要在回調事件處理中取得調用結果。
運行一下,看看結果吧。
OK,就到這裡吧。