服务参考错误:无法为服务参考生成代码


131

我有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)而无法构建代理。我尝试分配各种访问权限,但是我不确定是哪个用户需要该权限,或者它只是一个红色鲱鱼。

任何想法将不胜感激。

谢谢

Answers:


303

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

检查此以获取详细信息


3
或者,当实际需要“在引用的程序集中重用类型”时,可以从专门为此目的创建的类库项目中添加服务引用。查看我的回复以获取其他信息。
Florin Dumitrescu

我想要一种解决方案,而无需取消选中“重用类型”,因此设法找到了可行的解决方案,请在此处查看我的答案
Shahin Dohan

与其执行类似的操作,不如使用WCF客户端依赖的程序集,而不是盲目地使用所有引用的程序集,这比取消选中有问题的复选框要花很多时间和技巧,但我发现这种解决方案比那种解决方案更合适标记为答案。
奥斯卡·吉拉蒙

另外,还要确保你的项目是不是读Only..This是我的问题..
arihanth耆那

126

右键单击您的服务参考,然后选择 Configure Service Reference...

配置服务参考

然后取消选中 Reuse types in referenced assemblies

重用类型

单击开始OK,清理并重建您的解决方案。


2
如果我需要重用引用的程序集怎么办?我有一个项目,并且该复选框已选中。更新可以在我的计算机上运行,​​但是在同事的计算机上却没有...任何提示?
里卡多·阿普尔顿

当我从项目中从v4.6.1升级到v4.7时,发生了这种情况。这样就解决了。
Mike Flynn

17

当尝试使用Visual Studio 2012从ASP .Net MVC 4.0项目生成Web服务的客户端时,我也遇到了类似的错误。

问题的根源似乎是这样一个事实,即我试图从中生成客户端的项目正在引用一个程序集,而该程序集又依赖于另一个未被引用的程序集。

如果在服务配置中启用了“在引用的程序集中重新使用类型”,则服务生成器可能正在检查所有引用的程序集以获得可重复使用的类型的列表。被引用的程序集之一正在引用另一个不可用的程序集这一事实很可能导致生成器发生故障。

从服务配置中取消选中“引用的程序集中的重用类型” 将解决上述问题,但有副作用。出现复用类型选项是有原因的,在某些情况下,它避免了不必要的代码转换消耗服务的代码。

例如,如果服务本身是使用WCF构建的,并且其中的某些方法参数的类型为System.Guid,则在禁用“复用类型”选项的情况下,它们将转换为生成的客户端中的字符串。

我更喜欢禁用重用类型的另一种方法是从专门为此目的创建的类库项目中添加服务引用。要记住的一件事是将所有与服务相关的配置从类库的app.config复制到启动项目的配置文件中。

如果本地程序集中定义的类型需要在服务客户端中重用,则仅需要从上述类库项目及其所有依赖项中引用这些程序集。


奇怪的。我将绑定从HttpBinding更改为NetNamedPipeBinding(还添加了一个mex端点),并将其封装到客户端程序集A中。我创建了一个新类库B,该库引用了WCF服务。然后我添加了B作为对A的引用,魔术般地一切正常。很奇怪。感谢您的解决方案
香茅油


1

由于该问题是由于WSDL中的错误所致,因此很难猜测这个问题,而如果不检查WSDL,我将无可奉告。因此,如果您可以共享WSDL,请这样做。

我只能说WSDL中似乎缺少一个架构(目标命名空间为“ http://service.ebms.edi.cecid.hku.hk/”)。当包含指令被忽略时,我了解问题以及对架构的不同处理。

通常,我发现Microsoft的Web服务实现非常好,因此我认为Web服务正在发送回避的WSDL。


感谢Aliostad,下班后,我将尝试共享WSDL。
jheppinstall

0

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

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

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

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


0

如上所述,可能有几个不同的问题。我们发现,已为WCF库的.DLL添加了对客户端项目的引用。反过来,这在解决对象方面产生了问题,因此导致文件被代码生成步骤“清空”。取消使用“ Reuse Types ...”的使用似乎是一个答案,但它会在新的名称空间中创建对象类型的额外定义,这些对象类型是真实类型的代理,从而导致各种“兼容性”问题。这些类型的使用。仅当您确实要“隐藏”类型时,才应选中此选项。

当您不希望“ DLL”类型依赖项“泄漏”到试图与另一个项目隔离的项目中时,隐藏类型将是适当的。如果WCF库项目的DLL渗入到客户端项目引用中,则由于类型定义也包含在DLL中,您将遇到各种奇怪的副作用的问题。


0

面对同样的问题,可以通过在管理模式下运行Visual Studio来解决


0

在VS2015 Professional中升级VS2010 WCF + Silverlight解决方案时遇到了此问题。除了自动从Silverlight 4升级到Silverlight 5之外,还更改了服务引用重用复选框的值,并且生成失败。


0

发生此错误时,“重用类型”并不总是问题。

当添加对旧服务的引用时,请单击“高级”,然后单击“添加Web引用”。现在链接到您的wsdl,一切都应该正常工作。


0

如果您想在不取消选中组件重用复选框的情况下更正此问题,那么这对我有用:

  • 删除要重用的引用程序集
  • 删除项目的所有bin文件夹
  • 更新服务参考
    • 保留“在指定的引用程序集中重用类型”
  • 再次添加对程序集的引用以更正错误
  • 再次更新服务参考

0

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


-1

尝试更新我的服务引用时出现了这个问题(虽然仅在添加服务引用时才会显示该错误),但不想删除程序集重用复选框。

对我有用的是:

  • 删除要重用的引用程序集
  • 更新服务参考
  • 保留“在指定的引用程序集中重用类型”
  • 忽略错误,这是因为缺少参考!
  • 再次添加对程序集的引用以更正错误
  • 再次更新服务参考

瞧,现在它实际上已更新,不再尝试删除我所有生成的代码。

我几乎准备放弃重用类型功能...

编辑:还请确保生成配置为AnyCPU或x86,因为svcutil与x64相互冲突。

对下降投票者:对不起,如果它对您不起作用,我什至不知道为什么它对我有用,但确实如此。那个时候我可能做了其他事情来解决了这个问题,但是现在还不知道。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.