Silverlight+WCF实现跨域调用
在这篇文章中。WCF扮演server,向外提供LoginVaild服务。Silverlight扮演client。调用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')
WCFserver实现
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。内容例如以下:
<?xml version="1.0" encoding="utf-8" ?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy>
5.设定WCFserver使用特定port进行訪问,方法:选中WCFserver项目-->邮件属性-->Web-->特定port,输入1316。这样保证我们每次能够通过1316port訪问WCF提供的服务。
到此。WCFserver端配置完毕,选中Service1.svc文件。在浏览器中浏览器下WCF提供的服务。
Silverlightclient实现
1.新建Silverlight应用程序。在引用中加入服务引用,在地址栏输入Service1.svc文件在浏览器中的路径,比方我的是:http://localhost:1316/Service1.svc。
2.新建Silverlight用户控件Login.xaml文件,在显示页面加入username、passwordTextBox和登录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<LoginVaildCompletedEventArgs>(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(); }到此。client配置完毕,执行Silverlightclient项目就可以查看结果。源代码下载地址:http://pan.baidu.com/s/1mgn3IEO
如今回首整个实现过程。有点面向服务编程的意思:WCF提供一个服务,然后把訪问服务的接口公开,想调用此服务的项目仅仅要加入此服务的引用便能调用WCF提供的服务。
在实现过程中,有个问题至今尚未解决,在WCFserver项目中配置ADO.Net实体数据模型时,假设是用SQL Server的SQL Server身份验证方式登录,便会报“server返回了错误 Not found”异常;改成Windows身份验证问题解决。
这是个治标不治本的解决方式。对此问题。希望大神可以给出解释。