概述

与Socket相比,WCF真是爽得不得了,其基本指导思想为SOA——面向服务。

其基本配置在于ABC(Address,Binding,Contract),通常,只要这三个因素配置对了,那么,基本上就无限接近目标了。

剩下的配置,就可能是行为(Behavior),安全(Security)等。

在所有绑定中,为什么要选择net.tcp,是因为其比较快(我这也是道听途说,究竟有多快,没有进行过测试);但是,缺点就是,net.tcp方式只能是WCF对WCF的通信。

而其繁琐复杂的配置,网上已经有诸多工程师做了很多无私的奉献。

步骤

原文参考:http://hi.baidu.com/guolulang/item/b5bdb01ccb23810ce65c36d6

http://www.cnblogs.com/Gyoung/archive/2012/12/11/2812555.html

Step1:设置“打开或关闭Windows功能”

打开红色框内的功能

Step2:设置IIS

选中Default Web Site ——点击“绑定”——确保网站绑定对话框中有“net.tcp”(默认端口号808),如果没有,则“添加”

选中项目——高级设置——确保有“net.tcp”

Step3:设置“服务”

Step4:设置配置文件

只需将下文中的******替换即可。

S4.1服务端模板

替换Address(主机名+端口+文件路径形式的名称);

替换Contract(服务接口全名)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <system.serviceModel>
  4. <!--描述绑定-->
  5. <bindings>
  6. <netTcpBinding>
  7. <binding name="netTcpBindConfig" closeTimeout="00:30:00"
  8. openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
  9. transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
  10. hostNameComparisonMode="StrongWildcard" listenBacklog="10"
  11. maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
  12. maxReceivedMessageSize="2147483647">
  13. <readerQuotas maxDepth="2147483647"
  14. maxStringContentLength="2147483647"
  15. maxArrayLength="2147483647"
  16. maxBytesPerRead="2147483647"
  17. maxNameTableCharCount="2147483647" />
  18. <reliableSession ordered="true" inactivityTimeout="00:01:00" enabled="false" />
  19. <security mode="None">
  20. <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"></transport>
  21. <message clientCredentialType="Windows" />
  22. </security>
  23. </binding>
  24. </netTcpBinding>
  25. </bindings>
  26. <!--描述服务-->
  27. <services>
  28. <service name="DataSync.Services.DataSyncServiceImpl" behaviorConfiguration="WFServiceBehavior">
  29. <host>
  30. <baseAddresses>
  31. <add baseAddress="net.tcp://localhost:808/DSServiceImpl"/>
  32. </baseAddresses>
  33. </host>
  34. <endpoint address=""
  35. contract="DataSync.Interfaces.IDataSyncEntry"
  36. binding="netTcpBinding"
  37. bindingConfiguration="netTcpBindConfig" />
  38. <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  39. </service>
  40. </services>
  41. <!--描述行为-->
  42. <behaviors>
  43. <serviceBehaviors>
  44. <behavior name="WFServiceBehavior">
  45. <serviceMetadata httpGetEnabled="true"/>
  46. <serviceDebug includeExceptionDetailInFaults="true"/>
  47. <dataContractSerializer maxItemsInObjectGraph="6553600"/>
  48. </behavior>
  49. </serviceBehaviors>
  50. </behaviors>
  51. </system.serviceModel>
  52.  
  53. <system.webServer>
  54. <modules runAllManagedModulesForAllRequests="true"/>
  55. <!--
  56. 若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。
  57. 在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。
  58. -->
  59. <directoryBrowse enabled="true"/>
  60. </system.webServer>
  61.  
  62. <system.web>
  63. <compilation debug="true" targetFramework="4.0" />
  64. </system.web>
  65.  
  66. </configuration>

S4.2客户端模板

