【问题标题】:WCF: how to generate a single WSDL document, without WSDL:import?WCF:如何在没有 WSDL:import 的情况下生成单个 WSDL 文档?
【发布时间】:2009-06-12 06:53:52
【问题描述】:

我遇到了一个问题... 我正在尝试找到一种从我的 WCF 服务生成单个 wsdl 文档的方法,即没有任何指向外部文档的链接。 我使用FlatWsdl 删除了所有 xsd:import 链接,但我生成的 wsdl 仍然包含通过 wsdl:import 声明指向外部 wsdl 文档的链接:

<wsdl:import namespace="http://myurl/mynamespace"  
             location="http://myserver/myservice.svc?wsdl=wsdl0"/>  

这个文档实际上包含所有内联的 xsd 模式,所以...有一种方法可以内联这个外部 wsdl 文档,以便拥有一个 wsdl?

非常感谢您提供的任何帮助。

【问题讨论】:

    标签: wcf web-services wsdl namespaces


    【解决方案1】:

    您现在可以在 .net 4.5(测试版)中本地执行此操作。有一个选项(?singleWsdl 而不是?wsdl)用于告诉服务在单个 wsdl 文档中输出所有内容。更多关于新东西的信息在这里:http://msdn.microsoft.com/en-us/library/dd456789(v=vs.110).aspx

    【讨论】:

      【解决方案2】:

      (编辑:删除了有关 FlatWSDL 的先前答案,因为正如您指出的那样,它是关于消除 xsd:import 而不是 wsdl:import。)

      看看这篇博文:Control generated WSDL in WCF

      "...总是为一个目标命名空间 URI 生成一个 WSDL ..."

      ServiceContract、DataContract、ServiceBehavior 等是否有不同的命名空间?

      【讨论】:

      • 您还可以使用标准服务主机工厂将此作为行为添加到服务中 - 请参阅我的链接。
      • 我用过FlatWsdl,但是这个扁平化只有xsd:import而不是wsdl:import......也许我犯了一个错误,但是看看代码只有XSD被改变了:(跨度>
      • 那个链接失效了,这里是通过waybackmachine:web.archive.org/web/20100723044037/http://…
      • 以上链接解释了根本原因,解决此问题的最简单方法是使用 ?singlewsdl。
      【解决方案3】:

      您还可以使用具有扩展名的 WCFExtras 项目来创建单个 WSDL 文件。

      WCFExtras

      有用的 WCF 扩展集合 包括 Soap Header 支持、WSDL 文档等。

      WCF 平台具有很强的可扩展性 并允许您轻松添加功能 不是核心产品的一部分。 这个项目包含一些扩展 我需要一个基于 WCF 的项目:

      • WCF 添加 WSDL 的 SOAP 标头支持
      • 来自源代码 XML 注释的文档
      • 覆盖 SOAP 地址位置 URL
      • 单个 WSDL 文件可更好地与旧 SOAP 工具兼容。

      http://wcfextras.codeplex.com/

      【讨论】:

      • 我查看了 WCFExtras,但根据我的调查(也许我错了),“单个 WSDL 文件”功能内联 XSD 而不是外部 WSDL ......也许我的问题在这里: “...总是为一个目标命名空间 URI 生成一个 WSDL ...”如 Vizu 建议的那样
      【解决方案4】:

      我的问题是在 tempuri.org 命名空间中的端点定义中 将 bindingNamespace 添加到端点声明可以解决我的问题。 感谢大家的帮助:)

      【讨论】:

        【解决方案5】:

        这是一个迟到的答案,但我们的一些 WCF 服务也遇到了同样的问题。如果您使用的是 .NET 4.5,就像之前的答案一样,请使用 ?singleWSDL,但如果您的目标不是 .NET 4.5,那么我将以下内容添加到我的 web.config 以解决问题...

        <useRequestHeadersForMetadataAddress>
          <defaultPorts>
            <add port="80" scheme="http" />
            <add port="443" scheme="https" />
          </defaultPorts>
        </useRequestHeadersForMetadataAddress>
        

        这体现在你的行为中。这样我就不必扁平化 WSDL,因为所有引用都指向 MyURL 而不是 MyServer。

        希望这可以帮助其他有类似问题的人。

        【讨论】:

          【解决方案6】:

          除了上面 Jim 的回答,如果你使用 C# 代码直接配置 WCF ServiceHost:

          using System.ServiceModel.Configuration;
          

          在设置您的 ServiceHost 时:

          UseRequestHeadersForMetadataAddressBehavior urh = new UseRequestHeadersForMetadataAddressBehavior();
          serviceHost.Description.Behaviors.Add(urh);
          

          我很难在网上找到这些信息,就这么简单。希望能帮助遇到类似情况的人。

          【讨论】:

            猜你喜欢
            • 2010-09-14
            • 2011-06-04
            • 1970-01-01
            • 2011-01-22
            • 1970-01-01
            • 2016-04-20
            • 2015-01-04
            • 2010-09-24
            • 2014-01-23
            相关资源
            最近更新 更多