VS2017调试时WCF服务突然无法启动,元数据获取失败
看起来你遇到的问题是即使恢复到之前的工作状态,WCF服务的元数据还是无法被测试客户端访问,核心错误是127.0.0.1:8733连接被拒绝,这通常意味着服务没正常启动,或者配置存在隐性问题。我给你一步步排查的方案:
一、先确认服务是否真的在运行
- 启动你的WCF服务项目后,查看VS的输出窗口(如果没显示,按
Ctrl+W,O调出),找有没有服务启动成功的日志,或者绑定失败、端口占用的错误提示。很多时候服务启动失败不会弹明显的窗口,但输出里会有细节。 - 检查8733端口是否被占用:打开命令提示符,执行
netstat -ano | findstr :8733,如果返回结果,说明这个端口被其他进程用了。你可以结束对应PID的进程(任务管理器里找PID对应的程序),或者修改配置里的端口号。
二、修正配置文件的关键问题
看你的配置,有两个明显的潜在问题:
1. 调整基地址(baseAddress)格式
你的baseAddress结尾带了/mex,这会导致服务的默认端点地址和元数据地址冲突。把它改成不带/mex的格式:
<baseAddresses> <add baseAddress="http://localhost:8733/Design_Time_Addresses/CarsGlobalService/Verksted/"/> </baseAddresses>
2. 添加元数据交换(mex)端点
虽然你开启了serviceMetadata httpGetEnabled="True",但服务并没有显式暴露mex端点,这会影响WCF测试客户端的元数据获取。在现有endpoint下面添加这个端点:
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
添加后,你的service节点应该是这样的:
<service name="CarsGlobalService.Verksted"> <host> <baseAddresses> <add baseAddress="http://localhost:8733/Design_Time_Addresses/CarsGlobalService/Verksted/"/> </baseAddresses> </host> <endpoint address="" binding="basicHttpBinding" contract="CarsGlobalService.IService1"> <identity> <dns value="localhost"/> </identity> </endpoint> <!-- 新增的mex端点 --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service>
3. 验证服务和契约的命名空间匹配
确保service name是类的完全限定名(命名空间+类名),endpoint contract是接口的完全限定名。你的配置里写的CarsGlobalService.Verksted和CarsGlobalService.IService1,要确认你的代码里Verksted类和IService1接口确实在CarsGlobalService命名空间下,没有拼写错误。
三、清理缓存和重新编译
- 清理WCF测试客户端的缓存:打开测试客户端,点击顶部菜单的文件->清除元数据缓存,然后重新尝试添加服务。
- 清理项目的
bin和obj文件夹,重新编译整个解决方案,再启动服务。
四、检查防火墙设置
本地Windows防火墙可能阻止了8733端口的连接,你可以暂时关闭防火墙测试一下,如果能正常连接,就给8733端口添加一条允许入站的防火墙规则。
最后验证
做完上面的步骤后,先在浏览器里访问http://localhost:8733/Design_Time_Addresses/CarsGlobalService/Verksted/?wsdl,如果能看到WSDL的XML内容,说明服务和元数据都正常了,再用WCF测试客户端添加这个地址就应该没问题了。
内容的提问来源于stack exchange,提问作者Dag

