看大家好像对我的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 用户不存
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 }
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 }
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 }
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 }
好了,完成。