II7 承载的WCF服务,在VS中添加引用出错

场景:

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

时间: 2024-08-03 15:28:38

II7 承载的WCF服务,在VS中添加引用出错的相关文章

wcf服务元数据WSDL中的地址为请求方地址不再是主机名

WCF服务的WSDL内容中服务地址里的主机部分都是默认是主机名称,这样在一些虚拟机环境下外部根本访问不到这些主机,开发时候引用会发生异常 经查可以通过配置服务行为,让这些主机内容为请求方的主机地址,需要Web.config中修改: useRequestHeadersForMetadataAddress 见:http://www.baidu.com/link?url=6kTHiRwP6M43muX6T8bwY-RDzn8R5jYwt6eZm-3BrEXROutzR-n0bvBuNfb0MIAYd7

WCF服务端开发和客户端引用小结

1.服务端开发(包含寄宿) 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序,可生成一个带.svc后缀名的文件.该文件与webform中的aspx文件类似,有后置代码,这些后置代码是服务接口的实现.这种方式创建的WCF服务都承载在IIS或WAS上. (2)创建WCF服务库 WCF服务库是一个类库,如前所述包含一个服务接口和服务实现,此种方式创建的WCF服务可根据

WCF初探-9:WCF服务承载 (下)

在WCF初探-8:WCF服务承载 (上)中,我们对宿主的概念.环境.特点做了文字性的介绍和概括,接下来我们将通过实例对这几种寄宿方式进行介绍.为了更好的说明各寄宿环境特点,本实例采用Http和net.tcp两种服务通讯方式,同时寄宿在不同的宿主中.程序结构如下: 服务契约的接口和实现代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Ser

使用IIS承载WCF服务

1.WCF可以方便的通过IIS承载,此承载模型与ASP.NET和ASP.NET Web Service使用的模型类似.2.WCF可以在以下操作系统上的IIS版本上承载 Windows XP SP2上的IIS 5.1 Windows Server 2003上的IIS 6.0 Windows Server 2008或者Windows Vista或者Windows 7上的IIS 7.0 以及IIS后续版本 3.在IIS 7.0中提供了一种新的承载服务方式即WAS(Windows Process Act

WCF服务承载 (转载)

我们对宿主的概念.环境.特点做了文字性的介绍和概括,接下来我们将通过实例对这几种寄宿方式进行介绍.为了更好的说明各寄宿环境特点,本实例采用Http和net.tcp两种服务通讯方式,同时寄宿在不同的宿主中.程序结构如下: 服务契约的接口和实现代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace Servic

IIS10 设置支持wcf服务(.svc)

感谢: http://www.cnblogs.com/dudu/p/3328066.html 如果提示web.config配置重复的话,很有可能是.net framework版本的问题,把IIS中的版本设置为2.0就可以了. 如何让IIS10支持WCF服务呢? 1. 首先添加MIME类型:扩展名“.svc”,MIME类型 “application/octet-stream”: 2. 然后在“Handler Mappings(处理程序映射)”中添加Managed Handler(添加托管处理程序)

使用IIS发布WCF服务

上一篇是Windows服务为宿主的WCF服务,现在用IIS为宿主发布WCF服务. 第一步:肯定是新建一个WCF服务啦[是WCF服务应用程序],然后在解决方案上再次添加一个新项目[我们选择WCF服务库,添加此服务库完全是为了以后编码的方便.]看下图: 第二步:将WCFService中的IService1.cs和Service1.svc.cs删除掉[我们要用WCFServiceLibrary中的类],然后在WCFService添加引用WCFServiceLibrary.最后我们双击Service1.

在IIS8添加WCF服务支持

最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少对WCF服务的Managed Handler,按照以下步骤添加后,IIS8即支持WCF服务. 1. 首先添加MIME类型 扩展名".svc",MIME类型 "application/octet-stream" 2. 然后在"Handler Mappings"

IIS8中添加WCF支持几种方法小结[图文]

方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少对WCF服务的Managed Handler,按照以下步骤添加后,IIS8即支持WCF服务. 1. 首先添加MIME类型 扩展名".svc",MIME类型 "application/octet-stream" 2. 然后在"Handler Mappings&q