欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Silverlight通过httpBinding访问IIS宿主WCF

程序员文章站 2022-06-09 13:55:50
...

silverlight和wcf通信是大家开发中用得相对较多的东西,我以Silverlight 通过 httpBinding 访问 IIS 宿主 WCF 来简单介绍一下。 Silverlight 通过 httpBiding方式 访问 IIS 宿主 WCF是我们在Silverlight与WCF通信中最为常见的,也是用的最多的,我们用个很简

silverlight和wcf通信是大家开发中用得相对较多的东西,我以Silverlight通过httpBinding访问IIS宿主WCF 来简单介绍一下。

Silverlight通过httpBiding方式访问IIS宿主WCF是我们在Silverlight与WCF通信中最为常见的,也是用的最多的,我们用个很简单的例子进行演示。

项目结构:

Silverlight通过httpBinding访问IIS宿主WCF

项目目结构简单说明:

程序集名称 需添加的引用 简要说明
LxContracts System.Runtime.Serialization System.ServiceModel 用于存放操作契约与数据契约
LxServices LxContracts[项目] 服务,操作契约的实现
WcfHost.web LxContracts[项目] 和LxServices[项目] 利用Svc文件发布服务的站点
SilverlightDemo Silverlight程序,调用WCF服务

注意:建立Silverlight程序的时候,不需要承载网站,建立一个单一的Silverlight程序即可,这样做的原因是,把Silverlight和WCF服务不放到同一个站点下面,是为了演示跨域的问题。

代码实现:

类库LxContracts:(包括数据契约Student.cs和操作契约IStudent.cs)

Student.cs 代码


代码如下 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace LxContracts
{
    [DataContract]
    public class Student
    {
        /// 
        /// 学生编号
        ///         [DataMember]
        public int StuId { get; set; }

        /// 
        /// 学生姓名
        ///         [DataMember]
        public string StuName { get; set; }

        /// 
        /// 所在班级
        ///         [DataMember]
        public string ClassName { get; set; }

        /// 
        /// 联系电话
        ///         [DataMember]
        public string TelPhoneNum { get; set; }
    }
}
Student.cs 代码


代码如下 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;

namespace LxContracts
{
    [ServiceContract]
    public interface IStudent
    {
        [OperationContract]
        List GetStudent();
    }
}
类库LxServices:( 改类库包括一个模仿获取数据库集合类StudentList.cs和服务类StudentService.cs)

StudentList.cs


代码如下 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LxContracts;

namespace LxServices
{
    public class StudentList:List
    {
        public StudentList()
        {
            this.Add(new Student() { StuId = 1, StuName = "小明", ClassName = "计算机一班", TelPhoneNum = "123456" });
            this.Add(new Student() { StuId = 2, StuName = "小红", ClassName = "计算机二班", TelPhoneNum = "234567" });
            this.Add(new Student() { StuId = 2, StuName = "小兰", ClassName = "计算机三班", TelPhoneNum = "890123" });
        }
    }
}
StudentService 代码


代码如下 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using LxContracts;

namespace LxServices
{
    public class StudentService:IStudent
    {
        public List GetStudent()
        {
            //实际情况应该为从数据库读取
            //本例手动生成一个StudentList
            StudentList ListStuent = new StudentList();
            return ListStuent;
        }
    }
}
站点WcfHost.web

站点WcfHost.web,这是一个Asp.net 空web应用程序。

1、右击” WcfHost.web”—“添加”—“新建项”—“wcf服务”,命名为”StudentSrv.svc” 。如图:

Silverlight通过httpBinding访问IIS宿主WCF

在项目中删除”StudentSrv.svc.cs”文件和”IStudentSrv.cs”文件。右击”StudentSrv.svc”文件,选择”查看标记”,将代码修改为:



2、修改webconfig 文件,代码如下:

WebConfig


代码如下 复制代码
注意:endpoint中的address 为空:因为svc文件的地址就是元数据发布的地址。

3、右击”StudentSrv.svc”文件,在”浏览器中查看”,显示如下图,说明服务已经部署好了,我用的端口是 9090:

Silverlight通过httpBinding访问IIS宿主WCF

在Silverlight中进行调用:

Silverlight调用wcf很简单,直接在”SilverlightDemo”中添加”服务引用即可”,Silverlight项目中会自动生成” ServiceReferences.ClientConfig”配置文件,当然也可以利用代码的方式调用,但是我比较懒 :)。

1、为Silverlight程序添加WCF:

“右击”—“SiverlightDemo”—“添加服务引用”—“输入服务地址”(我的是http://localhost:9090/WCF/StudentSrv.svc)--点击“前往”,就会找到服务,命名为“WCF.StudentSrv”后,点击“确定”

Silverlight通过httpBinding访问IIS宿主WCF

2、在Silverlight中调用WCF:

MainPage.xaml中添加”DataGrid”控件,xaml代码如下:

MainPage.xaml 代码


代码如下 复制代码
MainPage.cs 代码


代码如下 复制代码

public partial class MainPage : UserControl
    {
        ObservableCollection listStudent;
        public MainPage()
        {
            InitializeComponent();
            listStudent = new ObservableCollection();
            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            StudentClient proxyClient = new StudentClient();
            proxyClient.GetStudentAsync();
            proxyClient.GetStudentCompleted += new EventHandler(proxyClient_GetStudentCompleted);
        }

        void proxyClient_GetStudentCompleted(object sender, GetStudentCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                listStudent = e.Result;
                this.dgStudnet.ItemsSource = listStudent;
            }
        }
    }

运行结果:

将” SilverlightDemo”设置为启动项目,运行,会产生下面的异常:

Silverlight通过httpBinding访问IIS宿主WCF

这就是因为当时建立项目的时候没有把Silverlight程序和WCF服务放到同一个站点的缘故,因此需要在发布WCF的网站根目录放置一个跨域文件:clientaccesspolicy.xml

Silverlight通过httpBinding访问IIS宿主WCFSilverlight通过httpBinding访问IIS宿主WCFclientaccesspolicy.xml

再次运行,结果如下图所示:

Silverlight通过httpBinding访问IIS宿主WCF

至此,Silverlight通过httbBingding方式访问IIS宿主的WCF的演示我们就进行到这里