[顶] 一句话完成Silverlight + WCF异步调用

看大家好像对我的NParsing框架不是很感兴趣(写NParsing帖没人顶我),那就给大家来点“甜品”,换换口谓。来说说Silverlight方面的东西。

在Silverlight中数据通信只能用异步。有人会觉得写起来很麻烦,其实不然。也有很简单的写法,一句话就能搞定。哈哈,下面看代码

吧。这是一个用户登录的功能。

 

首先是WCF异步调用接口定义:

代码
 1 using System;
 2 using System.ServiceModel;
 3 using Test.Model;
 4 
 5 namespace Test.Silverlight.Client
 6 {
 7     [ServiceContract]
 8     public interface IUserService
 9     {
10         /// <summary>
11         /// 用户登录
12         /// </summary>
13         /// <param name="username">用户名</param>
14         /// <param name="password">密码</param>
15         /// <param name="asyncCallback"></param>
16         /// <param name="asyncState"></param>
17         /// <returns>
18         /// 0 登录失败
19         /// 1 登录成功
20         /// 2 用户不存
21         /// 3 密码错误
22         /// 4 用户未审核
23         /// </returns>
24         [OperationContract(AsyncPattern = true)]
25         IAsyncResult BeginLogin(string username, string password, AsyncCallback asyncCallback, object asyncState);
26         int EndLogin(out User userInfo, IAsyncResult result);
27     }
28 }

 

然后是WCF客户端通信代理类:

代码
 1 using System;
 2 using System.ServiceModel;
 3 using System.ServiceModel.Channels;
 4 using Test.Model;
 5 
 6 namespace Test.Silverlight.Client
 7 {
 8     public class UserClient : ClientBase<IUserService>, IUserService
 9     {
10         private static readonly Binding binding = new BasicHttpBinding();
11         public UserClient(EndpointAddress remoteAddress) : base(binding, remoteAddress)
12         {
13         }
14 
15         public IAsyncResult BeginLogin(string username, string password, AsyncCallback asyncCallback, object 
16 
17 asyncState)
18         {
19             return Channel.BeginLogin(username, password, asyncCallback, asyncState);
20         }
21 
22         public int EndLogin(out User userInfo, IAsyncResult result)
23         {
24             return Channel.EndLogin(out userInfo, result);
25         }
26     }
27 }

 

最后就是Silverlight中怎么调用啦:

代码
 1 using System;
 2 using System.IO;
 3 using System.Threading;
 4 using System.Windows;
 5 using System.Windows.Controls;
 6 using System.Windows.Input;
 7 using System.Windows.Media;
 8 using System.Windows.Media.Imaging;
 9 using Test.Model;
10 using Test.Silverlight.Client;
11 
12 namespace Test.SilverlightApplication
13 {
14     public partial class UserLogin : UserControl
15     {
16         private readonly UserClient _UserClient = new UserClient(SystemData.UserService_EndpointAddress);
17         private readonly SynchronizationContext syn;
18 
19         public UserLogin()
20         {
21             syn = SynchronizationContext.Current;
22             InitializeComponent();
23         }
24 
25         private void btnLogin_Click(object sender, RoutedEventArgs e)
26         {
27             _UserClient.BeginLogin(txtUsername.Text.Trim(), txtPassword.Password.Trim(),
28                                    ar =>
29                                        {
30                                            User userInfo;
31                                            int iRet = ((IUserService) ar.AsyncState).EndLogin(out userInfo, ar);
32                                            syn.Post(obj =>
33                                                         {
34                                                             switch ((int) obj)
35                                                             {
36                                                                 case 0:
37                                                                     MessageBox.Show("用户登录失败。""提示信息", MessageBoxButton.OK);
38                                                                     break;
39                                                                 case 1:
40                                                                     MessageBox.Show("用户登录成功。""提示信息", MessageBoxButton.OK);
41                                                                     break;
42                                                                 case 2:
43                                                                 case 3:
44                                                                     MessageBox.Show("用户不存在或密码错误。""提示信息", MessageBoxButton.OK);
45                                                                     break;
46                                                                 case 4:
47                                                                     MessageBox.Show("用户未审核,请耐心等待。""提示信息", MessageBoxButton.OK);
48                                                                     break;
49                                                             }
50                                                         },
51                                                     iRet);
52                                        },
53                                    _UserClient);
54         }
55     }
56 }

 

好了,完成。

posted @ 2010-04-28 21:10  支点  阅读(2650)  评论(17编辑  收藏  举报