2010 Silverlight Json 数据与通信

环境Microsoft Visual C# 2010 Beta2

      2010 集成Silverlight 3开发环境 .net 4.0

根据TerryLee的一步一步学Silverlight 2系列修改

1、建立一个Silverlight 项目

 

2、建立项目完成后系统会自动产生一个web项目用以运行Silverlight程序

3、Silverlight是客户端程序,我们从服务端开始。使用Handler和WebRequest获取后台数据

Handler代码如下  添加新项 -> 选择 generic handler,生成一个扩展名为ashx的web文件

打开编辑其代码,本例代码如下

view plaincopy to clipboardprint?
public class JBlogHandler : IHttpHandler  
{  
    public void ProcessRequest(HttpContext context)  
    {  
        context.Response.ContentType = "text/plain;charset=UTF-8";  
 
        List<JPost> posts = new List<JPost>(){  
        new JPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee" },  
        new JPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee" },  
        new JPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee" },  
        new JPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee" },  
        new JPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee" },  
        new JPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee" }};  
 
        JBlog blog = new JBlog();  
        blog.Posts = posts;  
 
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(JBlog));  
        jsonSerializer.WriteObject(context.Response.OutputStream, blog);  
 
    }  
    public bool IsReusable  
    {  
        get 
        {  
            return false;  
        }  
    }  

    public class JBlogHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain;charset=UTF-8";

            List<JPost> posts = new List<JPost>(){
            new JPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee" },
            new JPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee" },
            new JPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee" },
            new JPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee" },
            new JPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee" },
            new JPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee" }};

            JBlog blog = new JBlog();
            blog.Posts = posts;

            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(JBlog));
            jsonSerializer.WriteObject(context.Response.OutputStream, blog);

        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

DataContractJsonSerializer 对象属于System.Runtime.Serialization.Json 命名空间.net已经内置Json序列化支持

4、实体类

view plaincopy to clipboardprint?
public class JBlog  
    {  
        public List<JPost> Posts { get; set; }  
    }  
    public class JPost  
    {  
        public int Id { get; set; }  
 
        public string Title { get; set; }  
 
        public string Author { get; set; }  
    } 
public class JBlog
    {
        public List<JPost> Posts { get; set; }
    }
    public class JPost
    {
        public int Id { get; set; }

        public string Title { get; set; }

        public string Author { get; set; }
    }

在这里需要注意一个问题,我们现在有两个项目一个web项目它是基于.net4.0,另外一个Silverlight项目。

在2010Beta2,这两个项目编译的dll对应的.net版本不同,不可以互相引用。估计即使不是beta版该问题也依然存在。

对于本例来说实体类放在Silverlight项目那web项目也引用不到,只能在两个项目中把实体类写两遍。

5、现在开始写Silverlight客户端。2010默认建的程序里有一个页面MainPage.xaml,我们可以修改之,或者另外建一个。

在Silverlight项目右键菜单,添加新项 -> 选择 Silverlight User Control,建一个名为JasonList1.xaml的页面。

view plaincopy to clipboardprint?
<UserControl x:Class="SilverlightDemo1.JasonList1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded">  
 
    <Grid >  
        <Grid.RowDefinitions>  
            <RowDefinition Height="40" />  
            <RowDefinition />  
        </Grid.RowDefinitions>  
        <Border Grid.Row="0" Grid.Column="0" CornerRadius="15" 
            Width="240" Height="36" Background="Orange" 
            Margin="20 0 0 0" HorizontalAlignment="Left">  
            <TextBlock Text="最新随笔" Foreground="White" 
                   HorizontalAlignment="Left" VerticalAlignment="Center" 
                   Margin="20 0 0 0"></TextBlock>  
        </Border>  
        <ListBox x:Name="Posts" Grid.Row="1" Margin="40 10 10 10">  
            <ListBox.ItemTemplate>  
                <DataTemplate>  
                    <StackPanel Orientation="Horizontal">  
                        <TextBlock FontSize="18" Text="{Binding Id}" Height="40" Foreground="Red"></TextBlock>  
                        <TextBlock FontSize="18" Text="{Binding Title}" Height="40"></TextBlock>  
                        <TextBlock FontSize="18" Text="{Binding Author}" Height="40" Foreground="Orange"></TextBlock>  
                    </StackPanel>  
                </DataTemplate>  
            </ListBox.ItemTemplate>  
        </ListBox>  
    </Grid>  
</UserControl> 
<UserControl x:Class="SilverlightDemo1.JasonList1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded">

