読者です 読者をやめる 読者になる 読者になる

SilverlightからTwitterにアクセスしてみた

Silverlight 2 テクノロジ入門」を読み終わったので、せっかくなのでSilverlight 2で何かアプリをつくってみようと思った。

先日の日記で、「SiverlightでTwitterクライアントを」とか書いたんだけど、Silverlightでは、サービスを公開しているサイトにポリシーファイルを設置しないと、クロスドメインアクセスができないのね。全然知らなかった・・・

では、SiverlightからWebサービスを呼び出すにはどうするのが一般的なんだろう。

下の絵のように、Silverlightをホストするサイトと同じサイトにWCFサービスをおいて、ブリッジ(?)させるのがいいのかな?


とりあえずこの方式で、ボタンを押すとパブリックタイムラインをリストボックスに表示するだけの簡単なプログラムを書いてみた。(TwitterへのアクセスにはWCFでTwitter APIをたたいてみる - ZOETROPEの日記を利用。Webアプリケーションのプロジェクトと、WCFサービスのコードは省略。)

以下、Silverlightのコード。

<UserControl x:Class="Twitter.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="800" Height="600">
    <Canvas x:Name="LayoutRoot" Background="White">        
    	<Button  Canvas.Left="10" Canvas.Top="10" Height="30" Width="80" Content="load" Click="Button_Click"/>
    	<ListBox x:Name="TimeLineList" Height="600" Width="550" Canvas.Left="100" Canvas.Top="10"/>
    </Canvas>
</UserControl>
using System;
using System.ServiceModel;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using Twitter.ServiceReference;

namespace Twitter
{
    public partial class Page : UserControl
    {
        private TwitterServiceClient client;

        public Page()
        {
            InitializeComponent();

            BasicHttpBinding binding = new BasicHttpBinding();
            Uri docUri = HtmlPage.Document.DocumentUri;
            Uri svcUri = new Uri(docUri, "TwitterService.svc");

            EndpointAddress endpoint = new EndpointAddress(svcUri);
            client = new TwitterServiceClient(binding, endpoint);

            client.GetPublicTimelineCompleted +=
                new EventHandler<GetPublicTimelineCompletedEventArgs>(
                    client_GetPublicTimelineCompleted);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            client.GetPublicTimelineAsync();
        }

        private void client_GetPublicTimelineCompleted(
            object sender, GetPublicTimelineCompletedEventArgs e)
        {
            foreach (Status status in e.Result)
            {
                ItemControl ic = new ItemControl(
                    new Uri(status.User.ProfileImageUrl), status.Text);
                TimeLineList.Items.Insert(0, ic);
            }
        }
    }
}
<UserControl x:Class="Twitter.ItemControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="500" Height="100">
    <Grid>
        <StackPanel Orientation="Horizontal">
            <Image x:Name="ProfileImage" Height="100" Width="100" />
            <TextBlock x:Name="UserText" TextWrapping="Wrap" Height="100" Width="400" />
        </StackPanel>
    </Grid>
</UserControl>
  • ItemControl.xaml.cs
using System;
using System.Windows.Controls;
using System.Windows.Media.Imaging;

namespace Twitter
{
    public partial class ItemControl : UserControl
    {
        public ItemControl(Uri imguri, string text)
        {
            InitializeComponent();
            ProfileImage.Source = new BitmapImage(imguri);
            UserText.Text = text;
        }
    }
}

実行するとこんな感じでタイムラインが表示される。


でも、プロフィール画像にGIF形式を使っていると表示できないみたい。GIF decoder for Silverlight 2っていうのを使うと良いらしい。


Microsoft Silverlight 2テクノロジ入門 (マイクロソフト公式解説書)

Microsoft Silverlight 2テクノロジ入門 (マイクロソフト公式解説書)

  • 作者: Laurence Moroney,株式会社セカンドファクトリーグローバルストラテジグループ東賢・玉城えり子,株式会社ウイリング
  • 出版社/メーカー: 日経BPソフトプレス
  • 発売日: 2008/08/26
  • メディア: 単行本
  • 購入: 1人 クリック: 41回
  • この商品を含むブログ (18件) を見る