在这篇文章中,WCF扮演服务器,向外提供LoginVaild服务;Silverlight扮演客户端,调用WCF提供的LoginVaild服务。思路有了,下面进行代码实现。
数据库脚本实现
新建T_User表,在表中添加两个字段username、password,向表中插入一条数据admin admin,脚本如下:
USE [test]
GO
/****** Object:? Table [dbo].[T_User]? ? Script Date: 09/28/2014 21:12:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T_User](
?[username] [varchar](20) NOT NULL,
?[password] [varchar](20) NOT NULL,
?CONSTRAINT [PK_T_User] PRIMARY KEY CLUSTERED
(
?[username] ASC
)WITH (PAD_INDEX? = OFF, STATISTICS_NORECOMPUTE? = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS? = ON, ALLOW_PAGE_LOCKS? = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[T_User] ([username], [password]) VALUES (N'admin', N'admin')
WCF服务器实现
1.新建一个WCF服务库项目,在默认生成的IServer1.cs接口在添加LoginVaild服务的声明:
? [OperationContract]
? ? ? ? bool LoginVaild(string userName, string password);
2.添加ADO.Net实体数据模型文件--Model.edmx,用于对数据表T_User的访问;
3.在Service1.svc中对LoginVaild方法进行实现:
?public bool LoginVaild(string userName, string password)
? ? ? ? {
? ? ? ? ? ? bool result = false;
? ? ? ? ? ? //需要访问的ADO.Net数据实体模型
? ? ? ? ? ? using (SLtestEntitiesSecond entities = new SLtestEntitiesSecond())
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var user = entities.T_User.Where(c => c.username == userName && c.password == password).SingleOrDefault();
? ? ? ? ? ? ? ? if (user == null)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? result = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? result = true;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? return result;
? ? ? ? }
4.在项目的根目录添加跨域访问文件clientaccesspolicy.xml,内容如下:
?
? ?
? ? ?
? ? ? ? ?
? ? ?
? ? ?
? ? ? ?
? ? ? ? ?
? ?
?
5.设定WCF服务器使用特定端口进行访问,方法:选中WCF服务器项目-->邮件属性-->Web-->特定端口,输入1316。这样保证我们每次可以通过1316端口访问WCF提供的服务。
到此,WCF服务器端配置完成,选中Service1.svc文件,在浏览器中浏览器下WCF提供的服务。
Silverlight客户端实现
1.新建Silverlight应用程序,在引用中添加服务引用,在地址栏输入Service1.svc文件在浏览器中的路径,比如我的是:http://localhost:1316/Service1.svc;
2.新建Silverlight用户控件Login.xaml文件,在显示页面添加用户名、密码TextBox和登录Button;
3.在Login.xaml后台通过调用WCF提供的服务对用户输入进行判断,代码如下:
? ? private void button1_Click(object sender, RoutedEventArgs e)
? ? ? ? {
? ? ? ? ? ? string userName = txtusername.Text.Trim();
? ? ? ? ? ? string password = txtpassword.Text.Trim();
? ? ? ? ? ? Service1Client client = new Service1Client();
? ? ? ? ? ? client.LoginVaildCompleted += new EventHandler(client_LoginVaildCompleted);
? ? ? ? ? ? client.LoginVaildAsync(userName, password);
? ? ? ? ? ? client.CloseAsync();
? ? ? ? }
? ? ? ? void client_LoginVaildCompleted(object sender, LoginVaildCompletedEventArgs e)
? ? ? ? {
? ? ? ? ? ? if (e.Error == null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //MessageBox.Show(e.Result.ToString());
? ? ? ? ? ? ? ? if (e.Result == true)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? this.Content = new MainPage();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? MessageBox.Show("用户名或密码错误!");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? MessageBox.Show(e.Error.ToString());
? ? ? ? ? ? }
? ? ? ? }
4.在App.xaml配置文件设置Login.xaml为起始页,代码如下:
? private void Application_Startup(object sender, StartupEventArgs e)
? ? ? ? {
? ? ? ? ? ? this.RootVisual = new Login();
? ? ? ? }
到此,客户端配置完成,运行Silverlight客户端项目即可查看结果。源码下载地址:
------------------------------------------分割线------------------------------------------
具体下载目录在 /2015年资料/2月/27日/Silverlight+WCF实现跨域调用/
------------------------------------------分割线------------------------------------------
现在回首整个实现过程,有点面向服务编程的意思:WCF提供一个服务,然后把访问服务的接口公开,想调用此服务的项目只要添加此服务的引用便能调用WCF提供的服务。
在实现过程中,有个问题至今尚未解决,在WCF服务器项目中