准备工作:
请到http://search.live.com/developers申请一个AppID,这个AppID是你访问Live Search的验证信息
用你的hotmail或者msn账号登陆就可以申请了
(以前的Live Search API 1.1 的AppID申请也完成了他的使命,当然大家还可以继续使用以前的AppID来访问1.1版本的Live Search Service啦)
另外大家可以下载最新的SDK: Live Search SDK 2.0 Beta
该SDK包含了API以及示范例子的代码(包括VB和C#版本)
Live Search 2.0共有三种访问协议:
JSON
XML
SOAP
在Live Search的这一系列文章中,我将一直使用SOAP协议来访问,因为其使用C#访问非常便捷
大家可以根据自己的项目的需要使用合适的协议
下面让我们开始
创建一个Silverlight项目
添加一个Service Reference如下
其中Address中的地址格式如下:http://api.search.live.net/search.wsdl?AppID=你申请的AppID
点击Go,如果你输入的地址正确而且有网络连接,应该就能搜索到和上图一样的LiveSearchService
填写你希望的调用的Namespace并点击OK,等待数秒后会弹出如下窗口
不用管它,点OK就可以了查看下这个Service提供的对象接口
这里面没有LiveSearchService这个对象,也就是你下载到的SDK中的访问LiveSearchService的方式以及不一样了
(两天前还有的,昨晚我再次尝试的时候就没有了,这样做的原因相必是为了与WCF兼容或者是已经采用WCF来提供Service接口了)
取而代之的是LiveSearchPortTypeClient,大家把它当成WebClient类似的东西就很容易领悟到它的调用方式了
也就是说最新的Document与最新提供的LiveSearchService的接口有些出入,不过我已经把这个问题解决
解决方案:
UI展示代码如下:
点击展开
<UserControl.Resources>
<ControlTemplate x:Key="DefaultBtnTemplate" TargetType="Button">
<Border CornerRadius="8" x:Name="border">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFB2E09A"/>
<GradientStop Color="#FF4E942F" Offset="0.7"/>
</LinearGradientBrush>
</Border.Background>
<TextBlock Margin="{TemplateBinding Padding}" Foreground="White" Text="{TemplateBinding Content}" FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup x:Name="FocusStates">
<vsm:VisualState x:Name="Focused"/>
<vsm:VisualState x:Name="Unfocused"/>
</vsm:VisualStateGroup>
<vsm:VisualStateGroup x:Name="CommonStates">
<vsm:VisualState x:Name="Normal"/>
<vsm:VisualState x:Name="MouseOver">
</vsm:VisualState>
<vsm:VisualState x:Name="Pressed"/>
<vsm:VisualState x:Name="Disabled"/>
</vsm:VisualStateGroup>
</vsm:VisualStateManager.VisualStateGroups>
</Border>
</ControlTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="#3c3c3c">
<Grid HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="KeywordsCtl" Width="400"/>
<Button x:Name="SearchBtnCtl" Content="Search" Padding="30,5" Margin="4,0,2,0" Template="{StaticResource DefaultBtnTemplate}" Grid.Column="1" Click="SearchBtnCtl_Click"/>
<TextBlock Foreground="White" Grid.Row="1" x:Name="WebNumCtl" Margin="2"/>
<ListBox x:Name="WebPanelCtl" Grid.Row="2" Grid.ColumnSpan="2" Margin="2,0" BorderThickness="0" Background="#3c3c3c" Height="500">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Width="480">
<HyperlinkButton Content="{Binding Title}" NavigateUri="{Binding OriginalUrl}" TargetName="_blank"/>
<TextBlock TextWrapping="Wrap" Foreground="White" Text="{Binding Description}" Margin="0,2"/>
<TextBlock Text="{Binding DisplayUrl}" Foreground="Green" FontSize="10"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Grid>
KeywordsCtl用于搜索词的输入
SearchBtnCtl为搜索按钮
WebNumCtl用来展示共搜索到多少条新闻
WebPanelCtl用于展示得到的搜索结果
其中WebPanelCtl用到了DataBinding(数据绑定)
底层代码:
点击展开
private void SearchBtnCtl_Click(object sender, RoutedEventArgs e)
...{
LiveSearchPortTypeClient liveSearchClient = new LiveSearchPortTypeClient();
SearchRequest webRequest = new SearchRequest();
webRequest.AppId = "44980C5CFA65792B3CDFF33A5CBF2CFAD17E3349";
webRequest.Market = "zh-CN";
webRequest.Version = "2.0";
webRequest.Sources = new SourceType[] ...{ SourceType.Web };
webRequest.Query = this.KeywordsCtl.Text.Trim();
webRequest.Options = new SearchOption[] ...{ SearchOption.EnableHighlighting };
webRequest.Web= new LiveSearchServiceRef.WebRequest();
webRequest.Web.Count = 30;
webRequest.Web.CountSpecified = true;
liveSearchClient.SearchAsync(webRequest);
liveSearchClient.SearchCompleted += new EventHandler<SearchCompletedEventArgs>(liveSearchClient_SearchCompleted);
}
void liveSearchClient_SearchCompleted(object sender, SearchCompletedEventArgs e)
...{
SearchResponse liveSearchResponse = e.Result;
LiveSearchServiceRef.WebResponse webResponse = liveSearchResponse.Web;
this.WebNumCtl.Text = String.Format("共...{0}条搜索结果",webResponse.Total);
List<WebInfo> m_webInfoList = new List<WebInfo>();
if (webResponse.Results.Length > 0)
...{
foreach (WebResult webResult in webResponse.Results)
...{
WebInfo webInfo = new WebInfo();
webInfo.Title = webResult.Title;
webInfo.Description = webResult.Description;
webInfo.PublishDateTime = webResult.DateTime;
webInfo.OriginalUrl = webResult.Url;
webInfo.DisplayUrl = webResult.DisplayUrl;
m_webInfoList.Add(webInfo);
}
this.WebPanelCtl.ItemsSource = m_webInfoList;
}
}
SearchRequest用来定义AppID以及搜索市场,使用的搜索版本等
Query用于提供给LiveSearchService搜索词
Sources用来定义搜索来源,目前共有
Image,InstantAnswer,News,PhoneBook,RelatedSearch,SpellCheck,Web七种,美国市场还有AD
(注意:你在SearchRequest定义了哪几种搜索源,那么SearchResponse的Response类型也就只有那几种)
代码12,13行用于定义SearchResponse返回多少条结果
LiveSearchPortTypeClient通过异步的方式调用初始化的SearchRequest
LiveSearchPortTypeClient将通过SearchCompleted这个事件回传给客户端查询结果,也就是这里的SearchResponse
38行将获得的数据绑定给WebPanelCtl,这样我们就得到了查询的信息了
其中WebInfo对象是用来存储获取的网页信息,其定义如下
搜索结果预览: