• 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身份验证问题解决。

    这是个治标不治本的解决方式。对此问题。希望大神可以给出解释。

  • 相关阅读:
    App唤起微信小程序和回调
    微信小程序 — 自定义picker选择器弹窗内容+textarea穿透bug
    微信小程序的场景值scene
    微信小程序textarea层级过高(盖住其他元素)
    微信小程序如何修改本地缓存key中的单个数据
    微信小程序---查看更多的显示与隐藏
    微信小程序文字超过行后隐藏并且显示省略号
    Flutter 页面下拉刷新和上拉加载
    json转换成dart类 JSON to Dart
    Flutter 保持页面状态
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5241702.html
Copyright © 2020-2023  润新知