本文将建立一个silverlight与wcf双向通讯的简单实例,以下是详细步骤:


  新建Silverlight应用程序,名称WCFtest。解决方案中添加WCF服务应用程序,名称WcfServiceTest,WCF服务将不再寄宿在Web中。


  删除VS自动生成的IService1.cs和Service1.svc文件,修改WCF服务固定端口12345。


  在WCF服务应用程序WcfServiceTest上,添加应用,选择浏览定位到 C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Libraries\Server \System.ServiceModel.PollingDuplex.dll,PollingDuplex是一种扩展的双工轮询通讯方法,在安装的 Silverlight SDK中可以找到。


    添加一个WCF服务,名称ServiceTest。

修改WCF服务应用程序WcfServiceTest的Web.config文件。

<?xml version="1.0" encoding="utf-8"?>
<configuration> <system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
<serviceMetadata httpGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<!--这里是添加的开始-->
<services>
<service name="WcfServiceTest.ServiceTest" >
<endpoint address="" binding="pollingDuplexHttpBinding" contract="WcfServiceTest.IServiceTest" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<extensions>
<bindingExtensions>
<add name="pollingDuplexHttpBinding" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</bindingExtensions>
</extensions>
<!--这里是添加的结束-->
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer> </configuration>

此处的修改,添加了两个终结点,使用服务配置编辑器打开可以看到它们


服务配置编辑器,可以在开始菜单中找到

右键点击其属性,复制其目标地址

右键Wcf服务应用程序中的Web.config文件,选择打开方式,点击添加,程序名输入"服务配置编辑器的路径",友好名称"服务配置编辑器"

选择Web.config文件的打开方式,就可以选择服务配置编辑器打开了;


  修改IServiceTest.cs文件。

    [ServiceContract(CallbackContract = typeof(ICallBack))]//指定回调接口ICallBack
public interface IServiceTest
{
[OperationContract(IsOneWay = true)]//单向调用,不需要返回值
void SayHellow(string name);
} public interface ICallBack
{
[OperationContract(IsOneWay = true)]//单向调用,不需要返回值
void ShowHello(string hello);
}

CallbackContract=typeof(ICallBack),指定了回调接口;

(IsOneWay = true),单向调用,不需要返回值。

  修改ServiceTest.svc.cs文件,实现IService接口的SayHello方法,传进name参数,处理为My name is [name],作为参数再调用指定的回调接口ICallBack中的ShowHello方法,ICallBack中的所有方法则留给客户端实现,这里不需 要实现它。

    public class ServiceTest : IServiceTest
{
#region IServiceTest 成员 public void SayHellow(string name)
{
name = string.Format("My name is {0}.", name);
ICallBack callBack = OperationContext.Current.GetCallbackChannel<ICallBack>();
callBack.ShowHello(name);
} #endregion
}

当客户端调用服务端的SayHellow方法时,服务端收到调用,获取客户端实例的通道。

按照约定好的回调接口,调用ShowHello方法,同时把参数传递过去,ICallBack中的方法留给客户端实现,服务端这里只管调用。


  你可能会遇到跨域问题,解决方法是为WCF应用程序WcfServiceTest添加跨域文件clientaccesspolicy.xml。

clientaccesspolicy.xml内容如下:

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

  重新生成解决方案,否则可能会遇到发现wcf服务有误的情况,为Silverlight项目添加服务引用,点击发现可以查找到刚刚添加的ServiceTest服务,修改命名空间ServiceReferenceTest。


  在Silverlight项目的MainPage.xaml上,为了便于演示,添加一个TextBox,一个Button,一个TextBlock。

    <Grid x:Name="LayoutRoot" Background="White">
<TextBox Height="" HorizontalAlignment="Left" Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="" />
<Button Content="Button" Height="" HorizontalAlignment="Left" Margin="12,41,0,0" Name="button1" VerticalAlignment="Top" Width="" />
<TextBlock Height="" HorizontalAlignment="Left" Margin="12,70,0,0" Name="textBlock1" Text="TextBlock" VerticalAlignment="Top" Width="" />
</Grid>

  添加button1的点击Click事件。

        private void button1_Click(object sender, RoutedEventArgs e)
{
//扩展的轮询机制的双向通讯
PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding()
{
//每次轮询建立的有效时间为20分钟
InactivityTimeout = TimeSpan.FromMinutes()
};
//基础的http请求方式
//Binding binding =new BasicHttpBinding();
//svc服务地址
EndpointAddress endPoint = new EndpointAddress("http://localhost:12345/ServiceTest.svc");
ServiceReferenceTest.ServiceTestClient client = new ServiceReferenceTest.ServiceTestClient(binding, endPoint);
//异步调用SayHellow方法
client.SayHellowAsync(this.textBox1.Text);
//调用完成后ShowHello回调事件
client.ShowHelloReceived += new EventHandler<ServiceReferenceTest.ShowHelloReceivedEventArgs>(client_ShowHelloReceived);
}

new PollingDuplexHttpBinding();实例化一个PollingDuplex通道,PollingDuplex为双向工作轮询通信机制;

InactivityTimeout = TimeSpan.FromMinutes(20);每次轮询建立的有效时间为20分钟;

new EndpointAddress("http://localhost:12345/ServiceTest.svc");指定svc服务的终结点地址;

client.SayHellowAsync(this.textBox1.Text);将textBox1的text内容作为参数,异步调用服务端的SayHellow方法;

