WCF 采用net.tcp协议实践

 

概述

与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(服务接口全名)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<!--描述绑定-->
<bindings>
<netTcpBinding>
<binding name="netTcpBindConfig" closeTimeout="00:30:00"
openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:01:00" enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"></transport>
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<!--描述服务-->
<services>
<service name="DataSync.Services.DataSyncServiceImpl" behaviorConfiguration="WFServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:808/DSServiceImpl"/>
</baseAddresses>
</host>
<endpoint address=""
contract="DataSync.Interfaces.IDataSyncEntry"
binding="netTcpBinding"
bindingConfiguration="netTcpBindConfig" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<!--描述行为-->
<behaviors>
<serviceBehaviors>
<behavior name="WFServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="6553600"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel> <system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。
在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。
-->
<directoryBrowse enabled="true"/>
</system.webServer> <system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web> </configuration>

S4.2客户端模板

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

替换Contract(服务接口全名)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IDataSyncEntry">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://75wojoax/WcfWays/DataSyncServiceImpl.svc"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IDataSyncEntry"
contract="Remote.IDataSyncEntry" name="NetTcpBinding_IDataSyncEntry" />
</client>
</system.serviceModel>
</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)如果服务端使用了安全配置,如

<security mode="None">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"></transport>
<message clientCredentialType="Windows" />
</security>

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

<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IDataSyncEntry">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>

或者代码中

var binding = new NetTcpBinding();
binding.Security = new NetTcpSecurity()
{
Mode = SecurityMode.None
};

P4 契约返回DataTable

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

解决方案

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

2) 传递DataSet可以。

public System.Data.DataSet TestDataTable()
{
DataTable dt = new DataTable("result");
dt.TableName = "navigateData";
dt.Columns.Add("Name",typeof(string));
var dr = dt.NewRow();
dr["Name"] = "pz";
dt.Rows.Add(dr); dr = dt.NewRow();
dr["Name"] = "pz2";
dt.Rows.Add(dr); var ds = new DataSet();
ds.Tables.Add(dt); return ds;
}

P5 使用Channel Factory

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

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

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

public static DataSync.Interfaces.IDataSyncEntry CreateDataSyncEntryServices()
{
EndpointAddress addr = new EndpointAddress("net.tcp://75wojoax/WcfWays/DataSyncServiceImpl.svc");
var binding = new NetTcpBinding();
binding.Security = new NetTcpSecurity()
{
Mode = SecurityMode.None
};
var channel = new ChannelFactory<DataSync.Interfaces.IDataSyncEntry>(binding, addr);
var service = channel.CreateChannel();
return service;
}
 
 
分类: WCF

WCF 采用net.tcp协议的更多相关文章

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

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

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

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

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

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

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

    本文转自:http://www.cnblogs.com/Gyoung/archive/2012/12/11/2812555.html 1 部署IIS 1.1 安装WAS IIS原本是不支持非HTTP协 ...

随机推荐

  1. SSL/TLS协议运行机制的概述(转)

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...

  2. mysql导出和导入命令更改数据库名称数据库

    概要 mysql 数据库导入和导出,有两种方法 1)从试点SQL脚本.导入(导入导出又分两种:1. 命令. 2. 工具.这里我们仅仅介绍命令). 2)直接拷贝数据库文件(此方法不推荐). 一.mysq ...

  3. Linux netstat订购具体解释

    简单介绍 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics).masquerade 连接.多播成员 (Multicast Memb ...

  4. 2014ACM/ICPC亚洲区域赛牡丹江站汇总

    球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...

  5. String.Split()功能

    我们在过去的教训 String.Join功能(http://blog.csdn.net/zhvsby/archive/2008/11/28/3404704.aspx).当中用到了String.SPli ...

  6. 如何为ios酷我音乐盒下载导出的音乐文件(使用Java程序设计)

    这个工具已经准备第二版,读者了解编程软件,可以直接使用,请阅读和使用这个场地 http://blog.csdn.net/jzj1993/article/details/44459983 本文所涉及内容 ...

  7. 编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔

    package sundemo2; import java.io.File; import java.io.FileReader; import java.io.FileWriter; public ...

  8. Java中关于继承、类、多态、接口的知识点

    继承 含义:在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类 优点:1)代码的重用性:2)子类扩展父类的属性和方法:3)父类的属性和方法可用于子类:4)设计应用程序 ...

  9. JS怎样将拖拉事件与点击事件分离?

    帖子:http://bbs.csdn.net/topics/390785395?page=1#post-397369340 怎样将拖拉事件跟点击事件分离? 须要做到:拖拉时不触动点击事件 <ht ...

  10. DateTime.ToString("dd/MM/yyyy");后,不能直接Convert.ToDateTime的解决:

    原文:DateTime.ToString("dd/MM/yyyy");后,不能直接Convert.ToDateTime的解决: DateTime.ToString("dd ...