博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Silverlight+WCF实现跨域调用
阅读量:3979 次
发布时间:2019-05-24

本文共 3447 字,大约阅读时间需要 11 分钟。

      在这篇文章中,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 ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE 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]GOSET ANSI_PADDING OFFGOINSERT [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文件在浏览器中的路径,比如我的是:;
  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客户端项目即可查看结果。源码下载地址:
  现在回首整个实现过程,有点面向服务编程的意思:WCF提供一个服务,然后把访问服务的接口公开,想调用此服务的项目只要添加此服务的引用便能调用WCF提供的服务。
  在实现过程中,有个问题至今尚未解决,在WCF服务器项目中配置ADO.Net实体数据模型时,如果是用SQL Server的SQL Server身份验证方式登录,便会报“服务器返回了错误 Not found”异常;改成Windows身份验证问题解决。这是个治标不治本的解决方案,对此问题,希望大神能够给出解释。

转载地址:http://jxkui.baihongyu.com/

你可能感兴趣的文章
JS清空多文本框|文本域
查看>>
linux常用命令(操作命令)
查看>>
Linux一些经典书籍
查看>>
apache启动报错(98)Address already in use: make_sock: could not bind to address [::]:80
查看>>
linux kill用法、killall、pkill、xkill
查看>>
Python笔记——排序算法的实现
查看>>
jQuery数据显示插件整合实现代码
查看>>
python时区设置——pytz模块
查看>>
用datetime和pytz来转换时区
查看>>
python解决导出excel文件时中文文件名乱码
查看>>
使用朴素贝叶斯进行分本分类
查看>>
快速排序算法及其优化方法
查看>>
VC++ string .........
查看>>
RoboCup2d 环境配置
查看>>
[转载]int,int32_t,int64_t
查看>>
LINUX 下 GDB 调试 ( 转载 )
查看>>
GDB 、 LINUX 下 GDB 调试 小结---->基础知识!
查看>>
Linux下静态库和动态库的创建和使用( 转载 )
查看>>
makefile:中文版最权威的makefile文档( 转载 )
查看>>
Linux目录结构(Linux文件系统结构)( 转载 )
查看>>