.net ria services 自定义函数(9)

很多时候我们可能十分希望自定义一些方法可以让sl端直接调用,对SOA的设计思想,这个是十分有作用的,因为一个函数就完成一个功能,这是SOA最常见不过的设计。这里我将讲述一下.net ria services在sl应用中如何自定义函数.

1.在.net ria service端先定义一个方法,并返回一个自定义的类,这个类必须有主键,可以通过“[Key]”标识一个字段为主键。并把此函数用“[ServiceOperation]”标识,这样sliverlgiht端才会出来这个函数。

 1:  [EnableClientAccess()]
 2:  public class myDomainService : DomainService
 3:  {
 4:      [ServiceOperation]
 5:      public myclass myText(string userId)
 6:      {
 7:          myclass mc = new myclass();
 8:          mc.userid = userId;
 9:          mc.input = userId;
10:          return mc;
11:      }
12:  }
13:   
14:  public class myclass
15:  {
16:      [Key]
17:      public string userid { get; set; }
18:      public string input { get; set; }
19:  }

2.调用相当简单,以下是silverlight端的调用代码

 1:  public Home()
 2:  {
 3:      InitializeComponent();
 4:      Business.Web.Services.myDomainContext md = new Business.Web.Services.myDomainContext();
 5:      var c = md.myText("FunSL.com");
 6:      c.Completed += new EventHandler(c_Completed);
 7:  }
 8:   
 9:  void c_Completed(object sender, EventArgs e)
10:  {
11:      var b = (System.Windows.Ria.Data.InvokeOperation<Business.Web.Services.myclass>)sender;
12:      Business.Web.Services.myclass mc = (Business.Web.Services.myclass)b.Value;
13:      MessageBox.Show(mc.userid + ";" + mc.input);
14:  }

欢迎您参与更多关于此话题的讨论,本文原创地址为:http://funsl.com

评论

cdxcom
cdxcom 的头像
User offline. Last seen 1 年 46 周 ago. Offline
Joined: 03/16/2010
关于ria services自定义方法的问题

你好,我是第一次在项目中使用ria services,现在遇到了一个问题:我用的是VS2008+ria services,在自定义函数时,我从数据库中取出某张表的数据,然后返回list,这张表中有19万条数据,我取前8000条时可以正常返回,没有问题,但是如果超过8000条记录时,就会返回一个“错误: Silverlight 应用程序中未处理的错误
代码: 4004
类别: ManagedRuntimeError
消息: System.Windows.Ria.DomainOperationException: Load operation failed for query 'Getwarehouselist'. 远程服务器返回了错误: NotFound。“ 这种错误。
奇怪的是,如果我换另一张表查询,(这张表有1万多条记录)就一切正常。实在搞不懂了,应该也不是ria services字节长度的限制的问题。
请帮忙分析一下,是什么原因呢?如果需要,我把源码给你。
谢谢

黎东海
黎东海 的头像
User offline. Last seen 8 小时 31 分钟 ago. Offline
Joined: 09/13/2009
re:cdxcom

还是有可能是因为ria serivces的限制的,因为ria service是基本wcf,而wcf对最大序列化数据是以byte大小来定义的,所以还有一种可能是你8k条记录的byte大小已经超过另一个表的1w条记录的大小,所以导致这样的情况。

cdxcom
cdxcom 的头像
User offline. Last seen 1 年 46 周 ago. Offline
Joined: 03/16/2010
哦,那有没有方法可以改变这个序列化数据的大小限制呢? 另外

哦,那有没有方法可以改变这个序列化数据的大小限制呢?
另外,通过返回值来看,大小并没有超出另一张表1W的大小,但是还是会报这个错误。
我是通过(string.length来取得大小的),不知这样对不对?
谢谢。

黎东海
黎东海 的头像
User offline. Last seen 8 小时 31 分钟 ago. Offline
Joined: 09/13/2009
re:cdxcom

微软推荐的做法是不要一次反回所有数据。你可以利用linq的take或如果你使用的是domaindatasource的话更是可以设置pagesize,这样反正你是一定要分页的,所以没有必要一次过读取所有的数据,这样不单可以减轻服务端的负担还不用客户端缓存过多数据。