silverlight和wcf通信是大家开发中用得相对较多的东西,我以Silverlight 通过 httpBinding 访问 IIS 宿主 WCF 来简单介绍一下。 Silverlight 通过 httpBiding方式 访问 IIS 宿主 WCF是我们在Silverlight与WCF通信中最为常见的,也是用的最多的,我们用个很简
silverlight和wcf通信是大家开发中用得相对较多的东西,我以Silverlight通过httpBinding访问IIS宿主WCF 来简单介绍一下。
silverlight通过httpbiding方式访问iis宿主wcf是我们在silverlight与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 代码
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" >
<tr>
<td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td>
<td width="109" align="center" bgcolor="#FFE7CE" >复制代码</td>
</tr>
<tr>
<td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" ><pre class="brush:php;toolbar:false;">using<span> System;
</span>using<span> System.Collections.Generic;
</span>using<span> System.Linq;
</span>using<span> System.Text;
</span>using<span> System.ServiceModel;
</span>using<span> System.Runtime.Serialization;
</span>namespace<span> LxContracts
{
[DataContract]
</span>public class<span> Student
{
</span>/// <summary>
///<span> 学生编号
</span>/// </summary>
<span> [DataMember]
</span>public int StuId { get; set<span>; }
</span>/// <summary>
///<span> 学生姓名
</span>/// </summary>
<span> [DataMember]
</span>public string StuName { get; set<span>; }
</span>/// <summary>
///<span> 所在班级
</span>/// </summary>
<span> [DataMember]
</span>public string ClassName { get; set<span>; }
</span>/// <summary>
///<span> 联系电话
</span>/// </summary>
<span> [DataMember]
</span>public string TelPhoneNum { get; set<span>; }
}
}</span>
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" >
<tr>
<td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td>
<td width="109" align="center" bgcolor="#FFE7CE" >复制代码</td>
</tr>
<tr>
<td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" ><pre class="brush:php;toolbar:false;">using<span> System;
</span>using<span> System.Collections.Generic;
</span>using<span> System.Linq;
</span>using<span> System.Text;
</span>using<span> System.Runtime.Serialization;
</span>using<span> System.ServiceModel;
</span>namespace<span> LxContracts
{
[ServiceContract]
</span>public interface<span> IStudent
{
[OperationContract]
List</span><Student><span> GetStudent();
}
}</span>StudentList.cs
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" >
<tr>
<td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td>
<td width="109" align="center" bgcolor="#FFE7CE" >复制代码</td>
</tr>
<tr>
<td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" ><pre class="brush:php;toolbar:false;">using<span> System;
</span>using<span> System.Collections.Generic;
</span>using<span> System.Linq;
</span>using<span> System.Text;
</span>using<span> LxContracts;
</span>namespace<span> LxServices
{
</span>public class StudentList:List<Student><span>
{
</span>public<span> StudentList()
{
</span>this.Add(new Student() { StuId = 1, StuName = "小明", ClassName = "计算机一班", TelPhoneNum = "123456"<span> });
</span>this.Add(new Student() { StuId = 2, StuName = "小红", ClassName = "计算机二班", TelPhoneNum = "234567"<span> });
</span>this.Add(new Student() { StuId = 2, StuName = "小兰", ClassName = "计算机三班", TelPhoneNum = "890123"<span> });
}
}
}</span>
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" >
<tr>
<td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td>
<td width="109" align="center" bgcolor="#FFE7CE" >复制代码</td>
</tr>
<tr>
<td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" ><pre class="brush:php;toolbar:false;">using<span> System;
</span>using<span> System.Collections.Generic;
</span>using<span> System.Linq;
</span>using<span> System.Text;
</span>using<span> LxContracts;
</span>namespace<span> LxServices
{
</span>public class<span> StudentService:IStudent
{
</span>public List<Student><span> GetStudent()
{
</span>//<span>实际情况应该为从数据库读取
</span>//本例手动生成一个StudentList
StudentList ListStuent = new<span> StudentList();
</span>return<span> ListStuent;
}
}
}</span>站点WcfHost.web,这是一个Asp.net 空web应用程序。
1、右击” WcfHost.web”—“添加”—“新建项”—“wcf服务”,命名为”StudentSrv.svc” 。如图:

