`

silverlight+WCF的net.tcp双工通信实例过程 - 树上的蜗牛

    博客分类:
  • WCF
阅读更多
原帖地址:http://www.cnblogs.com/cyb331/p/3158285.html

silverlight+WCF的net.tcp双工通信实例过程

注:本人只是一个菜鸟,有什么不对的,请各位大侠指正,成分感谢!!!

本实例实现一个简单的单用户对单用户的消息发送实例。实例开始:

  1. 进行net.tcp双工通信必须安装Windows功能下的Microsoft.NET.Framework3.5.1下面两项
  2. 项目结构如下:

         

说明:SilverlightApp silverlight项目,其网页承载与WCF服务是一个WEB项目,即WcfService

      WcfContract 一个类库项目,用于定义契约,需引用System.ServiceModel

      WcfModel一个类库项目,用于定义数据实体类,需要引用System.Runtime.Serialization

WcfService 一个web项目,用于IIS寄存WCF

  1. 新建一个解决方案命名为nettcpTest
  2. 在解决方案上添加一个类库项目:WcfModel,在此类库项目中添加两个类UserInfo、MessageInfo 。

UserInfos.cs

namespace WcfModel

{

    [DataContract]

    public class UserInfo

    {

        [DataMember]

        public int Id { get; set; }

        [DataMember]

        public string Name { get; set; }

    }

}

 

MessageInfo.cs

 

namespace WcfModel

{

    [DataContract]

    public class MessageInfo

    {

        [DataMember]

        public UserInfo FromUser { get; set; }

        [DataMember]

        public UserInfo ToUser { get; set; }

        [DataMember]

        public string Content { get; set; }

        [DataMember]

        public DateTime SendTime { get; set; }

    }

}

右键此项目,生成。

 

  1. 右键解决方案添加一个名为WcfContract的类库项目,引用WcfModel,在项目中添加两个接口:IMessageCallBack、IMessageManage

 

IMessageCallBack.cs

namespace WcfContract

{

    public interface IMessageCallBack

    {

        [OperationContract(IsOneWay = true)]

        void GetMessage(MessageInfo message);

    }

}

IMessageManage.cs

namespace WcfContract

{

    [ServiceContract(CallbackContract = typeof(IMessageCallBack))]

    public interface IMessageManage

    {

        [OperationContract]

        bool SendMessage(MessageInfo msg);

        [OperationContract]

        bool RequestMessage(UserInfo user);

    }

}

右键此项目生成。

 

  1. 在解决方案上添加一个空的web项目,名称为WcfService,并引用前两个类库。并且添加一个WCF服务命名为MessageService.svc,删除原有的接口,后台代码如下:

MessageService.cs

namespace WcfService

{

    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“MessageService”。

    // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 MessageService.svc 或 MessageService.svc.cs,然后开始调试。

    public class MessageService :IMessageManage

    {

        //用于记录用户与对应的通道

        private static Dictionary<int, IMessageCallBack> DicCallChannel = new Dictionary<int, IMessageCallBack>();

        //记录间用户的ID

        private int UserId = 0;

 

        public bool SendMessage(WcfModel.MessageInfo msg)

        {

            //获取对应要发送的通道,回调

            if (DicCallChannel.Keys.Contains(msg.ToUser.Id))

            {

                DicCallChannel[msg.ToUser.Id].GetMessage(msg);

                return true;

            }

            return false;

        }

 

        public bool RequestMessage(WcfModel.UserInfo user)

        {

            //获取用户请求建立的通道

            IMessageCallBack channel = OperationContext.Current.GetCallbackChannel<IMessageCallBack>();

            if (!DicCallChannel.Keys.Contains(user.Id))

            {

                DicCallChannel.Add(user.Id, channel);

                UserId = user.Id;                

                OperationContext.Current.Channel.Closing += Channel_Closing;

            }

            return true;

        }

        //当用户通道关闭时,把用户的通道记录删除,即不记录已经断开的通道

        void Channel_Closing(object sender, EventArgs e)

        {

            if (DicCallChannel.Keys.Contains(UserId))

            {

                DicCallChannel.Remove(UserId);

            }

        }

    }

}

 

  1. 打开web.config,添加如下节点

 <system.serviceModel>

    <behaviors>

      <serviceBehaviors>

        <behavior name="mBehavior">

         <serviceMetadata httpGetEnabled="false"/>

         <serviceDebug includeExceptionDetailInFaults="true"/>

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <bindings>

      <netTcpBinding>

        <binding name="mBinding">

         <security mode="None"/>

        </binding>

      </netTcpBinding>

    </bindings>

    <services>

      <service name="WcfService.MessageService" behaviorConfiguration="mBehavior">

        <endpoint address="" binding="netTcpBinding" bindingConfiguration="mBinding" contract="WcfContract.IMessageManage"/>

        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>

      </service>

    </services>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>

  </system.serviceModel>

    <system.webServer>

        <directoryBrowse enabled="true"/>

</system.webServer>

右键生成些项目

  1. 打开IIS管理器,如果IIS没有安装.net4.0,则IIS需要注册net4.0,怎么注册,大家问度娘吧

 

右击应用程序池,添加应用程序池,命名为WcfNetTcp,版本选择.net framework v4.0.30319

 

 

  1. 右击网站 ,添加网站,网站名为WcfNetTcp,程序池选择WcfNetTcp,物理路径选择刚刚解决方案中WEB项目WcfService的物理路径,端口我这里设置的是8081

点击网站的高级设置在“已启用的协议”中添加net.tcp

 

右击网站,编辑协议-添加,选择net.tcp,绑定信息输入4507:*,确定

点击浏览网站,会列出如下信息

选择MessageService.svc链接,也可直接在浏览器上输入http://localhost:8081/MessageService.svc

浏览器会显示如下:

已创建服务。

若要测试此服务,需要创建一个客户端,并将其用于调用该服务。可以使用下列语法,从命令行中使用 svcutil.exe 工具来进行此操作:



svcutil.exe net.tcp://barry:4507/MessageService.svc/mex

 

为了让WCF能够跨域,需要在IIS的默认网站根目录下添加clientaccesspolicy.xml,有必要时还添加crossdomain.xml

clientaccesspolicy.xml

<?xmlversion="1.0" encoding="utf-8" ?>

<access-policy>

   <cross-domain-access>

      <policy>

         <allow-fromhttp-request-headers="*">

            <domain uri="*" />

         </allow-from>

         <grant-to>

            <socket-resourceport="4502-4534" protocol="tcp" />

            <resource path="/"include-subpaths="true"/>

         </grant-to>

      </policy>

   </cross-domain-access>

</access-policy>

 

crossdomain.xml

<?xmlversion="1.0" ?>

<cross-domain-policy>

  <allow-access-from domain="*"/>

</cross-domain-policy>

 

IIS默认网站是Default Web Site根目录是此网站的根目录,地方要找正确

 

  1. 回到项目中,在解决方案中,添加一个名为SilverlightApp的silverlight程序,

点击引用,添加服务器引用,输入net.tcp://localhost:4507/MessageService.svc/mex

在高级中,在字典信息类型中取消 重新使用引用的程序集中的类型

 

确定添加

 

MainPage界面设计:

<UserControl x:Class="SilverlightApp.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    d:DesignHeight="300" d:DesignWidth="400">

 

    <Grid x:Name="LayoutRoot"Background="White">

        <StackPanel Orientation="Vertical">

            <Button x:Name="btnCreateUser1"Content="生成用户1"Width="100" Margin="0,10,0,0"Click="btnCreateUser1_Click" />

            <Button x:Name="btnCreateUser2"Content="生成用户2"Width="100" Margin="0,10,0,0"Click="btnCreateUser2_Click"/>

            <TextBox x:Name="tbContent"Width="200" Height="150"Margin="0,10,0,0"/>

            <Button x:Name="btnSend"Content="发送"Width="100" Margin="0,10,0,0"Click="btnSend_Click"/>

            <TextBox x:Name="tbContentRecord"Width="200" Height="150"Margin="0,10,0,0"/>

        </StackPanel>

    </Grid>

</UserControl>

 

后台代码:

public partialclassMainPage : UserControl

    {

      

        MessageInfo message = newMessageInfo();

        publicMainPage()

        {

           InitializeComponent();

          

        }

 

        privatevoidbtnSend_Click(object sender, RoutedEventArgse)

        {

            MessageManageClient client = newMessageManageClient();

           message.Content = tbContent.Text;

           message.SendTime = DateTime.Now;

           client.SendMessageAsync(message);

           client.SendMessageCompleted += (ds, de) =>

            {

               if (de.Result)

               {

                   MessageBox.Show("发送成功!");

                }

               else

               {

                   MessageBox.Show("发送失败!");

               }

           };

        }

 

        privatevoidbtnCreateUser1_Click(object sender, RoutedEventArgs e)

        {

            MessageManageClient client = newMessageManageClient();

            UserInfo formUser = new UserInfo()

            {

               Id = 123,

               Name = "张三"

           };

            UserInfo toUser = new UserInfo()

            {

               Id = 234,

               Name = "李四",

           };

 

           message.FromUser = formUser;

           message.ToUser = toUser;

           message.Content = tbContent.Text;

           message.SendTime = DateTime.Now;

           client.RequestMessageAsync(formUser);

           client.RequestMessageCompleted += (rs, re) =>

            {

               if (re.Result)

               {

                   MessageBox.Show("用户"+formUser.Id+"创建成功!");

               }

           };

            client.GetMessageReceived += (gs, ge)=>

            {

               if (ge.Error == null)

               {

                   tbContentRecord.Text += "\r"+ "来自:" + ge.message.FromUser.Name + ",内容:" +ge.message.Content + ",时间:" + ge.message.SendTime.ToShortTimeString();

               }

           };

        }

 

        privatevoidbtnCreateUser2_Click(object sender, RoutedEventArgs e)

        {

            MessageManageClient client = newMessageManageClient();

            UserInfo formUser = new UserInfo()

            {

               Id = 234,

               Name = "李四"

           };

            UserInfo toUser = new UserInfo()

            {

               Id = 123,

               Name = "张三",

           };

 

           message.FromUser = formUser;

           message.ToUser = toUser;

           message.Content = tbContent.Text;

           message.SendTime = DateTime.Now;

           client.RequestMessageAsync(formUser);

           client.RequestMessageCompleted += (rs, re) =>

            {

               if (re.Result)

               {

                   MessageBox.Show("用户" +formUser.Id + "创建成功!");

               }

           };

           client.GetMessageReceived += (gs, ge) =>

            {

               if (ge.Error == null)

               {

                   tbContentRecord.Text += "\r"+ "来自:" + ge.message.FromUser.Name + ",内容:" +ge.message.Content + ",时间:" +ge.message.SendTime.ToShortTimeString();

               }

           };

        }

}

 

  1. 将WcfService项目设为启动项目,将SilverlightAppTestPage.html设为启动页面,

 

F5运行程序,复制页面路径,同时打开两个相同的页面

两个页面分别点生成用户1、生成用户2,

 

成功后,就可相互发送信息了

 

后记。对于net.tcp双工有时候真心让人不知道问题在那儿,什么跨域XML。配置文件这些都没问题,有时候就是还是要报什么跨域错误,有时候又不报跨域错误,真让人摸不着头脑,如果有对此了解深刻的,请大神指点。

源码地址:

http://download.csdn.net/detail/cyb331/5657061


本文链接:http://www.cnblogs.com/cyb331/p/3158285.html,转载请注明。

分享到:
评论

相关推荐

    silverlight+WCF的net.tcp双工通信实例过程

    10. **示例代码分析**:在提供的"silverlight+WCF的net.tcp通信实例过程.docx"文档中,可能包含了具体的代码示例,演示了如何在Silverlight和WCF中实现双工通信。而"nettcpTest.rar"文件可能包含了可运行的项目源码...

    Silverlight4中用net.tcp双工方式与进行通信

    在Silverlight 4中,开发者可以利用.NET框架的网络通信功能,尤其是net.tcp协议,来实现双向(双工)通信。这种通信模式使得客户端和服务器之间可以同时发送数据,而不仅仅是一方发送,另一方接收。这对于实时应用,...

    实现从客户端订阅WCF服务,到调用WCF方法及WCF服务端处理完成回调客户端过程,采用net.tcp双工模式.zip

    在本文中,我们将深入探讨如何实现从客户端订阅Windows Communication Foundation(WCF)服务,并通过net.tcp双工模式调用服务方法以及服务端处理完成后回调客户端的过程。WCF是.NET框架中用于构建分布式应用程序的...

    在IIS上部署Silverlight+WCF项目教程

    "在IIS上部署Silverlight+WCF项目教程" 本教程旨在指导用户如何在IIS上部署Silverlight+WCF项目,并解决可能遇到的问题。 首先,需要在IIS上配置好Silverlight+WCF项目的环境。具体来说,需要在IIS中添加以下MIME...

    silverlight+Wcf实现登录

    通过以上步骤,我们可以构建一个基于Silverlight和WCF的登录系统,它结合了Silverlight的富用户体验和WCF的灵活通信能力,为用户提供了一个高效、安全的登录界面。在实际项目中,这种组合经常被采用,特别是在企业级...

    WCF net.Tcp

    net.Tcp是WCF中的一种传输协议,它提供了低级网络通信支持,专为高性能、低延迟的场景设计。** ### 1. WCF 概述 WCF是.NET框架的一部分,它为开发人员提供了一种统一的方式来创建、部署和管理跨网络的服务。WCF服务...

    sliverlight4 WCF NET.TCP 在线聊天

    综上所述,结合Silverlight 4的富客户端能力和WCF的NET.TCP协议,我们可以构建出一个高效、稳定的在线聊天系统。这个系统不仅具备优秀的用户体验,而且在数据传输效率和实时性方面都有出色表现。通过不断优化和扩展...

    MF00680-silverlight+wcf仓库管理源码.zip

    silverlight+wcf仓库管理系统源码 仓库源码 开发语言 : C# 数据库 : SQL2008 开发工具 : VS2010 源码类型 : WebForm 注意:不带技术支持,有帮助文件,虚拟商品,发货不退,看好再拍。 源码描述: silverlight +...

    Silverlight与自托管WCF使用TCP双工通信

    Silverlight访问WCF遇到跨域访问问题? 未能连接到 net.tcp://localhost:4503/IMyService。连接尝试的持续时间为 00:00:00.3300189。TCP 错误代码 10013: 试图以其访问权限所禁止的方式访问套接字。。原因可能是,...

    Wcf双工实例

    实现客户端订阅,WCF服务端回调应答,双工通信。net.tcp模式

    wcf双工通信Demo

    在WCF中,双工通信模式(Duplex Contract)是一种高级的消息交换模式,它允许服务与客户端双向通信,即两者都可以独立地向对方发送消息。这与传统的请求-响应模型不同,后者只允许服务端对客户端的请求作出响应。 *...

    WCF(NETTCP双工模式)客户端与服务端代码

    **WCF(Windows Communication ...综上所述,WCF.NET TCP双工模式允许高效、可靠的双向通信,适用于需要实时交互的场景。服务端和客户端都需要正确配置契约、回调契约、数据传输以及连接管理,以实现顺畅的数据交换。

    Silverlight与WCF之间的双工通信

    3. **实例化模式**: 为了实现双工通信,WCF服务通常使用会话式实例化模式(PerSession)。这样,服务和客户端之间可以维持一个持久的连接,服务可以通过回调接口调用客户端方法。 4. **Security**: 在实际应用中,...

    WCF双工通信案例

    在WCF中,双工通信是一种特殊的服务交互模式,允许服务和客户端之间的双向通信,就像电话对话一样,两者可以同时进行发言。这种模式与传统的请求-响应模式不同,后者只能由一方发起请求,另一方作出响应。 首先,让...

    WCF Net.TCP 端口共享示例

    多个WCF服务共享同一个TCP端口提供服务的示例,本示例完整可用!

    Silverlight+WCF配置

    Silverlight+WCF配置具体方法 讲解

    silverlight+wcf+linq简单实例

    在这个"silverlight+wcf+linq简单实例"中,我们将深入探讨这三种技术如何协同工作,以实现对服务器数据库的数据操作。 首先,Silverlight是微软开发的一种RIA(Rich Internet Application)技术,它允许开发者创建...

    WCF netTcpBinding 双工通信 实时连接断开检测

    **标题解析:** "WCF netTcpBinding 双工通信 实时连接断开检测" 这个标题指出了本文档将关注Windows Communication Foundation (WCF) 中的netTcpBinding,特别是其双工通信模式以及如何实现实时检测连接是否断开的...

    Silverlight + WCF 数据压缩

    在"Silverlight + WCF 数据压缩"这个主题中,我们将探讨如何在Silverlight客户端与WCF服务之间高效地传输数据,通过数据压缩来减少网络带宽消耗。 首先,理解数据压缩的重要性是关键。在网络通信中,如果数据量大,...

    Silverlight+WCF 员工管理系统

    总的来说,"Silverlight + WCF 员工管理系统"是将现代Web开发技术和企业级服务架构相结合的实例,实现了高效、安全且用户体验良好的员工信息管理。其设计和实现涉及到了UI设计、网络通信、服务化、数据库管理和业务...

Global site tag (gtag.js) - Google Analytics