替换Address(指定寄宿的地址,如****/***.svc,而不是上文的DSServiceImpl);

替换Contract(服务接口全名)

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <system.serviceModel>
  4. <bindings>
  5. <netTcpBinding>
  6. <binding name="NetTcpBinding_IDataSyncEntry">
  7. <security mode="None" />
  8. </binding>
  9. </netTcpBinding>
  10. </bindings>
  11. <client>
  12. <endpoint address="net.tcp://75wojoax/WcfWays/DataSyncServiceImpl.svc"
  13. binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IDataSyncEntry"
  14. contract="Remote.IDataSyncEntry" name="NetTcpBinding_IDataSyncEntry" />
  15. </client>
  16. </system.serviceModel>
  17. </configuration>

问题

P1 需重启IIS

问题描述:未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.ServiceModel.Activation.HttpModule”。

解决办法(执行以下命令,以重启IIS):

如果安装了 .NET Framework 4,随后启用了 .NET Framework 3.5 WCF HTTP 激活,则会发生此错误。若要解决该问题,请在 Visual Studio 2010 命令提示符下运行下面的命令行: aspnet_regiis.exe -i -enable 参见:http://msdn.microsoft.com/zh-cn/library/aa751852.aspx

P2 需匹配的协议

问题描述:找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]。

解决方案:确保服务端和客户端均使用NetTcpBinding协议。

参考:http://www.cnblogs.com/liulun/archive/2011/11/25/2263873.html

P3需匹配的协议

问题描述:无法调度消息,因为终结点地址“net.tcp://localhost/DataSyncServiceImpl.svc”上的服务对该地址的协议不可用。

解决方案:

1)确保服务端和客户端均使用NetTcpBinding协议;

2)如果服务端使用了安全配置,如

  1. <security mode="None">
  2. <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"></transport>
  3. <message clientCredentialType="Windows" />
  4. </security>

则,客户端也需要使用同类的协议,如

  1. <bindings>
  2. <netTcpBinding>
  3. <binding name="NetTcpBinding_IDataSyncEntry">
  4. <security mode="None" />
  5. </binding>
  6. </netTcpBinding>
  7. </bindings>

或者代码中

  1. var binding = new NetTcpBinding();
  2. binding.Security = new NetTcpSecurity()
  3. {
  4. Mode = SecurityMode.None
  5. };

P4 契约返回DataTable

问题描述:使用DataTable作为返回值

解决方案

1) 网上传说——使用命名的DataTable,即为DataTable的TableName赋一个名称(试了一下,不行);

2) 传递DataSet可以。

  1. public System.Data.DataSet TestDataTable()
  2. {
  3. DataTable dt = new DataTable("result");
  4. dt.TableName = "navigateData";
  5. dt.Columns.Add("Name",typeof(string));
  6. var dr = dt.NewRow();
  7. dr["Name"] = "pz";
  8. dt.Rows.Add(dr);
  9.  
  10. dr = dt.NewRow();
  11. dr["Name"] = "pz2";
  12. dt.Rows.Add(dr);
  13.  
  14. var ds = new DataSet();
  15. ds.Tables.Add(dt);
  16.  
  17. return ds;
  18. }

P5 使用Channel Factory

问题描述:客户端可以直接“引用服务”以生成***Client,但是,这不利于修改。

修改了接口之后,没有办法及时通知到客户端,除了“更新服务饮引用”之外。

解决方案:客户端引用服务接口,并使用Channel Factory进行解耦,则客户端只依赖接口。

  1. public static DataSync.Interfaces.IDataSyncEntry CreateDataSyncEntryServices()
  2. {
  3. EndpointAddress addr = new EndpointAddress("net.tcp://75wojoax/WcfWays/DataSyncServiceImpl.svc");
  4. var binding = new NetTcpBinding();
  5. binding.Security = new NetTcpSecurity()
  6. {
  7. Mode = SecurityMode.None
  8. };
  9. var channel = new ChannelFactory<DataSync.Interfaces.IDataSyncEntry>(binding, addr);
  10. var service = channel.CreateChannel();
  11. return service;
  12. }
 
 
http://www.cnblogs.com/pengzhen/p/3792823.html

WCF 采用net.tcp协议实践(转)的更多相关文章

  1. WCF 采用net.tcp协议实践

    概述 与Socket相比,WCF真是爽得不得了,其基本指导思想为SOA——面向服务. 其基本配置在于ABC(Address,Binding,Contract),通常,只要这三个因素配置对了,那么,基本 ...

  2. WCF 采用net.tcp协议

    WCF 采用net.tcp协议实践   概述 与Socket相比,WCF真是爽得不得了,其基本指导思想为SOA——面向服务. 其基本配置在于ABC(Address,Binding,Contract), ...

  3. 如何在wcf中用net tcp协议进行通讯

    快速阅读 如何在wcf中用net tcp协议进行通讯,一个打开Wcf的公共类.比较好好,可以记下来. 配置文件中注意配置 Service,binding,behaviors. Service中配置en ...

  4. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  5. 采用TCP协议的PIC32MZ ethernet bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 趁热打铁,在上一PIC ...

  6. 采用TCP协议实现PIC18F97J60 ethernet bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). TCP/IP Stac ...

  7. [WCF实践]1.WCF使用net.tcp寄宿到IIS中

    一.IIS部分 环境:Windows Server 2008 R2 1.安装WAS,如下图所示:   2.网站net.tcp协议绑定,如下图所示:   3.网站启用net.tcp,如下图所示:   二 ...

  8. 在网络7层协议中,如果想使用UDP协议达到TCP协议的效果,可以在哪层做文章?(QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?)

    为了解决这题,可以具体看看下面这个讨论. 解灵运工程师 185 人赞同 某次架构师大会上那个58同城做即时通信的人说:原因是因为当时没有epoll这种可以支持成千上万tcp并发连接的技术,所以他们使用 ...

  9. WCF:如何将net.tcp协议寄宿到IIS

    1 部署IIS 1.1 安装WAS IIS原本是不支持非HTTP协议的服务,为了让IIS支持net.tcp,必须先安装WAS(Windows Process Activation Service),即 ...

随机推荐

  1. 超短reads(primer、barcode、UMI、index等)比对方法

    二代reads最短都有50bp,所以大家常用的比对工具都是不支持50bp以下的reads的比对的. 但是,在实际中,我们确实又有比对super short reads的需求. So,我找到了如下方法来 ...

  2. DOM文档对象模型

  3. Serega and Fun CodeForces - 455D (分块 或 splay)

    大意:给定n元素序列, 2种操作 将区间$[l,r]$循环右移1位 询问$[l,r]$中有多少个等于k的元素 现在给定q个操作, 输出操作2的询问结果, 强制在线 思路1: 分块 每个块内维护一个链表 ...

  4. 关于vue Unexpected identifier 问题

    vue对于es6虽然自带babel转换 但是在index.html文件中并不会发生转换 因此在index.html中使用新的语法会导致低版本浏览器不识别代码因此报出Unexpected identif ...

  5. 在linux下出现cannot restore segment prot after reloc: Permission denied

    应用程序连接oracle的库时会出现如下错误:XXXXX:: error while loading shared libraries: /usr/local/oracle/product/10.2. ...

  6. textAlign

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  7. spring cloud学习(三)使用Ribbon实现客户端负载均衡

    使用Ribbon实现客户端的负载均衡 * 个人博客空间 : https://zggdczfr.cn/ * Ribbon Spring Cloud Netflix Ribbon 是一个客户端负载均衡的组 ...

  8. POJ 1166 暴力搜索 即 枚举

    e.... 米还是没有读懂题....T_T ..... e.... 这就是传说中的暴力吗....太血腥了....太暴力了...九重for循环....就这么赤裸裸的AC了.... 水是水了点..但是.. ...

  9. Java——IO类 字节流概述

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  10. 《Python》 内置函数补充、匿名函数、递归初识

    一.内置函数补充: 1.数据结构相关(24): 列表和元祖(2):list.tuple list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素). tuple:将一个可迭代对象转 ...