VS2022 WCF服务应用netTcpBinding配置不生效问题排查
问题:VS2022下WCF net.tcp绑定配置不生效始终回退到BasicHttpBinding
开发环境为VS2022,搭建基于net.tcp协议的最简WCF服务应用时始终无法正常运行,操作步骤与现象如下:
- 新建项目选择WCF Service Application模板,项目默认生成
Web.config、Service1.svc、IService1.cs文件,初始Web.config配置如下:
<?xml version="1.0"?> <configuration> <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> </appSettings> <system.web> <compilation debug="true" targetFramework="4.7.2" /> <httpRuntime targetFramework="4.7.2"/> </system.web> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <!-- 部署前请将以下值设为false,避免泄露元数据信息 --> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <!-- 调试时可将以下值设为true,以便在故障中接收异常详细信息,部署前请设为false避免泄露异常信息 --> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <protocolMapping> <add binding="basicHttpsBinding" scheme="https" /> </protocolMapping> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> <directoryBrowse enabled="true"/> </system.webServer> </configuration>
- 直接运行初始项目,WCF Test Client正常加载,显示服务以BasicHttpBinding运行,符合预期。
- 将配置文件
protocolMapping节点下的<add binding="basicHttpsBinding" scheme="https" />修改为<add binding="wsHttpBinding" scheme="http" />后运行,WCF测试客户端正常显示服务使用WSHttpBinding,配置生效。 - 将绑定配置修改为
<add binding="netTcpBinding" scheme="net.tcp" />后运行,WCF测试客户端显示服务仍使用BasicHttpBinding,此时配置文件中不存在任何BasicHttpBinding相关配置,多次调整配置、从空白模板重建最小项目均无法解决。
根因分析
核心原因非常明确:VS2022调试WCF服务应用时默认使用IIS Express作为托管宿主,这个轻量宿主默认只启用http/https协议监听,不会自动加载net.tcp协议的监听模块,也不会分配net.tcp对应的绑定端口。你在protocolMapping里配置的net.tcp映射没有对应的宿主监听端口,根本不会被实际加载,WCF Test Client访问服务时只能走默认的HTTP通道,自然就回退到了WCF对HTTP通道默认使用的BasicHttpBinding。
你之前修改wsHttpBinding能生效,本质是因为wsHttpBinding还是走http scheme,IIS Express默认就开着http监听,只要改映射就能直接生效,和net.tcp的场景完全不同。
解决步骤
- 第一步:开启项目的非HTTP调试支持
右键Web项目点「属性」,切到「Web」标签页,拉到调试器区域,勾选启用WCF服务的非HTTP激活,保存配置。 - 第二步:修改IIS Express站点配置,添加net.tcp绑定
先在资源管理器开启「显示隐藏项目」,进入项目根目录下的.vs\config文件夹,打开applicationhost.config文件。通过搜索项目名定位到当前项目对应的<site>节点:- 在节点内的
<bindings>段新增一行net.tcp绑定配置:<binding protocol="net.tcp" bindingInformation="808:*" /> - 找到同站点下的根
<application>节点,把enabledProtocols属性值修改为http,net.tcp(在原有http值基础上追加net.tcp即可)。
- 在节点内的
- 第三步:调整Web.config配置
不需要删除原有http/https映射,只需要在protocolMapping节点追加net.tcp映射即可,调试阶段保持serviceMetadata的httpGetEnabled="true",方便测试客户端拉取元数据,最终system.serviceModel节点参考配置如下:<system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <protocolMapping> <add binding="basicHttpsBinding" scheme="https" /> <add binding="netTcpBinding" scheme="net.tcp" /> </protocolMapping> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel> - 第四步:重启调试验证
关闭之前的调试进程,重新运行项目,此时WCF Test Client会识别到两个端点:一个是走HTTP的默认端点,另一个就是配置的netTcpBinding类型的net.tcp端点,选择该端点即可正常调用。
补充说明:如果后续要把服务部署到完整版IIS,需要先开启Windows功能:找到「.NET Framework 4.7 高级服务」下的WCF服务项,勾选TCP激活和非HTTP激活;部署后在IIS站点高级设置里把「已启用的协议」修改为
http,net.tcp,再给站点添加一个net.tcp类型的绑定,填入自定义的未占用端口即可。
内容的提问来源于stack exchange,提问作者Ed R.
相关产品推荐
相关产品推荐