client.ShowHelloReceived += new EventHandler<ServiceReferenceTest.ShowHelloReceivedEventArgs> (client_ShowHelloReceived);调用服务端的SayHellow方法,方法将调用回调接口ICallBack中的 ShowHello方法,这里指定ShowHello调用完成的事件;

        void client_ShowHelloReceived(object sender, ServiceReferenceTest.ShowHelloReceivedEventArgs e)
{
//实现void ShowHello(string hello)方法,参数e.hello
this.textBlock1.Text = string.Format("Hello! {0}", e.hello);
}

这里就是对ICallBack接口中ShowHello方法的实现,可使用参数e.hello,当客户端调用服务端的SayHello方法 时,SayHello方法中调用指定的回调接口ICallBack中的ShowHello方法,客户端完善调用到ShowHello方法完成后的事件,显 示结果Hello![e.hello],在textBlock1上;


  F5运行,在textbox1中输入名字name,点击button1,调用服务端的SayHello方法带参数name,SayHello方 法处理为Mynameis[name],作为参数再调用指定的回调接口ICallBack中的ShowHello方法,客户端实现调用ShowHello 方法完成后的事件, 处理为Hello![e.hello],后输出结果到textBlock1中。

silverlight与wcf双向通讯 例子的更多相关文章

  1. WCF 双向通讯实例-简易的聊天程序

    源码下载 程序分四个部分: 1.原理 使用WCF的nettcp绑定.nettcp绑定类似原来的RPC,即.net remoting,只是在WCF提供统一协定,同一服务可以拥有多种客户端. 2.代码展示 ...

  2. 系列文章--Silverlight与WCF通信

    Silverlight与WCF通信(一) :Silverlight通过httpBinding访问IIS宿主WCF 摘要: 首语本人在学习Silverlight 和 WCF的时候,各种问题层出不穷,在园 ...

  3. 重温WCF之数单向通讯、双向通讯、回调操作(五)

    一.单向通讯单向操作不等同于异步操作,单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入到服务器端的队列中,并在某个时间进行执行.队列的存储个数有限,一旦发出的调用 ...

  4. 我们一起学习WCF 第四篇单通讯和双向通讯

    前言:由于个人原因很久没有更新这个系列了,我会继续的更新这系列的文章.这一章是单向和双向通讯.所谓的单向就是只有发送却没有回复,双向是既有发送还有回复.就是有来无往代表单向,礼尚往来表示双向.下面我用 ...

  5. 三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  6. SilverLight搭建WCF聊天室详细过程[转]

    http://www.silverlightchina.net/html/zhuantixilie/getstart/2011/0424/7148.html 默认节点 SilverLight搭建WCF ...

  7. C++的MFC 与 HTML 双向通讯

    C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 最近项目中用html 来做界面,也就折腾了一下在wxwidget中嵌入浏览器的若干细节工作,mfc也基本是类似的,由于wxwidget中已 ...

  8. Silverlight调用一般性处理程序模拟Silverlight调用WCF效果(2)

    [置顶] Silverlight调用一般性处理程序模拟Silverlight调用WCF效果(2) 分类: 技术2012-03-31 12:51 548人阅读 评论(0) 收藏 举报 silverlig ...

  9. Silverlight调用WCF(1)

    [置顶] Silverlight调用WCF(1) 分类: 技术2012-03-31 12:29 940人阅读 评论(0) 收藏 举报 wcfsilverlightexceptionusersecuri ...

随机推荐

  1. 14.5.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量

    14.5.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量 改变InnoDB redo ...

  2. MariaDb数据库管理系统学习(二)使用HeidiSQL数据库图形化界面管理工具

    HeidiSQL 是一款用于简单化的 MySQL server和数据库管理的图形化界面.该软件同意你浏览你的数据库,管理表,浏览和编辑记录,管理用户权限等等.此外,你能够从文本文件导入数据,执行 SQ ...

  3. NET MVC RazorEngine 解析模板生成静态页

    ASP.NET MVC 解析模板生成静态页一(RazorEngine) 简述 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是 ...

  4. delphi中用代码实现注册Ocx和Dll(有点怪异,使用CallWindowProc来调用指定函数DllRegisterServer)

    在windows系统中,可以通过Regsvr32来实现注册ocx或者dl, 编程时,调用Regsvr32来注册,却不能正常执行.尤其是在Win7系统中,需要管理员身份才能运行. 使用下面的代码则能正常 ...

  5. PHP网站安装程序的原理及代码

    原文:PHP网站安装程序的原理及代码 原理: 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安 ...

  6. android视频库Vitamio

    之前尝试自己解码视频,然后播放显示,虽然音视频都可以播放,但是实现不了音视频的同步,所以使用第三方的视频库Vitamio来实现视频播放器功能,这样自己只需要实现播放解码的制作不不要关心底层解码和显示问 ...

  7. hdu3622(二分+two-sat)

    传送门:Bomb Game 题意:给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸的范围半径都一样,控制爆炸的半径使得所有的爆炸范围 ...

  8. CrossBridge介绍

    CrossBridge介绍 作者:chszs,转载需注明.博客主页: http://blog.csdn.net/chszs CrossBridge是Adobe FlasCC的开源版本,它提供了一个完整 ...

  9. 纯CSS实现各类气球泡泡对话框效果

    原文 纯CSS实现各类气球泡泡对话框效果 一.关于纯CSS实现气泡对话框 首先,来张大图: 上边这张黄黄的,大大的,圆圆的,有个小尾巴,文字内容有些YY的图片,就是使用纯CSS实现的气泡对话框效果,一 ...

  10. Jersey框架三:Jersey对HTTPS的支持

    Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...