    <Grid >
        <Grid.RowDefinitions>
            <RowDefinition Height="40" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Border Grid.Row="0" Grid.Column="0" CornerRadius="15"
            Width="240" Height="36" Background="Orange"
            Margin="20 0 0 0" HorizontalAlignment="Left">
            <TextBlock Text="最新随笔" Foreground="White"
                   HorizontalAlignment="Left" VerticalAlignment="Center"
                   Margin="20 0 0 0"></TextBlock>
        </Border>
        <ListBox x:Name="Posts" Grid.Row="1" Margin="40 10 10 10">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock FontSize="18" Text="{Binding Id}" Height="40" Foreground="Red"></TextBlock>
                        <TextBlock FontSize="18" Text="{Binding Title}" Height="40"></TextBlock>
                        <TextBlock FontSize="18" Text="{Binding Author}" Height="40" Foreground="Orange"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</UserControl>
 

本页用listbox显示一个三列的数据列表

获取数据的代码如下:

view plaincopy to clipboardprint?
SynchronizationContext syn;  
public JasonList1()  
{  
    InitializeComponent();              
}  
 
private void UserControl_Loaded(object sender, RoutedEventArgs e)  
{  
    Uri endpoint = new Uri("http://localhost:4029/JBlogHandler.ashx");  
 
    WebRequest request = WebRequest.Create(endpoint);  
    request.Method = "POST";  
    request.ContentType = "application/x-www-form-urlencoded";  
    syn = SynchronizationContext.Current;  
 
 
    request.BeginGetResponse(new AsyncCallback(ResponseReady), request);  
}  
 
void SetPost(object data)  
{  
    JBlog blog = data as JBlog;  
    Posts.ItemsSource = blog.Posts;  
}  
 
void ResponseReady(IAsyncResult asyncResult)  
{  
     
    WebRequest request1 = asyncResult.AsyncState as WebRequest;  
    WebResponse response2 = request1.EndGetResponse(asyncResult);  
      
 
    using (Stream responseStream = response2.GetResponseStream())  
    {  
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(JBlog));  
 
        JBlog blog = jsonSerializer.ReadObject(responseStream) as JBlog;  
        syn.Post(SetPost, blog);                  
    }  

        SynchronizationContext syn;
        public JasonList1()
        {
            InitializeComponent();           
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            Uri endpoint = new Uri("http://localhost:4029/JBlogHandler.ashx");

            WebRequest request = WebRequest.Create(endpoint);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            syn = SynchronizationContext.Current;


            request.BeginGetResponse(new AsyncCallback(ResponseReady), request);
        }

        void SetPost(object data)
        {
            JBlog blog = data as JBlog;
            Posts.ItemsSource = blog.Posts;
        }
       
        void ResponseReady(IAsyncResult asyncResult)
        {
          
            WebRequest request1 = asyncResult.AsyncState as WebRequest;
            WebResponse response2 = request1.EndGetResponse(asyncResult);
           

            using (Stream responseStream = response2.GetResponseStream())
            {
                DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(JBlog));

                JBlog blog = jsonSerializer.ReadObject(responseStream) as JBlog;
                syn.Post(SetPost, blog);               
            }
        }

UserControl_Loaded和winform一样,在空处双击一下就自动生成该函数。

        可以看到访问前面写的Handler通过webRequest获取数据,并使用了.net内建的System.Runtime.Serialization.Json命名空间下的DataContractJsonSerializer对象。

       另外需要注意的是使用了SynchronizationContext对象,位于System.Threading命名空间,这个是解决跨线程访问UI对象的问题。

对此没有概念的用户可能会对使用syn.Post(SetPost, blog) 这种方法绑定感到莫名其妙,为什么不直接

Posts.ItemsSource = blog.Posts而要转去syn.Post(SetPost, blog) 呢。

6、下了一个开源项目Jason.net,不过试用不了还是版本的问题。也就是说Silverlight可能会使用一个.net 2.0的精简版本吧,反正它和一般的.net程序使用FrameWork就是不能共用。这还是个问题,不过对于序列化功能,.net已经内建Json序列化,Silverlight也同样,这倒是个好事。所以本例并没有用到第三方的Jason.net。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rex0y/archive/2010/02/08/5298804.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值