【问题标题】:Service Reference Error: Failed to generate code for the service reference服务引用错误:无法为服务引用生成代码
【发布时间】:2011-04-28 00:19:24
【问题描述】:

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

任何想法将不胜感激。

谢谢

【问题讨论】:

    标签: c# .net visual-studio-2010 web-services service-reference


    【解决方案1】:

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

    Check this for details

    【讨论】:

    • 另外,当实际需要“在引用的程序集中重用类型”时,您可以从专门为此目的创建的类库项目中添加服务引用。查看我的reply 了解更多信息。
    • 我想要一个不取消选中“重用类型”的解决方案,我设法找到了一个可行的解决方案,请参阅my answer here
    • 不要做这样的事情,而是使用 WCF 客户端依赖的程序集,而不是盲目地使用所有引用的程序集,这可能比取消选中有问题的复选框更棘手且更耗时,但我发现此解决方案比标记为答案的解决方案更合适。
    • 还要确保您的项目不是只读的..这是我的问题..
    【解决方案2】:

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

    然后取消选中Reuse types in referenced assemblies

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

    【讨论】:

    • 如果我需要重用引用的程序集怎么办?我有一个项目,并且该复选框已选中。更新在我的机器上有效,但在同事的机器上却没有……任何线索?
    • 这发生在我的项目从 v4.6.1 升级到 v4.7 时。这解决了它。
    【解决方案3】:

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

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

    在服务配置中启用“在引用的程序集中重用类型”时,服务生成器可能会检查所有引用的程序集以获取可以重用的类型列表。一个被引用的程序集正在引用另一个不可用的程序集这一事实可能会导致生成器失败。

    从服务配置中取消选中“在引用的程序集中重用类型”将解决上述问题,但它有一个副作用。 重用类型选项的存在是有原因的,并且在某些情况下,它可以避免在使用服务的代码中进行不必要的强制转换。

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

    我更喜欢禁用重用类型的替代方法是添加专门为此目的创建的类库项目中的服务引用。需要注意的一点是,将类库的 app.config 中的所有服务相关配置复制到启动项目的配置文件中。

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

    【讨论】:

    • 很奇怪。我将绑定从 HttpBinding 更改为 NetNamedPipeBinding(还添加了一个 mex 端点)并在我的客户端程序集 A 中进行了匹配。我创建了一个新的类库 B,它引用了我的 WCF 服务。然后我添加了 B 作为对 A 的引用,神奇地一切都恢复了。很奇怪。感谢您的解决方案
    【解决方案4】:

    http://uliasz.com/2011/06/wcf-custom-tool-error-failed-to-generate-code-for-the-service-reference/#comment-1647

    感谢上面的文章。

    就我而言,我在 VS.Net 2008 中的 WPF 项目遇到了这个问题。阅读本文后,我意识到 Web 服务中使用的程序集是客户端使用的不同版本的程序集。

    在客户端更新程序集后它工作正常。

    【讨论】:

      【解决方案5】:

      很难猜出这个问题,因为它是由于 WSDL 中的错误造成的,如果没有检查 WSDL,我无法发表更多评论。因此,如果您可以共享您的 WSDL,请这样做。

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

      总的来说,我发现 Microsoft 的 Web 服务实现非常好,所以我认为 Web 服务正在发回不可靠的 WSDL。

      【讨论】:

      • 感谢 Aliostad,我下班后会尝试分享 WSDL。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

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

        更新服务引用后,请务必重新添加。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            面临同样的问题,通过在管理员模式下运行 Visual Studio 解决

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                  【解决方案12】:

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

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

                  【讨论】:

                    【解决方案13】:

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

                    对我有用的是:

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

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

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

                    编辑:还要确保构建配置是 AnyCPU 或 x86,因为 svcutil 在 x64 上存在问题。

                    致反对者:对不起,如果它对你不起作用,我什至不知道为什么它对我起作用,但它确实起作用了。那时我可能已经做了其他事情来解决问题,但现在无法知道。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-08-28
                      • 2011-03-21
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-04-13
                      相关资源
                      最近更新 更多