vs2010 学习Silverlight学习笔记(14):数据与通信之ASMX

概要:

  上午自己重写了WCF的试验,前前后后花了1个多小时。又把以前的关于数据通信的例子重做一遍。遇到了一些问题,都是因为操作不熟练造成的。
所以我希望和我一样的新手不论学什么,都要多动手,多复习。今天学习的是asmx,其实就是WebService。粗略的看了一下李老师的教程,觉得跟其他
的数据通信有很多相似的地方。所以我先试着自己动手写写看。

自己的例子:

  首先在web文件夹添加WebService,命名为MyService.asmx,这是用于 XML Web Services 的 ASP.NET 文件。
  
ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
public class MyService : System.Web.Services.WebService
{

[WebMethod]
public Student[] GetStudnet()
{
List
< Student > student = new List < Student > ()
{
new Student ( 1 , " " , " " ),
new Student ( 2 , " " , " " ),
new Student ( 3 , " " , " " ),
new Student ( 4 , " " , " " )
};
return student.ToArray();
}
}

student是我自定义的一个类:

ContractedBlock.gif ExpandedBlockStart.gif 代码

 
   
public class Student
{
public Student( int no, string name, string sex)
{
this .NO = no;
this .Name = name;
this .Sex = sex;
}
public Student()
{ }

public int NO;

public string Name;

public string Sex;
}

这个不像WCF需要改web.config,只要将web的端口设一个固定值,运行:http://localhost:3333/MyService.asmx
2010051919113655.png
  这个说明这个WebService可以运行了,点击GetStudent,会显示关于此web服务的xaml文件,我们就可以根据此xaml文件编写关于使用
此服务的程序了。继续点击,就会显示返回的Xaml文件:

ContractedBlock.gif ExpandedBlockStart.gif 代码

 
   
<? xml version="1.0" encoding="utf-8" ?>
-
< ArrayOfStudent xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" xmlns ="http://tempuri.org/" >
-
< Student >
< NO > 1 </ NO >
< Name > </ Name >
< Sex > </ Sex >
</ Student >
-
< Student >
< NO > 2 </ NO >
< Name > </ Name >
< Sex > </ Sex >
</ Student >
-
< Student >
< NO > 3 </ NO >
< Name > </ Name >
< Sex > </ Sex >
</ Student >
-
< Student >
< NO > 4 </ NO >
< Name > </ Name >
< Sex > </ Sex >
</ Student >
</ ArrayOfStudent >

这个就是当我们使用此服务的时候,这个服务所提供的返回数据。
MainPage.xaml
ContractedBlock.gif ExpandedBlockStart.gif 代码

 
   
< Grid x:Name ="LayoutRoot" Background ="#46461F" >
< Grid.RowDefinitions >
< RowDefinition Height ="40" ></ RowDefinition >
< RowDefinition Height ="*" ></ RowDefinition >
</ Grid.RowDefinitions >
< Grid.ColumnDefinitions >
< ColumnDefinition Width ="200" ></ ColumnDefinition >
</ Grid.ColumnDefinitions >
< Border Grid.Row ="0" Grid.Column ="0" CornerRadius ="15"
Background
="OldLace" Width ="120" Height ="35"
HorizontalAlignment
="Left" Margin ="10 0 0 0" >
< TextBlock Text ="学生列表:" Foreground ="Green" HorizontalAlignment ="Left"
Margin
="10 0 0 0" FontSize ="20" ></ TextBlock >
</ Border >
< ListBox x:Name ="student" Grid.Row ="1" Grid.Column ="0"
Margin
="30 0 0 0" >
< ListBox.ItemTemplate >
< DataTemplate >
< StackPanel Orientation ="Horizontal" >
< TextBlock Text =" {Binding NO} " Height ="30" Width ="10" ></ TextBlock >
< TextBlock Text =" {Binding Name} " Height ="30" Width ="10" ></ TextBlock >
< TextBlock Text =" {Binding Sex} " Height ="30" Width ="10" ></ TextBlock >
</ StackPanel >
</ DataTemplate >
</ ListBox.ItemTemplate >
</ ListBox >
</ Grid >

在这之前要将此Service引入到Silverlight中,
2010051919415925.png
MainPage.xaml.cs

ContractedBlock.gif ExpandedBlockStart.gif 代码

 
   
// 引入
using SilverlightAppDemo2.MyStudentService;

private void UserControl_Loaded( object sender, RoutedEventArgs e)
{
MyServiceSoapClient myClient
= new MyServiceSoapClient();
myClient.GetStudnetCompleted
+= new EventHandler < GetStudnetCompletedEventArgs > (client_GetPostsCompleted);
myClient.GetStudnetAsync();
}
void client_GetPostsCompleted( object sender, GetStudnetCompletedEventArgs e)
{
if (e.Error == null )
{
student.ItemsSource
= e.Result;
}
}

运行一下:
2010051919435275.png

类序列化问题:

  这个是我对照TerryLee的例子:
他的实体类:
 
  
public class Post
{
public int Id { get ; set ; }
public string Title { get ; set ; }
public string Author { get ; set ; }
}

赋值:

ContractedBlock.gif ExpandedBlockStart.gif 代码

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

我的实体类:

ContractedBlock.gif ExpandedBlockStart.gif 代码

 
   
public Student( int no, string name, string sex)
{
this .NO = no;
this .Name = name;
this .Sex = sex;
}
//public Student()
//{ }
public int NO;
public string Name;
public string Sex;

当我的代码中没有public Student(){}时,服务就会出错,提示实体类不能序列化。
SilverlightAppDemo2.Web.Student cannot be serialized because it does not have a parameterless constructor.
这个让我想起了上一篇中WCF序列化的问题,
[DataContract]    [DataMember]
当时还查询了资料,后来知道这个是WCF中类序列化用的。在Silverlight2中就可以省略不写了,但做一些特殊的用法时,还是要加上的。

当我再将public Student(){}加上时就能序列化了。如果不加此无参构造函数,即使加[Serializable]也没用。
查了一下,发现是这样的:
 
  
首先Serializable是完全序列化,并且记录字段值在构造器中的修改,在反序列化时,先将该类的字段初始化,
然后将序列化流中所得数据分配给字段。如果一个类实现了Serializable,但他的父类并不是可序列化的,
那么该父类必须要有个无参构造函数。


总结:

  虽然前几个学习很吃力,但是经过我多动手,慢慢也会发现一些相通的地方。今天很高兴,因为很多都是自己动手做的。但我还是
希望多碰到新的问题,解决新的问题,学习新的问题。
总目录
上一篇:vs2010 学习Silverlight学习笔记(13):数据与通信之WCF

 



转载于:https://www.cnblogs.com/yaoge/archive/2010/05/19/1739543.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值