在项目中删除”StudentSrv.svc.cs”文件和”IStudentSrv.cs”文件。右击”StudentSrv.svc”文件,选择”查看标记”,将代码修改为:
<%@ ServiceHost Language="C#" Service="LxServices.StudentService" %>
2、修改webconfig 文件,代码如下:
WebConfig
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" >
<tr>
<td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td>
<td width="109" align="center" bgcolor="#FFE7CE" >复制代码</td>
</tr>
<tr>
<td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" ><pre class="brush:php;toolbar:false;"><?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="LxBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="LxServices.StudentService" behaviorConfiguration="LxBehavior">
<endpoint address="" binding="basicHttpBinding" contract="LxContracts.IStudent" />
</service>
</services>
<!--关闭 ASP.NET 兼容性模式-->
<serviceHostingEnvironment aspNetCompatibilityEnabled="false"/>
</system.serviceModel>
</configuration>3、右击”StudentSrv.svc”文件,在”浏览器中查看”,显示如下图,说明服务已经部署好了,我用的端口是 9090:

在Silverlight中进行调用:
Silverlight调用wcf很简单,直接在”SilverlightDemo”中添加”服务引用即可”,Silverlight项目中会自动生成” ServiceReferences.ClientConfig”配置文件,当然也可以利用代码的方式调用,但是我比较懒 :)。
1、为Silverlight程序添加WCF:
“右击”—“SiverlightDemo”—“添加服务引用”—“输入服务地址”(我的是http://localhost:9090/WCF/StudentSrv.svc)--点击“前往”,就会找到服务,命名为“WCF.StudentSrv”后,点击“确定”

2、在Silverlight中调用WCF:
MainPage.xaml中添加”DataGrid”控件,xaml代码如下:
MainPage.xaml 代码
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" >
<tr>
<td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td>
<td width="109" align="center" bgcolor="#FFE7CE" >复制代码</td>
</tr>
<tr>
<td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" ><pre class="brush:php;toolbar:false;"><sdk:DataGrid x:Name="dgStudnet" Grid.Row="0" AutoGenerateColumns="False">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="学生编号" Width="80" Binding="{Binding StuId}" />
<sdk:DataGridTextColumn Header="学生姓名" Width="100" Binding="{Binding StuName}" />
<sdk:DataGridTextColumn Header="所在班级" Width="120" Binding="{Binding ClassName}" />
<sdk:DataGridTextColumn Header="电话号码" Width="100" Binding="{Binding TelPhoneNum}" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" >
<tr>
<td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td>
<td width="109" align="center" bgcolor="#FFE7CE" >复制代码</td>
</tr>
<tr>
<td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" ><p><p id="cnblogs_code_open_ec68834b-0041-487f-9828-423fb09754dc"><pre class="brush:php;toolbar:false;">public partial class<span> MainPage : UserControl
{
ObservableCollection</span><Student><span> listStudent;
</span>public<span> MainPage()
{
InitializeComponent();
listStudent </span>= new ObservableCollection<Student><span>();
</span>this.Loaded += new<span> RoutedEventHandler(MainPage_Loaded);
}
</span>void MainPage_Loaded(object<span> sender, RoutedEventArgs e)
{
StudentClient proxyClient </span>= new<span> StudentClient();
proxyClient.GetStudentAsync();
proxyClient.GetStudentCompleted </span>+= new EventHandler<GetStudentCompletedEventArgs><span>(proxyClient_GetStudentCompleted);
}
</span>void proxyClient_GetStudentCompleted(object<span> sender, GetStudentCompletedEventArgs e)
{
</span>if (e.Error == null<span>)
{
listStudent </span>=<span> e.Result;
</span>this.dgStudnet.ItemsSource =<span> listStudent;
}
}
}</span>运行结果:
将” SilverlightDemo”设置为启动项目,运行,会产生下面的异常:

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

clientaccesspolicy.xml
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>再次运行,结果如下图所示:

至此,Silverlight通过httbBingding方式访问IIS宿主的WCF的演示我们就进行到这里
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号