服务引用错误:无法为服务引用生成代码

139

我有一个Windows服务解决方案,正在尝试在VS2010中添加对Hermes(开源ebms消息服务器)Web服务的服务引用。

我可以通过URL找到Web服务,但是当我尝试填充服务引用时,在Visual Studio中会出现以下错误:

Error 8 Custom tool error: Failed to generate code for the service reference 'testService'.  Please check other error and warning messages for details. C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler


Warning 6 Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 7 Custom tool warning: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:service[@name='EbmsMessageStatusQuery']/wsdl:port[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 5 Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter
Error: Schema with target namespace 'http://service.ebms.edi.cecid.hku.hk/' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

一些调查似乎表明,这是由于svcutil.exe无法构建代理而导致的,可能是因为没有权限访问某个目录(可能是c:\windows\temp)。我已经尝试分配各种访问权限,但我不确定哪个用户需要许可,或者是否只是一个干扰项。

如果有任何想法,将不胜感激。

谢谢

13个回答

314

必须在“配置服务引用”选项中取消所有已引用程序集中的“重用类型”的勾选

详情请参见此处


3
或者,当确实需要“重用引用程序集中的类型”时,您可以从专门为此目的创建的“类库项目”中添加服务引用。请查看我的回复以获取额外信息。 - Florin Dumitrescu
我想要一个不需要取消勾选“重用类型”选项的解决方案,我成功地找到了一个有效的方法,请参见我的答案 - Shahin Dohan
不要像这样做,而是使用 WCF 客户端依赖的程序集,而不是盲目地使用所有引用的程序集。这可能比取消问题中的复选框更棘手和耗时,但我认为这个解决方案比标记为答案的那个更合适。 - Oscar Guillamon
还要确保您的项目不是只读的。这就是我的问题所在。 - arihanth jain

129

右键单击您的服务引用,选择配置服务引用...

Configure Service Reference

然后取消选中在已引用的程序集中重用类型

Reuse Types

点击确定,清理并重新构建您的解决方案。


3
如果我需要重复使用引用的程序集怎么办?我有一个项目,勾选了该复选框。更新在我的机器上可以工作,但在同事的机器上却不能...有什么线索吗? - Ricardo Appleton
这是我升级我的项目从 v4.6.1 到 v4.7 时发生的。这个修复了它。 - Mike Flynn

20
在尝试使用Visual Studio 2012从ASP.Net MVC 4.0项目生成Web服务客户端时,我也遇到了类似的错误。问题的根源似乎是我尝试生成客户端的项目引用了一个另一个未被引用的程序集。
当在服务配置中启用“重用已引用程序集中的类型”时,服务生成器可能会检查所有已引用的程序集以获取可以重用的类型列表。其中一个引用的程序集引用了另一个不可用的程序集,可能导致生成器失败。
取消服务配置中的“重用已引用程序集中的类型”复选框将解决上述问题,但会带来副作用。重用类型选项存在有其用途,在某些情况下可以避免代码中不必要的强制转换。
例如,如果服务本身是使用WCF构建的,并且其中一些方法参数为System.Guid类型,则在禁用重用类型选项时,这些参数在生成的客户端中将被转换为字符串。
我更喜欢的替代方案是,从专门为此目的创建的Class Library项目中添加服务引用。需要记住的一件事是将类库的app.config中的所有与服务相关的配置复制到启动项目的配置文件中。
如果有本地程序集中定义的类型需要在服务客户端中重用,只需从以上提到的类库项目中引用这些程序集及其所有依赖项即可。

奇怪。我将绑定从HttpBinding更改为NetNamedPipeBinding(还添加了mex端点),然后在客户端程序集A中遇到了这个问题。我创建了一个新的类库B,引用了我的WCF服务。然后我将B作为A的引用添加进去,神奇地一切都恢复正常了。非常奇怪。感谢解决方案。 - citronas

3

2
由于WSDL中存在错误,所以很难猜测问题所在。没有检查WSDL,我无法发表更多评论。如果您可以分享您的WSDL,请这样做。
我能说的是,WSDL中似乎缺少一个模式(目标命名空间为“http://service.ebms.edi.cecid.hku.hk/”)。当包含指令被忽略时,我知道会出现问题和不同的模式处理方式。
一般来说,我发现微软的Web服务实现相当不错,因此我认为Web服务返回了有问题的WSDL。

谢谢Aliostad,我会尝试并在下班后分享WSDL。 - jheppinstall

2

重新启动Visual Studio对我很有帮助。我正在使用VS 2015。


0

遇到相同的问题,通过以管理员模式运行Visual Studio解决了


0

我在将 VS2010 WCF+Silverlight解决方案升级到VS2015 Professional 过程中遇到了这个问题。除了自动将Silverlight 4升级到Silverlight 5之外,服务引用重用复选框的值也发生了改变,导致生成失败。


0

我在Silverlight 5 (VS2012)中遇到了相同的错误。

您还可以删除对以下内容的引用:

  • System.ServiceModel.DomainServices.Client
  • System.ServiceModel.DomainServices.Client.Web

在更新服务引用后,请确保将它们重新添加。


0
如上所述,可能存在几个不同的问题。我们发现WCF库的.DLL已被添加为客户端项目的引用。这反过来会导致解析对象出现问题,从而导致文件被代码生成步骤“清空”。虽然取消选中“重用类型...”似乎是一个答案,但它会创建对象类型的代理到真实类型的额外定义,在新名称空间中,这会导致使用这些类型时出现各种“兼容性”问题。只有当您真正想要“隐藏”类型时,才应该检查此选项。
当您不希望“DLL”类型依赖项“泄漏”到您试图与另一个项目隔离的项目中时,隐藏类型是适当的。如果WCF库项目的DLL渗入客户端项目引用,则会出现各种奇怪的副作用问题,因为类型定义也在DLL中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接