IIS部署WCF服务报错 元数据不可访问无法添加服务引用
问题根因
添加服务引用时报元数据不可访问的错误,核心是web.config存在4处配置错误:
- mex元数据端点契约配置错误:元数据交换端点不能使用自定义服务契约
MAT_Service.IService1,必须指定系统内置的IMetadataExchange契约 - 协议与绑定不匹配:配置的基地址为HTTPS协议,但mex端点用了HTTP专属的
mexHttpBinding,同时serviceMetadata节点未开启HTTPS GET元数据访问权限 - 基地址配置冗余错误:WCF托管在IIS时,基地址由IIS站点绑定、虚拟目录路径自动生成,手动硬写固定公网IP作为基地址会导致元数据生成时地址解析异常
- 绑定适配问题:当前服务主端点用的是REST风格的
webHttpBinding,该绑定本身不支持SOAP协议的元数据交换,而Visual Studio的“添加服务引用”功能默认针对SOAP服务设计,纯REST服务无法直接通过该方式生成客户端代码。
修复步骤
1. 修正web.config配置
替换<system.serviceModel>节点下的相关配置,参考如下:
<system.serviceModel> <bindings> <webHttpBinding> <binding name="restLargeBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed"> <readerQuotas maxStringContentLength="2147483647"/> </binding> </webHttpBinding> <!-- 如需支持SOAP客户端调用,可新增basicHttpsBinding配置 --> <basicHttpsBinding> <binding name="soapBinding" maxReceivedMessageSize="2147483647"/> </basicHttpsBinding> </bindings> <behaviors> <endpointBehaviors> <behavior name ="myWebEndPointBehaviour"> <webHttp automaticFormatSelectionEnabled="true" defaultBodyStyle="Bare" defaultOutgoingResponseFormat="Json" helpEnabled="true"/> <dataContractSerializer maxItemsInObjectGraph="2147483647"/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="mybehaviour"> <!-- 同时开启HTTP、HTTPS协议的元数据GET访问权限 --> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> <dataContractSerializer maxItemsInObjectGraph="2147483647"/> </behavior> </serviceBehaviors> </behaviors> <services> <service name="MAT_Service.Service1" behaviorConfiguration="mybehaviour"> <!-- 删除手动配置的<host>/<baseAddresses>节点,IIS托管场景无需手动指定基地址 --> <!-- 保留原有REST风格端点逻辑 --> <endpoint address="" contract="MAT_Service.IService1" binding ="webHttpBinding" bindingConfiguration="restLargeBinding" behaviorConfiguration="myWebEndPointBehaviour"/> <!-- 修正mex端点:HTTPS场景使用mexHttpsBinding,契约指定为系统内置的IMetadataExchange --> <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpsBinding" /> <!-- 如需支持SOAP客户端添加服务引用,可新增该SOAP端点,纯REST服务可删除 --> <endpoint address="soap" contract="MAT_Service.IService1" binding="basicHttpsBinding" bindingConfiguration="soapBinding"/> </service> </services> <protocolMapping> <add binding="basicHttpsBinding" scheme="https" /> <add binding="basicHttpBinding" scheme="http" /> </protocolMapping> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel>
2. IIS侧配置检查
- 确认站点已绑定有效HTTPS证书,443端口可正常访问
- 确认站点对应应用程序池的.NET Framework版本为4.5,托管管道模式使用集成模式
- 给站点部署目录分配
IIS_IUSRS用户组的读取、执行权限
3. 功能验证
- 配置完成后重启IIS站点,先在浏览器访问
https://你的服务域名/IP/Service1.svc?wsdl,如果能正常输出XML格式的WSDL文档,说明元数据已正常暴露,此时即可正常添加服务引用 - 如果你的服务是纯REST服务,不需要SOAP客户端,无需使用“添加服务引用”功能,直接发送HTTP请求调用对应接口即可,REST接口的帮助文档可通过
https://你的服务域名/IP/Service1.svc/help访问。
内容的提问来源于stack exchange,提问作者Faraz Naeem
相关产品推荐
相关产品推荐

