这是一个测试的项目,最近突然想尝试一下把现有的WCF的wsHttpBinding换成netTcpBinding看看效率是否有点儿提高,各类网文都告诉我tcp的效率要好很多,也幸好有WAS寄宿,让我不用把现有的IIS的WCF服务迁移到Windows服务上去,记录一下过程中遇到的各类问题,仅供参考!
1.首先要把服务器环境搭好,我的服务器是Windows Server 2008 R2,控制面板->程序和功能->打开或关闭Windows功能,添加功能,把图示里的都勾上就可以了
2.上一步基本的教程里面都有,我自己本机的系统是Windows 10,开启这个功能有一点不一样,下图所示,重点看框出的部分,其他不重要请忽略!
3.其实在服务器上做这个.net 3.5的功能新增的时候很危险,如果正式在线的服务器还是慎重进行此操作,这个功能新增会影响线上的IIS使用应用程序池为.net 4.0的站点会找不到默认引用的.net 4.0一些程序集,导致站点无法正常运行,需要重新注册一下.NET 4.0,以下是重新注册IIS命令
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
4.WAS服务开启后,在IIS的绑定设置里面就出现了下图所示除了http协议的其他协议选项
5.这里选择net.tcp协议,绑定信息里面填写808:*,为啥是808呢,这应该算是一个默认的端口,可以从本机的防火墙入站规则里看到,这是Windows Communication Foundation Net.Tcp 侦听适配器(tcp-in)特定端口,扯远了继续看配置。
6.另外就是IIS的高级配置中启用的协议中添加net.tcp
7.到这里基本可以把WCF服务部署到相应的IIS站点里了,一下是测试代码
IUserService.cs
using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace WASTest { [ServiceContract] public interface IUserService { [OperationContract] string GetData(int value); // TODO: 在此添加您的服务操作 } }
UserService.svc
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace WASTest { public class UserService : IUserService { public string GetData(int value) { return string.Format("You entered: {0}", value); } } }
web.config
<system.serviceModel> <bindings> <netTcpBinding> <binding name="netTcpBindConfig"> <security mode="None"> <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding> </bindings> <services> <service name="WASTest.UserService" behaviorConfiguration="MyBehavior"> <endpoint address="" binding="netTcpBinding" bindingConfiguration="netTcpBindConfig" contract="WASTest.IUserService"></endpoint> <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"></endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="MyBehavior" > <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/> <serviceDebug includeExceptionDetailInFaults="true"/> <dataContractSerializer maxItemsInObjectGraph="6553600"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel>
8.最后直接访问http://localhost:8002/UserService.svc,可以看到如下结果
9. 最后附上可能遇到的问题和解决办法
-------------------------------------------------------------------------------------------------------------
找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]。
参考步骤6,如果是站点,站点高级设置添加net.tcp协议,如果是站点下的应用程序,对应的应用程序高级设置也需要添加!
-------------------------------------------------------------------------------------------------------------
如果你部署成功后结果,没有net.tcp的服务操作介绍,如下图所示
更改web.config的behavior设置,httpGetEnabled需要设置为false