将WCF项目部署到IIS后无法添加服务引用
兄弟,我太懂你这种WCF部署到IIS后卡元数据的糟心情况了!之前帮好几个开发者排查过类似问题,咱们一步步来揪出问题根源:
第一步:先确认IIS上的WCF服务本身能正常访问
这是最基础的前提,先别着急加服务引用,先验证服务在IIS上是否活了:
- 打开浏览器,直接访问
http://localhost/Service1.svc(默认80端口可以不用写,如果你改了IIS绑定的端口,记得加上,比如http://localhost:8080/Service1.svc)。如果能看到WCF的默认服务页面,说明部署基本没问题;如果打不开,先解决这个:- 检查应用程序池:.NET CLR版本必须和你的WCF项目匹配(比如项目用的是.NET Framework 4.8,就不能选“无托管代码”),另外应用程序池的状态要是“已启动”
- 检查物理路径:IIS网站的物理路径必须指向你WCF项目发布后的文件夹,不是源码文件夹!
- 检查权限:给发布文件夹加个Everyone的读取权限先测试(后续再改更严格的权限),避免因为权限不够导致服务无法加载
- 如果能打开Service1.svc页面,再试试访问元数据地址
http://localhost/Service1.svc/$metadata。要是能看到一堆XML格式的元数据,说明元数据发布没问题;要是访问失败,那就是配置的锅。
第二步:检查WCF服务的元数据配置(重点!)
打开你WCF项目的web.config,盯着这几个关键配置:
- 必须开启服务行为里的元数据发布:
<behaviors> <serviceBehaviors> <behavior name="YourServiceBehavior"> <!-- 这个节点必须有,httpGetEnabled要设为true --> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> - 服务节点必须引用上面的行为配置,还要加元数据交换的端点:
注意:<services> <service name="YourNamespace.Service1" behaviorConfiguration="YourServiceBehavior"> <!-- 业务服务端点 --> <endpoint address="" binding="basicHttpBinding" contract="YourNamespace.IService1"/> <!-- 元数据交换端点,这个是给客户端获取元数据用的! --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services>name和contract里的命名空间要和你实际的代码一致,别写错了!
第三步:排查网络和防火墙问题
- 本机测试的话,先暂时关闭Windows防火墙试试,有时候防火墙会拦截元数据的请求
- 如果是局域网其他机器测试,别用
localhost,换成你主机的IP地址,比如http://192.168.1.105/Service1.svc/$metadata,同时确保其他机器能ping通你的主机,且防火墙允许对应端口的入站请求
第四步:用命令行工具辅助排查
如果Visual Studio的服务引用界面报错信息太模糊,试试用svcutil.exe命令行工具生成客户端代码,它会给出更详细的错误:
打开命令提示符(以管理员身份),输入:
svcutil http://localhost/Service1.svc/$metadata
如果命令行报错,根据提示就能精准定位问题,比如是元数据格式错误,还是权限问题。
内容的提问来源于stack exchange,提问作者seeDoubleyou
相关产品推荐
相关产品推荐

