silverlight与wcf双向通讯 例子

本文将建立一个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="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,41,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
<TextBlock Height="23" HorizontalAlignment="Left" Margin="12,70,0,0" Name="textBlock1" Text="TextBlock" VerticalAlignment="Top" Width="120" />
</Grid>


  添加button1的点击Click事件。


        private void button1_Click(object sender, RoutedEventArgs e)
{
//扩展的轮询机制的双向通讯
PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding()
{
//每次轮询建立的有效时间为20分钟
InactivityTimeout = TimeSpan.FromMinutes(20)
};
//基础的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中。

时间: 2024-10-16 05:40:34

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

WCF双向通讯netTCP

一.服务端配置 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="MyBehavior"> <serviceMetadata httpGetEnabled="tr

Silverlight与WCF通信

Silverlight与WCF通信(一) :Silverlight通过httpBinding访问IIS宿主WCF 摘要: 首语本人在学习Silverlight 和 WCF的时候,各种问题层出不穷,在园子里面查阅大量的资料,尤其是Artech和Frank xu Lei 的WCF博文给我很大的帮助,在此衷心感谢两位.本人不才,特写下几个Silverlight和WCF通信的例子与大家分享和交流,希望初学者少走些弯路,而专心于系统的业务层的开发,高手请绕行,但欢迎拍砖!:)本系列是面向Silverlig

重温WCF之数单向通讯、双向通讯(五)

1.启用单向通讯的方法,不能有返回值(void可以),不能有out参数,只允许传入参数. [ServiceContract(Namespace = "MyNamespace")] public interface IService { [OperationContract(IsOneWay = true)] void DoTestWork(string message); } 2.双向通讯是有问必有答的(哪怕方法返回void,客户端也会收到一条空消息). [ServiceContrac

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

前言:由于个人原因很久没有更新这个系列了,我会继续的更新这系列的文章.这一章是单向和双向通讯.所谓的单向就是只有发送却没有回复,双向是既有发送还有回复.就是有来无往代表单向,礼尚往来表示双向.下面我用一个简单用例图表示一下(其中一个老师很严厉说的话大家都默默接受,另一个则相反) 首先我们先看单向通讯: 第一步:编写服务协定 1 [ServiceContract(Namespace = "singleTrans")] 2 public interface ITeacher 3 { 4 [

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

回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baidu.com/s/1eQCc69G        前言:以前的系统都是直接客户端直连数据库服务器,后来考虑到服务器的安全性.数据库连接数的限制.分布能力差等问题,特别是那几年中间件.SOA.ESB等炒得比较火,为了跟上时代脚本有必要开发一个中间件,把后台逻辑业务在中间件中运行.刚开始考虑过WebS

silverlight中WCF不能传递List&lt;string&gt;

SL:List<string> Dishes = ...;ServiceReference1.Service1Client myClient = new Service1Client();myClient.MakeOrderAsync(Dishes); WEB:[OperationContract]public Boolean MakeOrder(List<string> dishes){   ...   return true;} 提示: 错误 6 与"Ordering

iPhone 和 iPad的ios 开发中 利用 WebViewJavascriptBridge组件,通过 UIWebView 对Html进行双向通讯

本文转载至 http://blog.csdn.net/remote_roamer/article/details/7261490 WebViewJavascriptBridge 项目的 官网 https://github.com/marcuswestin/WebViewJavascriptBridge 主要过程: 下载WebViewJavascriptBridge.h 和 WebViewJavascriptBridge.m文件到自己的项目中,并添加到项目. 在相应的.h文件中 使用#import

Java简单的UDP通讯例子

内容:简单的UDP通讯例子. Receiver: public class Receiver { public static void main(String[] args) { DatagramSocket ds = null; try { //UDP接收端 ds = new DatagramSocket(8080); //定义将UDP的数据包接收到什么地方 byte[] buf = new byte[1024]; //定义UDP的数据接收包 DatagramPacket dp = new D

lis双向通讯技术

主机与检测仪器进行通讯,最基本的就是能够获取仪器传输出来的检验结果信息.而双向通讯除了可以获取仪器传输的检验结果信息,还可以接收和处理仪器传输的其它多种信息,还能主动发送信息或命令给仪器,设置仪器运行参数或控制仪器进行检测. 检验技师在检验过程中,设置检验项目和保证样本与结果的正确对应占用了很多工作量,并且容易出错.如果主机与HIS有良好的接口,并且仪器支持条码,采用双向+条码可以极大的减轻检验技师设置样本号和检验项目的工作量,并且更能保证样本与结果的正确对应关系. 传统的检验流程是这样的: 标