场景:
1、WCF 服务成功部署到 IIS7,测试方式:
1)浏览器可以打开svc 和 wsdl
如: http://IP地址:8087/WCFService/MyService.svc
http://IP地址:8087/WCFService/MyService.svc?wsdl
2) 手动编写客户端,调用相关方法亦成功
注意:上面测试中“IP地址”,代表实际的IP地址。
2、使用工具自动生成客户端代理失败
1)使用VS 自带的添加服务引用工具时,失败信息如下:
解了文档内容,但无法进行处理。
- WSDL 文档包含无法解析的链接。
- 下载“http://主机名:8087/WCFService/MyService.svc?xsd=xsd0”时出错。
- 请求因 HTTP 状态 400 失败: Bad Request。
元数据包含无法解析的引用:“http://IP地址:8087/WCFService/MyService.svc?wsdl”。
没有终结点在侦听可以接受消息的 http://P地址:8087/WCFService/MyService.svc?wsdl。这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参见 InnerException 以了解详细信息。
远程服务器返回错误: (404) 未找到。
如果该服务已在当前解决方案中定义,请尝试生成该解决方案,然后再次添加服务引用。
2)使用 svcutil.exe 工具自动生成代理时,失败信息如下:
D:\>svcutil.exe http://IP地址/WCFService/MyService.svc?wsdl
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation,版本 4.0.30319.17929]
版权所有(C) Microsoft Corporation。保留所有权利。
正在尝试使用 WS-Metadata Exchange 或 DISCO 从“http://IP地址:8087/WCFServi
ce/MyService.svc?wsdl”下载元数据。
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation,版本 4.0.30319.17929]
版权所有(C) Microsoft Corporation。保留所有权利。
错误: 无法从 http://IP地址:8087/WCFService/MyService.svc?wsdl 获取元数据
如果是您有权访问的 Windows (R) Communication Foundation 服务,请检查是否已启用在
指定地址发布元数据。有关启用元数据发布的帮助,请参阅 http://go.microsoft.com/fwl
ink/?LinkId=65455 上的 MSDN 文档。
WS-Metadata Exchange 错误
URI: http://IP地址:8087/WCFService/MyService.svc?wsdl
元数据包含无法解析的引用:“http://IP地址:8087/WCFService/MyService.s
vc?wsdl”。
没有终结点在侦听可以接受消息的 http://IP地址:8087/WCFService/MyServi
ce.svc?wsdl。这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参
见 InnerException 以了解详细信息。
远程服务器返回错误: (404) 未找到。
HTTP GET Error
URI: http://IP地址:8087/WCFService/MyService.svc?wsdl
理解了文档内容,但无法进行处理。
- WSDL 文档包含无法解析的链接。
- 下载“http://主机名:8087/WCFService/MyService.svc?xsd=xsd0”时出
错。
- 请求因 HTTP 状态 400 失败: Bad Request。
如果希望获取更多帮助,请键入“svcutil /?”
注意:上面测试中“主机名”,代表实际的主机名称。
分析
1、测试:提升用户权限,效果:无效
2、测试:IIS 网络绑定中添加主机名,效果:无效
3、分析原因:
1) 错误提示:
A.VS 引用错误 - 下载“http://主机名:8087/WCFService/MyService.svc?xsd=xsd0”时出错。
B.svcutil.exe 错误 - 下载“http://主机名:8087/WCFService/MyService.svc?xsd=xsd0”时出错。
分析:如“主机名”为“IP地址”即可。
解决
IIS 部署目录下配置文件添加如下项:
<serviceBehaviors>
<behavior name="<name>">
<useRequestHeadersForMetadataAddress>
<defaultPorts>
<add scheme="http" port="端口号" />
<add scheme="https" port="端口号" />
</defaultPorts>
</useRequestHeadersForMetadataAddress>
</behavior>
</serviceBehaviors>
The configuration causes WCF to generate the correct URI by using the "Host" HTTP header of the incoming metadata request. In this case, the "Host" header contains the load balancer address instead of the internal node address.
注意:
1)配置值“端口号”应为实际的端口号。
2)<name></name>是一个占位符,应该替换行为名称 WCF 服务中。
参考:
FIX: URIs in a WCF WSDL document refer to inaccessible internal instances instead of to the load balancer as expected in the .NET Framework 3.0 in Windows Server 2003, Windows XP, Windows Vista and Windows Server 2008
Scenario 1:
You use the “Add Service Reference” command or the svcutil.exe command-line tool to download the metadata from the service.
In this scenario, when you try to generate a proxy from the metadata, the process fails because the metadata contains URIs that reference internal Web site instances.
Scenario 2:
In this scenario, you notice that the URIs in the WSDL document refer to inaccessible internal Web site instances (http://127.0.0.1:5001/Service.svc?wsdl).
However, you expect the URIs in the WSDL document to refer to the load balancer (http://127.0.0.1:81/Service.svc?wsdl).
References:
http://support.microsoft.com/kb/971842